Overpass API - примеры запросов

Вопросы, которые у меня скопились, позже, а пока азбука, которую я успел освоить и может кому-то пригодится тоже.

Типичная задача - поработать в JOSM с объектами определенного типа, например place. Обычно для этого просто загружается кусок карты в JOSM и ставится фильтр. Но, во-первых, в JOSM есть ограничение на размер скачиваемой области, во-вторых если частями загрузить целый регион то данных может быть очень много и JOSM безбожно тормозит.

Для таких задач можно использовать OverpassAPI, фильтрация будет проведена ещё на сервере и в JOSM подгрузятся только нужные объекты. Всё что для этого нужно - установить плагин mirrored_download и составить правильный запрос при скачивании данных.
Описание языка запросов Overpass QL

  1. Устанавливаем mirrored_download и перегружаем JOSM: http://wiki.openstreetmap.org/wiki/Overpass_API/Language_Guide#Edit_filtered_data ;
  2. Открываем окно загрузки File → Download from Overpass API…
  3. Выделяем bbox региона. Из приятного - можно игнорировать предупреждение в правом нижнем углу о выделении слишком большой области.
  4. Набираем код на языке запросов QL и кнопку Download
    Пример 1:
[timeout:15];
/* скачать объекты place */
( node[place];
  way[place];>;
  rel[place];>;);
(._;rel(bn););
(._;rel(bw););
(._;rel(br););
out meta;
  1. Результат:

Что произошло: скачались все объекты node, way, relation у которых есть тег place, вместе с входящими в них узлами, а также родительские отношения. Эти данные можно редактировать и заливать обратно в базу, ничего не поломается.

ВАЖНО:

  1. Желательно указывать разумный timeout чтобы не перегружать сервер. Я как-то некорректно составил запрос и ждал около минуты, ничего не происходило. Принудительно прервал и порепетировал на другом bbox. Оказалось я пытался скачать границу России.
  2. Обязательно использовать оператор out meta, а не просто out.

Пример 2:

[timeout:15];
/* скачать административные границы, которые пересекает bbox, кроме геометрии admin_level=2 */
( way[boundary];>;
  rel[boundary][admin_level!=2];>;);
(._;rel(bw););
(._;rel(br););
out meta;

Например bbox выбран на границе стран. В этом случае скачаются границы смежных районов и смежных областей вместе с геометрией и admin_centre; границы стран будут скачаны только как отношения, без геометрии. Можно подгрузить члены отношения вручную в JOSM.

Примеры попроще:

Пример 3:

[timeout:15];
/* скачать только точки с адресами */
node["addr:housenumber"];
out meta;

Пример 4:

[timeout:15];
/* скачать заправки */
node[amenity=fuel];
out meta;

Если кто-то обнаружил ошибки в примерах просьба меня поправить. Также желательно другие примеры, которые могут пригодиться, особенно с попаданием объектов в какую-то область.

(исправлено: орфогр. ошибка)

Вопросы, возникшие у меня по QL:

  1. Как правильно составить запрос “получить все населенные пункты такой-то области” (имеется в виду внутри контура, а не по тегу addr:region). Я пытался скачать нужное мне отношение по известному ID, затем использовать area в разных вариациях. Ничего не получилось.

  2. В описании Query Language работа идет с input set. Вопрос такой - правильно ли я понимаю что после каждой операции этот input set дополняется вновь найденными объектами ? Т.е. операторы срабатывают не как фильтры, а как добавление данных ?

http://overpass-turbo.eu/s/1Rc
http://goo.gl/TwD33
http://overpass-turbo.eu/s/1Rb

Xmypblu
Огромное спасибо !

Модифицированный запрос для JOSM mirrored_download:

[maxsize]
[timeout:120]
;
area
  ["boundary"="administrative"]
  ["name"="Калининградская область"]
->.a;
(
  relation
    (area.a)
    ["place"~"isolated_dwelling|hamlet|village|town|city|suburb"];>;
  way
    (area.a)
    ["place"~"isolated_dwelling|hamlet|village|town|city|suburb"];>;
  node
    (area.a)
    ["place"~"isolated_dwelling|hamlet|village|town|city|suburb"];>;
);
(._;rel(bn););
(._;rel(bw););
(._;rel(br););
out meta qt;

Название области заменить на нужное. Будут загружены только НП, попавшие в bbox при скачивании и геометрически попавшие внутрь полигона нужной нам области.

1 Like

у меня тоже вопрос.
У Котяры на latlon.org был слой (сейчас ссылку не найду), на котором были отмечены населенные пункты, в радиусе 3 км у которых не было дорог, выше какого-то уровня.
Как сделать такую выборку НП - с помощь запроса QL ?

У меня вот так получилось в JOSM

[maxsize]
[timeout:900];
( node[place];
  way[place];>;
  rel[place];>;)->.a;	/* all places in bbox */
( way(around.a:1000.0)[highway~"motorway|trunk|primary|secondary|tertiary|unclassified"];>;) ->.b; /* highways within given distance */
(
	relation
		(around.b:1000.0)
		[place];>;
	way
		(around.b:1000.0)
		[place];>;
	node
		(around.b:1000.0)
		[place];>;
) -> .c;		/* places within given distance from selected highways */
(.a - .c) ->.d;		/* places outside given distance from any highways */
.d out meta qt;

Может не самый оптимальный запрос, но работает. Ищет все place, у которых на расстоянии 1000м нет ни одной дороги unclassified и выше. *_link и service обрублены сознательно.

хм… что-то не найду в документации - что не так, но вычитание на http://overpass-turbo.eu как-то по другому нужно делать

немного переделал запрос http://overpass-turbo.eu/s/1Ru

в качестве примера, нужно найти этим запросом Амбарчик

UPDATE: вот этот запрос работает http://overpass-turbo.eu/s/6ju

А можно получить всех пользователей, чьи правки попадают в ббокс? Или лучше такое не через оверпас всеже делать?

Во время подготовки картинок для заметки в “дневниках”, столкнулся с непонятным…
Может кто объяснить или спросить у автора ресурса: почему при добавлении к запросу стиля MapCSS появляются “разрывы”?
Для примера две картинки - без и с MapCSS стилем, где видны “лишние” дырки, которые пропадают при увеличении зума.

http://overpass-turbo.eu/s/2yu

  1. без стиля

  2. со стилем

Покажите пожалуйста, как выполнять запросы к Overpass не из JOSM? Если точнее, то из Android приложения. Я новичок в этом деле, поэтому хотелось бы поподробнее

На мелких зумах, мелкие полигоны не рисуются просто.

рисуются, если не использовать стили MapCSS. можно убедится сходив по ссылке, что я привел. достаточно удалить {{style: * }}

Вопрос непонятен, а подробнее wiki - по видимому и нет ничего.
Начни читать с этой страницы - http://www.overpass-api.de/

Можно ли в Overpass API сделать выборку по полигону? Например: точки внутри мультиполигона страны?

Чукча не читатель, подыми глаза выше, одну то страницу осиль прочитать.

Если ты про это

то да, спасибо, это то, что нужно

В соседней теме пытался выяснить - почему скрипт не работает так, как задумано. Методом научного тыка - пришёл к выводу, что проблема в запросе к Overpass.
В самом скрипте (qat_script\gui.py:1113) строка запроса выглядит так:

overpassurl += 'http://overpass-api.de/api/interpreter?data=' 
overpasquery = 'relation["admin_level"="%s"]["name"="%s"]%s;(way(r:"outer");node(w););out meta;' % (adminLevel, name, optTag)

к сожалению, практически все (исключений я пока не нашёл) границы в России этим запросом почему-то не загружаются в скрипт. Есть подозрения, что это зависит от наличия на первом сегменте(way) отношения, тегов “admin_level=*”. Но так как есть примеры, когда тег есть, а все равно не грузит - я не понимаю, что ему не нравится… прошу помощи, подкорректировать запрос до рабочего состояния.

Список границ какие я проверял:

Россия:
Калининградская область(4) - не загружает
в тегах отношений есть (admin_level=4, boundary=administrative),
в тегах линий есть (boundary=administrative, admin_level=2),
note: в первом сегменте прописан тег “admin_level=2”
Новгородская область(4) - не загружает
в тегах отношений есть (boundary=administrative, admin_level=4),
в тегах линий есть различные значения admin_level,
note: в первом сегменте нет тега “admin_level=4”
Италия:
Friuli Venezia Giulia(4) - загружает
граница не собрана в отношение,
в тегах линий есть (boundary=administrative, admin_level=4)
Valle d’Aosta(4) - загружает
граница не собрана в отношение,
в тегах линий есть (boundary=administrative, admin_level=4)
Испания:
Castilla y León(4) - не загружает
в тегах отношений есть (boundary=administrative, admin_level=4),
в тегах линий есть (boundary=administrative, admin_level=4),
note: в первом сегменте прописан тег “admin_level=2”
Польша:
województwo wielkopolskie(4) - не загружает
в тегах отношений есть (boundary=administrative, admin_level=4),
в тегах линий есть (boundary=administrative)
Германия:
Hamburg(4) - загружает
в тегах отношений есть (admin_level=4,boundary=administrative),
в тегах линий есть (admin_level=4)
Nordrhein-Westfalen(4) - загружает
граница не собрана в отношение,
в тегах линий есть (boundary=administrative, admin_level=4)
Франция:
Provence-Alpes-Cote d’Azur(4) - не загружает
в тегах отношений есть (admin_level=4,boundary=administrative),
в тегах линий есть (boundary=administrative, admin_level=4),
note: в первом сегменте нет тега “admin_level=4”
Турция:
Antalya(4) - загружает
в тегах отношений есть (admin_level=4,boundary=administrative),
в тегах линий есть различные значения admin_level,
note: в первом сегменте нет тега “admin_level=4”
İç Anadolu Bölgesi(3) - не загружает
в тегах отношений есть (admin_level=3,boundary=administrative),
в тегах линий есть (boundary=administrative, admin_level=3),
note: в первом сегменте нет тега “admin_level=3”

P.S. автору скрипта я написал, он обещал посмотреть, что можно сделать… но не знает когда появится время для этого.

Проверял где ? В браузере всё без проблем загружается, у меня файл на 2Мб, но вот на месте в josm не работает.

проверял в JOSM конечно - всё подробно расписал вроде. речь про скрипт, на кой мне это все в браузере или где-то ещё?
хотя тоже интересно, почему такое различие в поведении… может в заголовках запроса или в символах перевода строк что-то не так

Ну если в браузере ок, то это проблема не overpass.