OpenStreetMap

Теги “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 "Саратов"

И он сам найдёт первый самый подходящий результат через Nominatim и будет использовать его в качестве area-query.

Всё.

Discussion

Log in to leave a comment