【问题标题】:Google Reverse-Geocode - Get ZIP codeGoogle Reverse-Geocode - 获取邮政编码
【发布时间】:2011-01-14 03:23:02
【问题描述】:

这是我目前关于如何获取不同组件的代码。

function getGeocodeFull($address)
{
    if (empty($address)) return false;

    $_geocode = false; 

    if (($_geocode = $this->getCache($address)) === false) // check if address is has a cache
    {
        if (($results = $this->geoGetCoordsFull($address)) !== false) 
        {
            // sloooooooooopppy.. yes these can all be combined, i know.
            if (!isset($results->results[0]->geometry->location->lat))  return false;
            if (!isset($results->results[0]->geometry->location->lat))  return false;
            if (!isset($results->results[0]->formatted_address))        return false;
            if (!isset($results->results[0]->address_components))       return false;

            $_geocode['lat']     = $results->results[0]->geometry->location->lat;
            $_geocode['lon']     = $results->results[0]->geometry->location->lng;
            $_geocode['address'] = $results->results[0]->formatted_address;

            foreach ($results->results[0]->address_components as $component)
            {
                if (isset($component->types))
                {
                    foreach ($component->types as $type)
                    {
                        switch ($type)
                        {
                            case 'route':
                                $_geocode['street'] = $component->long_name;
                                break;
                            case 'locality':
                                $_geocode['city'] = $component->long_name;
                                break;
                            case 'administrative_area_level_2':
                                $_geocode['county'] = $component->long_name;
                                break;
                            case 'administrative_area_level_3':
                                $_geocode['area'] = $component->long_name;
                                break;
                            case 'postal_code':
                                $_geocode['zip'] = $component->short_name;
                                break;
                        }     
                    }
                }    
            }

            $this->putCacheFull($address, $_geocode['lat'], $_geocode['lon'], $_geocode['address'], $_geocode['street'], $_geocode['city'], $_geocode['county'], $_geocode['area'], $_geocode['zip']);
        }
    }

    return $_geocode;
}

geoGetCoordsFull() 只需在 google map api 地理编码页面上使用 file_get_contents,然后解码结果然后返回。

我不太喜欢它的外观。似乎它可能非常不一致。是否有任何其他更好的解决方案可以从 google 或任何其他服务获取所有数据?

我更喜欢不限制请求的其他服务(或者使用多个地理编码服务,如 bing/yahoo/etc 是非法的)?? (抱歉抛出另一个问题)

无论如何,非常感谢您的帮助!

【问题讨论】:

    标签: php google-maps google-maps-api-3 google-maps-api-2


    【解决方案1】:

    我采用了另一种方式,为了简洁起见,我删除了一些代码,但基本上我有一张包含大约 16,000 个位置(澳大利亚的所有位置)的表格,并遍历它们以在 Google 地图上找到它们,检索经纬度信息并存储回表中,这样就不必再次查找了

    $row 包含我正在查找的位置的一系列详细信息,例如地址、邮政编码、郊区和州

    您还需要从 Google 地图获取此代码的 API 密钥,因为它使用 v2.1 版本。我认为您不再需要 v3 了

    define("MAPS_HOST", "maps.google.com");
    define("KEY", "YOU_KEY_HERE");
    
    // Initialize delay in geocode speed
    $delay = 0;
    $lat = '';
    $lng = '';
    $base_url = "http://" . MAPS_HOST . "/maps/geo?output=xml" . "&key=" . KEY;
    
      $geocode_pending = true;
      while ($geocode_pending) {
    
        flush();
    
        $address = $row['suburb'] . ' ' . $row['postcode'] . ', ' . $row['state'] . ' Australia';
        $request_url = $base_url . "&q=" . urlencode($address);
        $xml = simplexml_load_file($request_url) or die("url not loading");
    
        $status = $xml->Response->Status->code;
        if (strcmp($status, "200") == 0) {
          // Successful geocode
          $geocode_pending = false;
          $coordinates = $xml->Response->Placemark->Point->coordinates;
          $coordinatesSplit = split(",", $coordinates);
    
          // Format: Longitude, Latitude, Altitude
          $lat = $coordinatesSplit[1];
          $lng = $coordinatesSplit[0];
    
        } else if (strcmp($status, "620") == 0) {
          // sent geocodes too fast, have a breather and try again soon
          echo("Google says no... increase the delay to ".($delay/1000000)." seconds<br />\n");
          $delay += 100000;
        } else {
          // failure to geocode
          $geocode_pending = false;
          echo "Address " . $address . " failed to be geocoded. ";
          echo "Received status " . $status . "<br />
    \n";
        }
        usleep($delay);
      }
      echo("Lat long found for " . $address . "<br />\n");
      echo("Lat: " . $lat . "<br />\n");
      echo("Long: " . $lng . "<br />\n");
    

    【讨论】:

    • 谢谢,但我可以使用 V3 从地址轻松获取纬度/经度。唯一的事情就是除了纬度/经度之外的所有东西......(也就是地区的类型......等等)
    • 我知道这有点老了,但为了节省一些时间/麻烦那些发现它的人,请注意谷歌当前的服务条款(注意:Geocoding API 只能与Google 地图;禁止在未在地图上显示的情况下对结果进行地理编码。)developers.google.com/maps/documentation/geocoding
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    相关资源
    最近更新 更多