perfect_OSM - простенький парсер для OSM XML

Добрый день!

Чтобы получше разобраться с моделью данных OSM написал простенький парсер на Python.
В результате нашел некоторые случаи, которые, судя по Вики, являются ошибками.

Исходный код:
https://github.com/n0s0r0g/perfect_OSM

Результат по регионам РФ:
http://justworks.ru/perfect_osm/2016_04_02.zip

Структура архива:
{дата}/{регион}/{категории}

Ошибки:
errors/useless_node/ - точка без тегов, не входящая в линию или отношение.
errors/useless_way/ - линия без тегов, не входящая в отношение.
errors/highway/crossing/not_on_road - точка highway=crossing не включена в автомобильную дорогу.
Бывает, что highway=crossing включена в railway. Как я понимаю, для этого случая правильный тег: railway=crossing?
errors/traffic_calming/not_on_road - точка traffic_calming=* не включена в автомобильную дорогу.

Замечания:
warnings/highway/trunk_link - highway=trunk_link без указания oneway=*

TODO (что полезного можно улучшить/дополнить):
todo/highway/trunk/no_maxspeed - для highway=trunk не задан тег maxspeed=*
todo/highway/trunk/no_lanes - для highway=trunk не задан тег lanes=*
todo/highway/trunk/no_lit - для highway=trunk не задан тег lit=*
todo/highway/track/no_surface - для highway=track не задан тег surface=*
todo/shop/no_opening_hours - для shop=* не задан тег opening_hours=*

Возможно, для кого-то окажется полезным.

Добавил проверки:
errors/website/not_available - сайт, указанный в тегах website, contact:website, url, source_ref, недоступен.
Пример для Москвы: http://justworks.ru/perfect_osm/2016_04_03/MOW/errors/website/not_available/items.txt

warnings/highway/undocumented_surface - для highway=* в теге surface=* указано значение, не задокументированное на странице http://wiki.openstreetmap.org/wiki/RU:Key:surface.
Пример для Москвы: http://justworks.ru/perfect_osm/2016_04_03/MOW/warnings/highway/undocumented_surface/ways.txt

todo/highway/complex_surface - для highway=* в теге surface=* указано значение, состоящее из нескольких задокументированных значений, разделенных через “;”.
Пример для Москвы: http://justworks.ru/perfect_osm/2016_04_03/MOW/todo/highway/complex_surface/ways.txt

Данные по регионам:
http://justworks.ru/perfect_osm/2016_04_03_website.zip (добавлен Крым и Севастополь).

Интересная вещь.
Но использовать сложно, т.к. просто перечень объектов в OSM.
Нельзя ли как-нибудь координаты выгружать тоже? Для node - её, для way - “центра масс” или просто первой точки.

Молодец, но лучше напиши что-нибудь типа каталога тегов поверх overpass:

http://wiki.openstreetmap.org/wiki/Overpass_API
http://wiki.openstreetmap.org/wiki/Overpass_API/Language_Guide
http://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL

Грубо говоря, ты завелосипедил 1/30 функций overpass-а, я же тебе предлагаю для него фронт-энд написать.

http://wiki.openstreetmap.org/wiki/Overpass_turbo хорош, но для него нужно запросы писать самому, напиши веб-сайтик который сам правильные запросы и ссылки создаёт к Overpass.

Что-то типа http://wiki.openstreetmap.org/wiki/Taginfo, но поверх overpass

OverQuantum
Да уж, результат получился не особенно наглядный. Поэкспериментирую, как можно показать ошибки маркерами поверх карты. Чем хороши ссылки на http://osm.org - для объекта сразу показываются теги; каким линиям точка принадлежит; каким отношениям принадлежит линия.

d1g
Главная цель этого скрипта - самому разобраться с моделью данных OSM, пощупать реальные данные (лучший способ разобраться - начать писать валидатор). Описывать логику на Python лично мне гораздо приятнее и полезнее, чем на Overpass (потому что я его не знаю). В общем, это стандартный путь - начать пилить свой велосипед, встать на все грабли, а потом перейти к стандартному решению (Overpass). Сайт/веб-сервис я делать не планирую (не интересно).

OverQuantum

Попробовал 3 способа:

  1. html файл с картой в Leaflet, ошибки отмечены как Marker; при клике выводится Popup(“Открыть на OSM.org”; “Открыть в JOSM”).
    Недостатки:
    а) При >1000 объектов браузер не открывается.
    б) Для редактирования нужен переход в редактор.

  2. Файл заметок JOSM. В целом, все хорошо.
    Недостатки:
    а) Кто-то по ошибке может нажать “Загрузить на сервер”.
    б) Нельзя нарисовать линии.

  3. GPX файл:

  • точки отмечены как waypoint с описанием
  • линии отмечены: начало, конец - waypoint с описанием; точки посередине - track.
    Мне этот способ показался самым удобным.

Примеры (GPX, Москва):
Бесполезные точки:
http://justworks.ru/perfect_osm/2016_04_05/MOW/errors/node/useless/useless_nodes.gpx
Бесполезные линии:
http://justworks.ru/perfect_osm/2016_04_05/MOW/errors/way/useless/useless_ways.gpx
GPX файлы открываются в JOSM’е.

Сделай первый способ, но чтобы загружались только объекты в видимом окне карты (BBOX)

https://github.com/Leaflet/Leaflet.markercluster — работает с миллионами точек.

RiG’s,
Примерно вот в таком виде подойдет?

Москва, бесполезные точки, пустые линии:
http://justworks.ru/perfect_osm/2016_04_05/MOW/example/markers.html

Zverik,
Спасибо, полезная штуковина.

Подойдет, только загрузку в JOSM поправьте, посмотрите как у других валидаторов это реализовано

Ну у меня интерес вида “увидеть все errors в Зеленограде” (или в другой зоне, существенно меньше целой области) и по возможности в JOSM-е.
Поэтому GPX или загружаемый в JOSM файл мне предпочтительнее.
Но и Leaflet подойдёт.

UPD: Немного поисправлял по GPX-у.
Если GPX, то надо 1 маркер на линию, а то кол-во надписей сбивает с толку - для замкнутых видно 1 надпись, а для незамкнутой - 2.

Сделал очередной проход по всем регионам.

Бесполезные точки:
http://justworks.ru/perfect_osm/20160428/node_useless/map.htm (37319 шт.)
Точки без тегов, не входящие в линии и отношения.

Бесполезные линии:
http://justworks.ru/perfect_osm/20160428/way_useless/map.htm (18426 шт.)
Линии без тегов, не входящие в отношения.
Очень часто отображают реальную геометрию, но без тегов бесполезны (пример).

Дорожный объект не на дороге
http://justworks.ru/perfect_osm/20160428/not_on_highway/map.htm
Указывает, когда highway=crossing, highway=traffic_signals, traffic_calming не находится на highway.
Для highway=crossing есть много случаев пересечения с railway=*, Wiki для этого предлагает railway=crossing.
Возможно ложное срабатывание, когда объект попадает в выгрузку, а дорога нет!

Некорректный тип объекта:
http://justworks.ru/perfect_osm/20160428/bad_type/map.htm (13336 шт.)
Попытка сопоставить тип объекта для тега (или пары тег=значение), указанного в Wiki с реальными данными.

“Идеальные трассы”:
http://justworks.ru/perfect_osm/20160428/perfect_trunk/map.htm
Указывает, где на highway=trunk не установлены теги lit, lanes и maxspeed, а для trunk_link - тег oneway.

Некорректный формат телефона
http://justworks.ru/perfect_osm/20160428/bad_format/map.htm
Формат телефона не соответствует указанному в Wiki (не знаю, насколько это важно на самом деле)

Первичные данные по всем регионам: http://justworks.ru/perfect_osm/20160428/data.zip (270 мб)
CSV файл с замечаниями по всем регионам: http://justworks.ru/perfect_osm/20160428/all_issues.csv.zip (19 мб)

Отдельно сделал выгрузку по Зеленограду командами:

wget http://overpass-api.de/api/map?bbox=36.9724,55.9134,37.3837,56.0881 -O map.osm
python3 perfect_OSM.py map.osm issues
python3 csv2map.py issues/issues.csv map

Архив: http://justworks.ru/perfect_osm/20160428/ZEL/data.zip
Карта: http://justworks.ru/perfect_osm/20160428/ZEL/map/map.htm

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

Супер! Спасибо.
Телефоны поисправлял и ещё немного.

Вижу несколько странных вещей

  1. На building=apartments - выдаёт “Здание без адреса”, хотя вроде бы полный комплект
    Например: https://www.openstreetmap.org/way/36943476
    Без addr:street, но building=yes такого нет

  2. Что тут не так?
    https://www.openstreetmap.org/way/165051502
    “Некорректный тип элемента”
    amenity=bicycle_parking на линии вроде бы допустим по вики

https://www.openstreetmap.org/node/1055522365
“Некорректный тип элемента”
landuse=industrial на точке вроде бы допустим по вики

addr:place ?

Что “addr:place”? См. зеленоградскую схему адресации.
Вот на это здание нет сообщения “Здание без адреса”: https://www.openstreetmap.org/way/36943479

Значит на apartments так реагирует

Это баг. Сработало правило, что на building={apartments, residential} должны быть теги addr:housenumber, addr:street. Не учел зеленоградскую схему адресации. Упростил правило, теперь для building={apartments, residential} будет требовать только addr:housenumber. Исправил.

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

http://wiki.openstreetmap.org/wiki/RU:Key:amenity

  1. Для ключа amenity разрешенные типы: точка, полигон, отношение. Линии нет.
  2. Для amenity=bicycle_parking разрешенные типы: точка, полигон. Линии нет.

http://wiki.openstreetmap.org/wiki/RU:Tag:amenity%3Dbicycle_parking
Для amenity=bicycle_parking разрешены все типы: точка, линия, полигон, отношение.

Добавил линию как разрешенный тип для ключа amenity.