Google Reverse-Geocode - Получить почтовый индекс

Вот мой текущий код того, как я получаю разные компоненты.

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() просто использует file_get_contents на странице геокодирования API карты Google, затем декодирует результаты и возвращает их.

Я не слишком большой поклонник того, как это выглядит. Кажется, что это может быть очень непоследовательным. Есть ли другие ЛУЧШИЕ решения для получения всех данных из Google или любого другого сервиса?

Я бы предпочел другой сервис, который не ограничивает запросы (или использование нескольких сервисов геокодирования, таких как bing/yahoo/и т. д., является незаконным) ?? (извините, что задал еще один вопрос)

В любом случае, большая помощь будет очень признательна!


person Jordan    schedule 14.01.2011    source источник


Ответы (1)


Я пошел другим путем, я удалил немного кода для краткости, но в основном у меня была таблица с примерно 16 000 местоположений (все местоположения в Австралии), и я просмотрел их все, чтобы найти их на Картах Google, получить lat long info и сохранить обратно в таблицу, чтобы ее больше никогда не приходилось искать

$row содержит массив сведений о местоположении, которое я ищу, например, адрес, почтовый индекс, пригород и штат.

Вам также потребуется получить ключ API от Google Maps для этого кода, так как он использует 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");
person duellsy    schedule 14.01.2011
comment
Спасибо, но я могу легко получить широту/долготу из адресов, используя V3. Единственное, все остальное, кроме широты/долготы... (иначе типы областей... и т.д.) - person Jordan; 14.01.2011
comment
Я знаю, что это немного устарело, но чтобы сэкономить время/проблемы тем, кто найдет это, ознакомьтесь с текущими условиями обслуживания Google (Примечание: API геокодирования можно использовать только в сочетании с картой Google; результаты геокодирования без отображения их на карте запрещено.) developers.google.com/maps/documentation/geocoding - person puddleglum; 11.10.2012