Как получить баллы от OpenStreetMap определенной страны?

я пытаюсь получить список всех школ в моей стране, и после нескольких попыток я пишу следующий запрос, который работает без ошибок на http://overpass-turbo.eu:

/*
This has been generated by the overpass-turbo wizard.
The original search was:
“amenity=school”=“yes”
*/
[out:json][timeout:60];
// gather results
(
  // query part for: “amenity=school”
  node[amenity=school]({{geocodeBbox:Italia}});
  way[amenity=school]({{geocodeBbox:Italia}});
  relation[amenity=school]({{geocodeBbox:Italia}});
);
// print results
out body;
>;
out skel qt;

Я использовал geocodeBbox для выбора всех школ Италии, потому что geocodeId и geocodeArea (см. документацию) дайте мне следующие ошибки:

Error: line 10: parse error: ')' expected - '(' found.

Error: line 11: parse error: ')' expected - '(' found.

Error: line 11: parse error: ';' expected - ')' found.

Error: line 12: parse error: ')' expected - '(' found.

Error: line 12: parse error: ';' expected - ')' found.

Error: line 13: parse error: Unknown type ")"

Error: line 13: parse error: An empty query is not allowed

Error: line 13: parse error: Unknown type ";"

Error: line 15: parse error: An empty query is not allowed

В любом случае проблема в том, что запрос выбирает даже школы не из Италии (например есть школа из Хорватии).

Итак, как получить именно баллы из определенной страны?


person smartmouse    schedule 25.06.2015    source источник
comment
кросспост: help.openstreetmap.org/questions/43772/   -  person scai    schedule 04.07.2015


Ответы (1)


В любом случае проблема в том, что запрос выбирает даже школы не из Италии (например есть школа из Хорватии).

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

Вместо этого попробуйте этот запрос:

[out:json][timeout:600];
// gather results
{{geocodeArea:Italia}}->.searchArea;
(
  // query part for: “amenity=school”
  node[amenity=school](area.searchArea);
  way[amenity=school](area.searchArea);
  relation[amenity=school](area.searchArea);
);
// print results
out body;
>;
out skel qt;
person scai    schedule 25.06.2015
comment
Он собирает четные узлы без каких-либо ссылок на тег amenity:school. Эти узлы содержат только теги type, id, lat и lon. Почему? - person smartmouse; 27.06.2015
comment
Потому что он также собирает пути (и отношения) с тегом amenity=school. Геометрия пути определяется узлами, на которые он ссылается. Для получения дополнительной информации прочитайте раздел об основных элементах OSM. - person scai; 29.06.2015
comment
Знаете ли вы какой-нибудь способ получить узлы/пути без дубликатов? Мне нужно проанализировать эти данные с помощью PHP, и я не могу обрабатывать рекурсивные данные с тем же идентификатором узла. - person smartmouse; 03.07.2015
comment
В возвращаемых данных не должно быть дубликатов. Возможно у вас сломался парсер. Лучше всего создать новый вопрос, предоставить данные, которые вы пытаетесь проанализировать, объяснить нам свой синтаксический анализатор и сообщить нам, какие данные должны быть дублированы в соответствии с вашим синтаксическим анализатором. - person scai; 04.07.2015
comment
Я помещаю дубликаты между кавычками, потому что я имею в виду узлы без ссылок на тег (см. мой предыдущий комментарий). Я хотел бы получить в качестве вывода только список всех точек (узел или путь, а не оба), которые имеют этот тег. Если я использую ваш запрос OSM, я получаю узел, путь и отношение, которые относятся к одной и той же точке, и этот вывод трудно обработать в моем парсере PHP... (и это создает дубликаты) - person smartmouse; 04.07.2015
comment
Пожалуйста, прочитайте мой второй комментарий. Похоже, вы не очень хорошо знакомы с основными элементами OSM. Это узлы, принадлежащие amenity=school ways. Эти узлы также не имеют этого тега, потому что это было бы избыточно. Вместо этого только путь, которому принадлежат эти узлы, имеет тег удобства. - person scai; 04.07.2015
comment
Да, я понял это, и по этой причине я создаю рекурсивную функцию PHP для ее обработки. Тогда я предположил, что может существовать лучший способ написать запрос на OSM, чтобы получить однозначные ссылки на школы. Но это кажется невозможным из-за базовой структуры элементов OSM. Все равно спасибо ;) - person smartmouse; 04.07.2015