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

в свое время делал скрипт для получения всех н.п. в республике

[timeout:25];
area[admin_level=4][“name”=“Чувашия”][boundary=administrative]->.boundaryarea;

( node(area.boundaryarea)[“place”];
way(area.boundaryarea)[“place”];
relation(area.boundaryarea)[“place”]; );

out meta;

;
out meta;


для скорости думаю надо было сначала делать выборку по тегам, а уж потом проверять на вхождение в area, быстрее обработается.
переделай под себя.

А кто подскажет, можно ли как-то отсеять запрашиваемые объекты по габаритам (для way)? Например, для natural=water показать все больше 100 метров в широтной или долготной протяженности. Или по длине way. Просто мелких уж очень много получается, мне достаточно только самые крупные.

У кого-то есть проблемы, что сохранённые в браузере запросы пропали?

У меня какой-то чужой запрос появился вместо того, который был загружен.

ого. действительно все мои сохраненные запросы пропали, вместо них чьи-то чужие.

У меня такой нормально сохранился

[out:xml];
(
//  node["note"~"."]({{bbox}});
// You can also change node into way below

  node["fixme"~"."]({{bbox}});
);
out meta;
>;
out meta qt;

{{style:
node[note]{ 
  text : note;
  color: blue;
  fill-color:blue;
  fill-opacity:1.0;
}
node[fixme]{
  text: fixme; 
  color: red;
  fill-color:red;
  fill-opacity:1.0;
}
way[note]{ 
  text : note;
  color: blue;
  fill-color:blue;
  fill-opacity:1.0;
}
way[fixme]{
  text: fixme; 
  color: red;
  fill-color:red;
  fill-opacity:0.3;
}
}}

Всем привет!

А подскажите, пожалуйста, пример запроса для выгрузки субъектов РФ? Вроде admin_level 4
И еще вопрос - можно ли выгрузить и районы, города? Или для каждого субъекта надо будет ручками делать?

Выгрузка региона:
[out:xml][timeout:25][bbox:{{bbox}}];
(
relation[“admin_level”=“4”][“addr:country”=“RU”];
);
(._;>;);
out meta;


У меня тоже вопрос. Хочу выгрузить недостающие полигоны, не попавшие в нарезку, одним запросом.
Возможно можно сделать компактнее, но нужные мне данные приходят вот на такой запрос (3 отношения):
upd. удалось сократить до такого
(
relation(1125603);
);
(
.;
relation(151225);
);
(
.
;
relation(151223);
);
(
._;
way(r);
node(w);
);
out meta;

Overpass при этом возвращает дублирующиеся данные, если точки/линии содержатся в нескольких линиях/отношениях. Впоследствии на это ругается osmosis. Приходится искать дополнительно, чем бы убить дубли в файле osm.

upd. Последний вариант запроса работает, хотя наверняка можно ещё короче записать

Спасибо за ответ! Но всегда практически runtime error. Какой масштаб использовать или что-нужно сделать, чтобы не было ошибки и получить границы всех регионов? ))

Да вы микроскопом гвозди забиваете.
https://osm.wno-edv-service.de/boundaries/

круто. Но получается как минимум 85 раз нажать , чтобы выбрать субъекты и это не считая районы

Мне кажется вам стоит перейти на выгрузки и фильтровать всё самому, через osmosis или osmfilter. Написал один раз батник с нужными параметрами и потом просто запускаешь для получения всех нужных данных (в том числе и районы, города).

имеется ввиду выгрузить всю дату по России и потом там искать районы и прочее?

Имеется в виду - взять готовый дамп (отсюда) и отфильтровать из него то, что вам нужно, а не насиловать overpass.

Новичёк и так и не могу вкурить до конца логику языка…

Мне хочется просто выгрузить всё содержимое osm внутри bbox-прямоугольника, так чтобы этот квадрат можно было бы отрендерить в картинку. То есть если в прямоугольник попала область, то она должна выгрузиться со всеми точками, чтобы при рендере было понятно как заливать область.

(way({{bbox}});<;>;);out; - простой запрос решает проблему, но слишком много ненужных данных…
Если линия пересекает область, то мне достаточно только эту линию, без связанных с ней.
Заметил, что проблема в основном в железных дорогах, автотрассах, реках. Если они попали в прямоугольник, то выгружаются все точки через пол страны.

Своими силами додумался до такого запроса:
(
(way({{bbox}})[railway!~“.”][highway!~“.”][waterway!~“.”];<;>;);
(way({{bbox}});node(w););
(way({{bbox}})[railway];node(w););
(way({{bbox}})[highway];node(w););
(way({{bbox}})[waterway];node(w););
);out;

Но столкнулся с тем, что выгружаются все линии тэга “boundary”=“administrative”. Так как эта область рендерится без заливки (только пунктирные края), то мне не нужно применять рекурсию. Помогите ещё больше оптимизировать запрос. Выгружать границу двух микрорайонов, а то и более за пределами bbox мне не надо.

ps
писал запрос давно, но проблемы с administrative уже невыносимы, а сейчас уже не помню смысл строки (way({{bbox}});node(w););

Ну вы забиваете гвозди микроскопом. Скачайте выгрузку на нужную вам область и рендерите её, например на гислаб.
Но если вам так хочется всё лишнее отрезать


[out:json][timeout:25];
node({{bbox}}) ->.raw;
(
.raw;
way(bn.raw);
);

out skel qt;

То что вы дали - абсолютно не то. Разрезанную область невозможно гарантированно правильно закрасить. Потому что нет информации в какую сторону её закрашивать. Даже если закрашивать по направлению внутрь выпуклости, то всё-равно нет гарантий, что часть линии за пределами bbox не будет являться вогнутость по отношению к общему контуру всей области.

Все области попавшие хоть какой-нибудь своей частью в bbox мне нужны полностью, кроме administrative. В этом смысл моего изначального вопроса.

ps
Я тут только что заметил, что и мой запрос выше тоже не всегда корректно работает :frowning:

выгружайте дамп с гислаба, как вам советовали выше, и вырезайте нужный кусок osmconvert, он умеет полностью сохранять полигоны, которые зацепило границей обрезки

Спасибо, но мне нужны полностью АКТУАЛЬНЫЕ данные, даже если они были изменены 5 секунд назад. Дампы недели или месяца назад (и даже вчерашние) не годятся. Да и целые города выгружать и обработать не может выбранная программная среда рендера. Годится только url запрос.

Пока наилучший результат мне даёт:
(
(way({{bbox}})[railway!~“.”][highway!~“.”][waterway!~“.”];rel(bw)[type!=“boundary”];way(r)[railway!~“.”][highway!~“.”][waterway!~“.”];<;>;);
(way({{bbox}})[railway!~“.”][highway!~“.”][waterway!~“.”];node(w);rel(bn)[type!=“boundary”];way(r)[railway!~“.”][highway!~“.”][waterway!~“.”];<;>;);
(way({{bbox}})[railway];node(w););
(way({{bbox}})[highway];node(w););
(way({{bbox}})[waterway];node(w););
);out;

Остаётся лишь проблема, которая была и в прошлом запросе - если у какой-либо области все точки и линии находятся вокруг bbox (то есть при правильном рендеринге bbox должен закрашиваться полностью) то такая область теряется. Случается это редко, но желательно тоже пофиксить, поэтому пока не могу пока сдаться или признать запрос совершенным.

Ещё есть проблема океанов(говорю для тех кто возможно найдёт этот запрос), но тут в моём случае по условию задачи допустимо подгрузить geojson с водой нужной местности.

Есть ежеминутные обновления дампов, обновляйтесь и будут вам актуальные данные. А строить систему на Overpass, может оказаться чревато, малые лимиты и вообще можно и бан схлапотать.