API “Поиск на расстоянии” для OpenStreetMap [закрыт]

StackOverflow https://stackoverflow.com/questions/1384397

  •  21-09-2019
  •  | 
  •  

Вопрос

Существует ли какой-либо API для OpenStreetMap, который позволяет мне получить список POI на определенном расстоянии (например10 миль) от контрольного местоположения?

Это было полезно?

Решение

ДА.В API Overpass есть функция "Вокруг", которая делает именно это (поиск элементов в радиусе от заданной точки).Вы можете объединить это с другими требованиями (например, для получения списка определенного типа элементов).:

http://wiki.openstreetmap.org/wiki/Overpass_API#Around

Например, используя OverPass Turbo Api (Перечислите все города рядом с "Мансанаресом, Испания" с указанием широты и долготы с радиусом 150 км, попробуйте это вживую!):

<osm-script output="json" timeout="25">
  <id-query {{nominatimArea:Spain}} into="area"/>
  <query type="node">
    <has-kv k="place" modv="" v="town"/>
  <around lat="38.996507" lon="-3.371946" radius="150000"/>
</query>

  <print e="" from="_" geometry="skeleton" limit="" mode="body" n="" order="id" s="" w=""/>
</osm-script>

Другие советы

Насколько я знаю, API не поддерживает это напрямую.Самый простой подход заключается в том, чтобы выберите (квази-)прямоугольную ограничивающую рамку в который вписывается ваш круг, и используйте это для извлечения ваших POI.Затем вы можете рассчитать расстояние до каждой интересующей точки и отбросить те, которые превышают ваш радиус.Это удалит небольшую часть POI, которые находятся близко к углам поля и поэтому не входят в ваш круг.Вы хотите сделать это в таком порядке, чтобы вам нужно было вычислять расстояние только для относительно небольшого числа целевых местоположений.

Не забывайте, что ограничивающая рамка определяется широтными / длинными углами, поэтому она не является по-настоящему прямоугольной.Линии долготы сходятся на полюсах, поэтому верхняя часть вашего прямоугольника имеет разную ширину с нижней.Насколько это влияет на вас, зависит от того, насколько близко вы находитесь к полюсу (градус длины ~= (40000км / 360) * cos (широта)).

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

Вот документация:http://developers.cloudmade.com/wiki/geocoding-http-api/Documentation

Вот пример того, что вам нужно - HTML, JSON.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top