Я подключаюсь к API Карт Google с PHP для геокодирования некоторых отправных точек для приложения локатора станции аренды.
Эти исходные точки не обязательно должны быть точными адресами; названий городов достаточно. В качестве отправной точки используются ответы на геокодирование с accuracy
равной или большей, чем 4 (город / местность), и поиск окружающих станций проката.
Заявка должна работать в Германии. Когда местное имя неоднозначно (т. Е. Есть более одного места этого имени), я хочу отобразить список возможностей.
Это вообще не проблема: если вы делаете неоднозначный поиск, XML-выход Google возвращает список элементов <PlaceMark>
а не только один.
Очевидно, мне нужно смещать геокодирование в сторону Германии, поэтому, если кто-то вводит почтовый индекс или название местности, которая существует и в других странах, то только хиты в Германии действительно появляются.
Я думал, что смогу добиться этого, добавив , de
или , Deutschland
в поисковый запрос. Это работает в основном прекрасно, но в некоторых случаях производит странные и невыносимые результаты.
Есть, например, 27 населенных пунктов в Германии под названием Neustadt
. ( Википедия )
Когда я ищу Neustadt
одиночку:
http://maps.google.com/maps/geo/hl=de&output=xml&key=xyz&q=Neustadt
Я получаю по меньшей мере шесть из них, с которыми я мог бы жить (может быть, другие не включены, или части другой местности или что-то еще).
Когда, однако, я ищу Neustadt, de
или Neustadt, Deutschland
или Neustadt, Germany
, я получаю только одно из двадцати семи местностей, без всякой видимой причины – это не самый большой и не самый точный , а также не имеет каких-либо других уникальных характеристик.
Кто-нибудь знает, почему это так, и что я могу с этим поделать?
Я попробовал параметр region
но безрезультатно – когда я не использую , de
, почтовые индексы (например, 50825
будут разрешены их американским коллегам, а не немецким.
Моя нынешняя обходная идея заключается в том, чтобы добавить название страны, когда ввод только числовой, и в противном случае отфильтровать только результаты в нем, но это звучит ужасно клоччо. Кто-нибудь знает лучший способ?
Это, безусловно, не исчерпывающий ответ, а всего лишь несколько примечаний:
Вы используете старую версию API геокодирования V2 , которую недавно отвергли Google в пользу нового V3 API . Google предлагает использовать новую услугу с этого момента, и, хотя у меня нет реального опыта работы с новой версией, кажется, что они улучшили сервис в разных точках, особенно со структурой ответа. Вам не нужен ключ API для использования новой службы, и вам просто нужно использовать несколько другой URL-адрес:
http://maps.google.com/maps/api/geocode/xml?address=Neustadt&sensor=false
Вы упомянули, что вы фильтруете для меток их свойство точности. Обратите внимание, что это поле больше не отображается в результатах нового API геокодирования, но в любом случае я думаю, что он по-прежнему не очень надежный в старом API.
Вы можете попытаться использовать параметры bounds
и region
нового API, но я все же сомневаюсь, что они разрешат вашу проблему.
Я считаю, что Google Geocoder – отличный инструмент, когда вы даете ему полный адрес, по крайней мере, в формате «улица, местность, страна», и он также очень надежен в других форматах, когда ему не приходится иметь дело с каким-либо неоднозначности (геокодирование «Лондон, Великобритания» всегда работало на меня).
Однако в вашем случае я бы предпочел предварительно вычислить все координаты каждой немецкой местности и просто обработать геокодирование самостоятельно из вашей базы данных. Я думаю, что это вполне осуществимо, потому что ваше приложение локализовано только для одной страны. Кажется, что каждый город в Википедии «Список немецких городов» имеет координаты, хранящиеся в аккуратном маленьком <span>
который выглядит очень легко разобрать:
<span class="geo">47.84556; 8.85167</span>
В этом списке насчитывается шестнадцать Neustadts, что может быть лучше, чем шесть Google. 🙂
найденный автозаполнение google работает лучше, чем их геокод
http://code.google.com/apis/maps/documentation/javascript/places.html#places_autocomplete
Нашел этот вопрос, ища эту точную проблему. Тогда реализованный API Bing Maps работает намного лучше. Тем не менее, у него есть свои причуды. Например, если вы передадите код аэропорта, это покажет вам 6 различных решений, каждый из которых соответствует каждому терминалу аэропорта.