Как элементарно пользоваться геопространственными функциями с Overpass API и пара слов о addr:country, addr:city
Posted by d1g on 21 August 2014 in Russian (Русский).Теги “addr:country”=* и “addr:city”=* внутри указанного полигоном города это атавизм. Они реально не нужны и информации в себе не несут. Реально они нужны только для объектов которые находятся вне границ населённых пунктов. Т.е. вне полигона, в таком случае они действительно нужны, ибо официальную границу нельзя просто так взять и “перетянуть” на один дом или посёлок. Либо наоборот, когда внутри города есть объекты которые причастны к другому городу по какой-то причине.
В OSM катастрофически боятся (не умеют) пространственными запросами к БД. Это вводится почти в культ:
- почему мы отмечаем addr:country и addr:city
- да потому что все так делают
(типичный диалог пользователей OSM на любом языке за последние N лет)
Одним из доводов указывальщиков “addr:country” и “addr:city” это “потом просто выбирать любые объекты без нужды в гео-пространственных функций”. Возникает вопрос: зачем тогда в OSM есть PostGIS и OverpassAPI (для пользователей)? Зачем все эти заморочки с GPS? Писали бы себе преспокойно в OSM.txt и ничего не нужно было себе усложнять?!!
Выбирать любые объекты внутри именованных закрытых путей и мультиполигонов через OverpassAPI это просто элементарно. В Overpass IDE (http://overpass-turbo.eu/) для запросов сгенерированных помощником достаточно поменять
<bbox-query {{bbox}}/> на
<area-query ref="XXXXXXXX"/>
Где XXXXXXXX это OSM идентификатор закрытого пути (way) либо мультиполигон плюс константа. Для мультиполигонов нужно прибавить 3600000000. Для закрытых путей 2400000000. area-query ref работает не для всех объектов (детали здесь), а для тех, у которых есть name=*. В случае городов это всегда-превсегда так, т.е. боятся нечего и отговорок быть не может.
Вот так выглядит запрос для поиска всех действующих фонтанов в Саратове (отношение мультиполигон 3955288). Попробовать можно здесь.
<osm-script output="xml" timeout="25">
<union>
<query type="node">
<has-kv k="amenity" v="fountain"/>
<area-query ref="3603955288"/>
</query>
<query type="way">
<has-kv k="amenity" v="fountain"/>
<area-query ref="3603955288"/>
</query>
<query type="relation">
<has-kv k="amenity" v="fountain"/>
<area-query ref="3603955288"/>
</query>
</union>
<print mode="meta"/>
<recurse type="down"/>
<print mode="meta" order="quadtile"/>
</osm-script>
На самом деле всё еще проще: вам нужно указать в помощнике http://overpass-turbo.eu/
amenity=fountain in "Саратов"
Всё.
Discussion