Бесплатное автономное геокодирование

У меня есть список из 2000 таких адресов:

Macquarie Park, New South Wales
Kitami, Hokkaido
Hachioji, Tokyo
Pokemon Inc. Asahi Bldg. 7F 3-2-6 Asakusabashi Taito-ku, Tokyo 111-0053 Japan
東京都港区

И я хочу отобразить их на карте без пересылки этих адресов через интернет .

Геокодирование адресов:

  • Точность на уровне города в порядке.
  • Некоторые адреса (например, 4-й выше) содержат много деталей, их можно пропустить, но алгоритму может быть сложно найти то, что можно безопасно пропустить.
  • Многие адреса не имеют названия страны. Обратите внимание, что Google Maps находит их без проблем, поэтому я думаю, что двусмысленности обычно нет.
  • Места по всему миру.
  • В некоторых адресах используется нелатинская письменность. Бонус за их геокодирование тоже.

Выходной формат:

  • .osm// вывод файла в порядке .obf..kml
  • Необработанный вывод широты/долготы тоже в порядке.
  • Если программа настаивает на отображении результатов в виде карты, это тоже нормально. Мне не нужны очень подробные карты, достаточно карты, где видны названия городов с населением более 100 000 жителей.

Требования:

  • Работает на моем локальном компьютере (я могу установить любую ОС).
  • Легко установить, не загружая гигабайты данных.
  • Свободно.
Требование не скачивать гигабайты данных противоречит требованию «офлайн». Либо одно, либо другое.
@DeerHunter: К сожалению, вопрос, на который вы ссылаетесь, касается только США.
@DeerHunter: мне нужна только точность на уровне города. База данных, содержащая координаты всех городов с населением более 100 000 человек и выражения для сопоставления их адресов, вероятно, уместилась бы в 100 МБ. Этого будет достаточно.

Ответы (1)

Это стало возможным благодаря OpenStreetMap API , лицензированному под ODbL .

Я не использовал его какое-то время, но в основном вы определяете прямоугольник ( bbox, ограничивающий прямоугольник) из двух точек (S, N, W и E). Поскольку максимальная площадь ограничивающей рамки ограничена, вам нужно будет повторить запрос для небольших частей мира (где обычно подходят области размером с Германию).

Затем вы определяете условия того, что вы хотите получить. Для городов place=cityбыло бы такое условие. К сожалению, классификация городов может зависеть от страны, поэтому вам нужно прочитать документацию и выяснить это.

Пример API-запроса для городов Германии (примерно, так как прямоугольный):

http://www.overpass-api.de/api/xapi?node[bbox=5.87,47.27,15.04,55.12][place=city]

Результат довольно мал (155 КБ) и содержит актуальную информацию:

<node id="17193023" lat="49.5981208" lon="11.0036532">
    <tag k="ele" v="279"/>
    <tag k="is_in" v="Mittelfranken,Bayern,Bundesrepublik Deutschland,Europe"/>
    <tag k="is_in:country" v="Germany"/>
    <tag k="is_in:country_code" v="DE"/>
    ...
    <tag k="name" v="Erlangen"/>
    <tag k="name:ta" v="எர்லங்கன்"/>
    ...
    <tag k="place" v="city"/>
    <tag k="population" v="105624"/>
    ...
</node>

Это ответ, потому что:

  • доступна точность на уровне города (как описано выше)
  • алгоритм поиска городов может быть определен вами (однако необходимы некоторые знания программирования)
  • ваш алгоритм может обрабатывать неоднозначности
  • во всем мире: данные OSM действительно хороши
  • поддерживаются нелатинские названия городов, см. пример выше дляname:ta
  • он обеспечивает необработанный вывод долготы/широты (см. lonи lat)
  • работает на вашем компьютере (вы можете использовать любой язык программирования, который может загружать данные через HTTP)
  • легко установить: без установки, это веб-сервис
  • без загрузки гигабайт данных: небольшой объем данных, см. пример выше
  • бесплатно: ODbL

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