Как с помощью некоторых веб-сервисов проверить, принадлежит ли геоточка определенному городу?

Данный:

  • Город
  • Геоточка

Вопрос: определить, принадлежит ли данная геоточка городу.

Мое текущее решение тривиально:

  1. Выполните обратное геокодирование (я использую пакет python googlemaps). Это дает словарь результатов.
  2. Изучите результаты ['Placemark'] [0] ['AddressDetails'] в поисках ключевого слова LocalityName.
  3. Данная географическая точка считается внутри города, если найденное LocalityName совпадает с названием города.

Все идет нормально. Даже если это не лучший алгоритм, он, безусловно, самый простой. Однако есть проблемы. Возьмем, к примеру:

  • Абердин, Великобритания.
  • широта = 57,14369, lng = -2,22314

GoogleMaps.reverse_geocode(57.14369, -2.22314) дает следующий результат:

{ u'Placemark': [ { u'AddressDetails': { u'Accuracy': 6,
                                         u'Country': { u'CountryName': u'UK',
                                                       u'CountryNameCode': u'GB',
                                                       u'Thoroughfare': { u'ThoroughfareName': u'A944'}}},
                    u'ExtendedData': { u'LatLonBox': { u'east': -2.2200414,
                                                       u'north': 57.1480762,
                                                       u'south': 57.1453783,
                                                       u'west': -2.2239393}},
                    u'Point': { u'coordinates': [-2.221984, 57.1467683, 0]},
                    u'address': u'A944, Aberdeen, Aberdeen City AB15, UK',
                    u'id': u'p1'}],
  u'_id': 7635459717214061L,
  u'loc': [-2.2231, 57.1437]}

Проблема в том, что форматированный адрес (A944, Aberdeen, Aberdeen City AB15, UK) не разбит на детали - возвращенный AddressDetails по сути бесполезен.

Итак, похоже, что нужно разобрать возвращенный address вручную, что в общем случае кажется настоящим PITA.

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

Спасибо.


person mark    schedule 24.04.2012    source источник


Ответы (1)


веб-сервис обратного геокодирования для http://maps.googleapis.com/maps/api/geocode/json?latlng=57.14369,-2.22314&sensor=false

дает гораздо больше данных, чем вы отправили из пакета Python, включая

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "A944",
               "short_name" : "A944",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Aberdeen City",
               "short_name" : "Aberdeen City",
               "types" : [ "administrative_area_level_2", "political" ]
            },
...

что, кажется, отвечает всем требованиям. Получается «Абердин-Сити».

person Andrew Leach    schedule 24.04.2012
comment
Ну, это не я придумал. Это то, что возвращает пакет python googlemaps. И не изобретает. Я могу прикрепить соответствующий HTTP-запрос и ответ. Я постараюсь использовать конечную точку json в соответствии с вашим предложением. - person mark; 24.04.2012
comment
@mark: Я не имел в виду, что вы просто изобрели его, скорее, пакет Python не вернул все, что вы могли получить с помощью веб-сервиса. Извините: я должен был пояснить это. - person Andrew Leach; 24.04.2012
comment
Пакет python возвращает все, что получает в ответ - я это уже проверил. Никакая информация не разглашается. Я думаю, что есть две конечные точки для службы, а Googlemaps на Python использует старую. - person mark; 24.04.2012