разобрать гугл геокод - PullRequest
       13

разобрать гугл геокод

2 голосов
/ 25 октября 2009

Я использую API геокодирования Google в своем приложении, но мне трудно надежно проанализировать возвращенный адрес. Я надеюсь, что у кого-то есть библиотека или способ разбора информации, чтобы мне не пришлось писать это самому и освещать каждый случай.

Я использую json api и могу легко извлечь адресную строку и координаты и сохраните их в базе данных, но проблема заключается в надежном извлечении другой адресной информации, чтобы я мог ее сохранить.

Я ознакомился со спецификацией структурированных адресов XAL, которую Google использует для геокодированных данных, но моя проблема в том, что она может обслуживать каждый тип адреса в каждой стране, затрудняет анализ результата.

Что-то простое, например, почтовый индекс, может быть вложено довольно глубоко в любую комбинацию родительских тегов. даже внутри одной страны вид дерева может варьироваться, что затрудняет его анализ, чем ожидалось.

По иронии судьбы, моя конечная цель - сохранить его в дереве (например, rails acts_as_tree или аналогичный) в моей базе данных, чтобы пользователи могли легко найти элементы позже. например, нажмите на страну, штат, затем регион, город, затем пригород и т. д.

Я работаю в рельсах

Ответы [ 2 ]

2 голосов
/ 25 октября 2009

Существует гем и плагин, который инкапсулирует все это для вас. Это называется GeoKit .

Можно заставить его использовать Google или несколько других поставщиков услуг геокодирования. Если в ваших моделях есть подходящие поля, он также может выполнять расчеты расстояний (по-настоящему изящная математика для этого делается в SQL).

Я давно использую его в одном из своих производственных приложений, например, для расчета расстояний между почтовыми индексами. Как я уже упоминал, я уже давно использую его в производстве, поэтому у меня нет никаких сомнений по поводу надежности кода.

1 голос
/ 25 октября 2009

Я делал это пару раз. Их (Google) пример кода работает, но хрупок, а данные геокодирования, которые вы получаете от Google, в лучшем случае неполные, а в худшем - непоследовательные.

В любом случае. Все геокодеры отстойные, но, по крайней мере, Google бесплатен и отстой меньше, чем другие ... это слишком много, чтобы просить последовательности? Вздох. Попробуйте следующее; вы передаете ему метку (обратите внимание, что метод getLocations AJAX может возвращать несколько), и он нормализует результат. Если вы хотите выглядеть модно, используйте поле placemark.address - иногда оно будет содержать больше информации, чем отдельные поля. Обычно он содержит только тот текст, который вы действительно отправили для геокодирования.

function Mark(placemark) {
  this.latitude = 0.0;
  this.longitude = 0.0;
  this.accuracy = 0;
  this.country = null;
  this.region = null;
  this.city = null;
  this.postalCode = null;
  this.street = null;
  this.address = null;
  this.placemark = placemark;

  if (placemark) {
    if (placemark.Point && placemark.Point.coordinates) {
      this.latitude = placemark.Point.coordinates[0];
      this.longitude = placemark.Point.coordinates[1];
    }

    var elem = placemark.AddressDetails;

    if (elem) {
      this.accuracy = elem.Accuracy;

      if (elem.Country) {
        elem = elem.Country;
        this.country = elem.CountryNameCode;
      }

      if (elem.AdministrativeArea) {
        elem = elem.AdministrativeArea;
        this.region = elem.AdministrativeAreaName;
      }

      if (elem.SubAdministrativeArea) {
        elem = elem.SubAdministrativeArea;
      }

      if (elem.Locality) {
        elem = elem.Locality;
        this.city = elem.LocalityName;
      }

      if (elem.PostalCode) {
        this.postalCode = elem.PostalCode.PostalCodeNumber;
      }

      if (elem.Thoroughfare) {
        this.street = elem.Thoroughfare.ThoroughfareName;
      }
    }
  }
}
...