0

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

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,然后解码结果然后返回它们。

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

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

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

4

1 回答 1

1

我以另一种方式进行,为简洁起见,我删除了一些代码,但基本上我有一个包含大约 16,000 个位置(澳大利亚的所有位置)的表,并遍历它们以在谷歌地图上找到它们,检索lat long 信息并存储回表中,因此无需再次查找

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

您还需要从 Google 地图获取此代码的 API 密钥,因为它使用 v2。我认为您不再需要 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");
于 2011-01-14T04:26:32.283 回答