Получить город по заданным координатам в Nominatim

Мне нужно получить город по заданным координатам, используя Nominatim. Под городом я подразумеваю соответствующее отношение/узел OSM со всеми его свойствами, а не только название страны (на самом деле меня действительно волнуют osm_id, osm_type, имя и координаты)

EDIT: добавлен контекст

Я запускаю платформу, где пользователи могут прикреплять сообщения к местам. Я использую OSM в качестве основной базы данных, чтобы помочь пользователям находить места. Как только сообщение создано, я ссылаюсь на это место в своей бизнес-базе данных. Я хочу иметь возможность объединять сообщения на уровне города и страны. Итак, я представляю те, у кого есть выделенные таблицы и типичное соотношение: место n-1 город n-1 страна.

В настоящее время я знаю, что могу получить максимальный уровень информации (масштаб = 18) с помощью такого запроса:

http://nominatim.openstreetmap.org/reverse?format=xml&accept-language=fr&lat=43.8338&lon=4.3596&zoom=18&addressdetails=1

которые производят соответствующую информацию, включая название города:

  <reversegeocode timestamp="Thu, 02 Oct 14 15:16:11 +0000" attribution="Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright" querystring="format=xml&accept-language=fr&lat=43.8338&lon=4.3596&zoom=18&addressdetails=1">
    <result place_id="6643770" osm_type="node" osm_id="680342651" lat="43.833464" lon="4.3596107">3, Rue de la République, Écusson, La Placette, Nîmes, Nimes, Gard, Languedoc-Roussillon, France métropolitaine, 30000;30900, France</result>
    <addressparts>
            <house_number>3</house_number>
            <road>Rue de la République</road>
            <neighbourhood>Écusson</neighbourhood>
            <suburb>La Placette</suburb>
            <city>Nîmes</city>
            <county>Nimes</county>
            <state>Languedoc-Roussillon</state>
            <country>France</country>
            <postcode>30000;30900</postcode>
            <country_code>fr</country_code>
    </addressparts>
 </reversegeocode>

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

http://nominatim.openstreetmap.org/search?format=xml&city=N%C3%AEmes&=state=France+m%C3%A9tropolitaine&country=France&limit=1

Каков наилучший способ оптимизировать это?

Поскольку я запускаю свой собственный экземпляр Nominatim, я, вероятно, мог бы выбрать SQL, если это лучший вариант, но мне пришлось бы создать новую конечную точку в Nominatim со всеми сложностями обслуживания...

Мне нужна такая же функциональность для стран. Для стран я понял, что параметр zoom=1 должен работать в любом случае. Жестко, для городов нет надежного аналога.


person g4vroche    schedule 02.10.2014    source источник
comment
Помимо вашей реализации, какова ваша задача / что вы хотите реализовать?   -  person MaM    schedule 04.10.2014
comment
Я запускаю платформу, где пользователи могут прикреплять сообщения к местам. Я использую OSM в качестве основной базы данных, чтобы помочь пользователям находить места. Как только сообщение создано, я ссылаюсь на это место в своей бизнес-базе данных. Я хочу иметь возможность объединять сообщения на уровне города и страны. Итак, я представляю те, у кого есть выделенные таблицы и типичное соотношение: место n-1 город n-1 страна.   -  person g4vroche    schedule 04.10.2014


Ответы (1)


Итак, вы получаете широту/долготу мест через номинатив (обратный геокод). Теперь вы хотите построить иерархию (местоположение -> город/страна), чтобы связать свои посты с выделенным местоположением. На мой взгляд есть 2 пути:

Онлайн:

Я не вижу (в настоящее время) альтернативы вашему подходу :-/ Имейте в виду, что вы пользуетесь добровольными услугами. Вы также можете рассмотреть возможность поиска через Overpass API и небольшое поле вашей долготы/широты.

Еще одна идея — использовать данные Википедии о местах, чтобы вы могли легко анализировать иерархии.

Офлайн:

Помимо отправки запросов API, вы можете настроить собственный рабочий процесс. Например. БД PostGIS с импортированными шейп-файлами границ. Это дает вам полный контроль и не нагружает общедоступные ресурсы. Имейте в виду, что качество/покрытие границ не всегда хорошо в OSM.

Оба подхода могут позволить вам выполнить предварительную обработку, чтобы ваш окончательный запрос мог выполняться в локальном хранилище БД.

P.S. Я не юрист, но похоже, что вы создали смешанную БД, основанную на фундаментальной части материала OSM. Таким образом, возможно, вам потребуется применить ODbL также к вашей БД: https://wiki.openstreetmap.org/wiki/Legal_FAQ

person MaM    schedule 04.10.2014
comment
На самом деле у меня есть локальный экземпляр Nominatim, только мои ссылки на вопросы используют общедоступные конечные точки :). . Предварительная обработка выглядит как теоретически жизнеспособная альтернатива для достижения более быстрого/более легкого запроса, но первоначальный запуск будет длиться вечно... Я надеялся на более реальный, но недокументированный способ достижения этого. Спасибо за указание на юридическую часть, я действительно не планирую выпускать базу данных целиком, хотя она каким-то образом находится в открытом доступе через веб-сайт. Я думал применить лицензию CC, но я рассмотрю это более внимательно/свяжусь с OSM напрямую. - person g4vroche; 05.10.2014
comment
Извините, конечно, можно было бы написать поисковые запросы для сканирования вашей номинальной БД, но схема БД совершенно недокументирована :( wiki.openstreetmap.org/wiki/Nominatim/Development_overview - person MaM; 05.10.2014