Нормализация данных (пилотный проект — Спб и ЛО)

andriano, такое реально бывает: дом приписан улице, но без номера (б/н)

http://forum.openstreetmap.org/viewtopic.php?pid=146740#p146740

Можно пример?

Можно пример из КЛАДРа?

а откуда в кладре номера домов???

Там есть диапазоны номеров, но их актуальность и аккуратность их заполнения – неизвестны.

По Питеру есть уже адресный валидатор от liosh-а :slight_smile: http://gis-lab.info/data/mp/addr/?base=rgis
Так что это проблема под контролем :slight_smile:

я ставлю addr:street без housenumber, когда знаю, что дом прописан по улице, но в номере не уверен. Это не ошибка. Так же, как building:levels без building=* — не ошибка.

С шестого уровня:

andriano, ты сам кладр посмотри, а не его описание :slight_smile:

Первые две итерации завершены. По нескольким регионам (Ленинградская, Московская, Новосибирская, Владимирская области, Краснодарский край) был составлен словарь тегов. 236 ключей и 927 значений довольно неплохо описывают реальность. Непонятными оказываются порядка 0.5% данных что для начала неплохо.

Хотел проверить - а как мой словарь работает на “буржуйских” данных. Но оказалось что их файлы .osm гораздо больше наших (даже файл Финляндии в 2 раза больше Москвы и Московской области) и вычислительные ресурсы оказались узким горлышком. Поэтому пришлось полностью переделать базу данных с точки зрения оптимизации. База данных из красивой и понятной превратилась в оптимизированную, в которой не особо то и разберёшься. Но в результате она стала меньше где-то на 30% да и скорость обработки выросла пропорционально. Для обработки стран средней величины уже должно хватить. Впрочем, для обработки крупных стран придётся делать ещё одну оптимизацию. Но там уже будет статистическая оптимизация, с преобразованием данных (идеология в духе алгоритма Хаффмана) и это уже будет перед промэксплуатацией, т.к. база будет что чёрт ногу сломит.

А сейчас работаю над сочетанием тегов. Задача полностью не разрешима в рамках идеологии OSM, но до некоторого практического уровня валидатор довести можно. Например, регулярно в данных находятся сочетания типа highway=* и building=yes и т.п.

Я в таких случаях ставлю “addr:housenumber=00” , очень удобно.
а) теги собраны правильно
б) наглядно на карте сразу видно что номер дома неизвестен (неточен) и проезжая мимо можно глянуть
в) опять же на карте видно, что это именно дом, а не скажем служебное здание или еще что-либо

Спасибо.
Вот здесь http://forum.openstreetmap.org/viewtopic.php?id=11467 я как раз столкнулся с тем, что существование записей такого вида входит в конфликт с концепцией, принятой для упаковки данных.
И придерживаюсь мнения, что в данном случаен имеет место умышленное искажение информации. Хотя для кого-то, это, возможно, и удобно.
На мой взгляд, отсутствие информации значительно лучше, чем искаженная информация. Из каких благих целей бы эта информация не искажалась.

А можно ознакомиться с этим списком?
И еще, из 236 ключей и 927 значений можно составить 218772 комбинаций. Каким образом определяется, какие из этих комбинаций допустимы, а какие - нет?
И каким образом обрабатывается ситуация, когда для определенного ключа допустимы произвольные значения?

Когда работа будет завершена то я размещу подробный отчёт, думаю что на вики. Пока всё сыровато чтобы выкладывать, так как все будут видеть кучу мелких погрешностей и делать неверный вывод - “сколько там косяков, наверное вся работа кривая”. А вот этого бы не хотелось.

По поводу комбинаций тегов. Полное решение задачи может и возможно теоретически, но по-крайней мере крайне сложно практически. Даже если предположить, что удастся всё подробно расписать относительно одного объекта, то придётся разбираться с комбинацией объектов. Взять тот же building=yes. Ничто не мешает навесить на контур здания shop=* или amenity=*. И каждый дополнительный тег может привнести свои собственные комбинации. В реальных данных на контур building=yes, например, ещё накладываются man_made, landuse, highway. Где проходит грань между допустимыми и недопустимыми комбинациями тегов, особенно если учесть что “any tag you like”? В файле Владимирской области, например, 17 зданий, они же landuse, 4 здания highway, 5 населённых пунктов помечены тегом layer, 105 веев имеют только тег addr:housenumber и ничего более (нет addr:street) и т.п. Вообще комбинации порой весьма причудливы :slight_smile:

Я придерживаюсь единственного рационального (с моей точки зрения) подхода - строю частотные таблицы и далее, сопоставляю сочетания с документацией. Если потенциально сочетание возможно (с моей точки зрения), то сочетание пропускается, если нет - то отбраковывается. Валидатор получается довольно грубым, но во многом это в силу свободности семантики языка OSM и трактовки правил. Нужно не забывать что и русском языке складывая валидные слова языка можно получить бессмыслицу, “мама ныла раму”. Но с другой стороны парадоксальные сочетания слов иногда имеют смысл, скажем, “папа глушил водку” :slight_smile:

Работа потихоньку идёт. Каждая следующая итерация это всё больший уровень абстракции и резко возрастающий объём исключений и нелогичностей. Но лёгкой прогулки и не ожидалось.

Хотя валидатор будет запускаться только по СПб и ЛО, он обкатывается и на других странах. Недавно прогонял Бельгию. Хотя в планах нет глобальной экспансии, но разрабатывая сложную вещь нужно в архитектуру решения закладывать масштабируемость. Вдруг окажется полезным?

Но к сожалению, есть одно но. Я уезжаю в командировку и отпуск и где-то на 1.5 месяца выпадаю из нормального ритма жизни. В частности, доступ к ОСМ да и компьютеру вообще будет ограничен. Так что в ближайшее время новостей не будет. Когда все поездки закончатся, надеюсь опубликовать результаты исследования.

На затравку несколько ошибок из пробного прогона валидатора:

xybot прибил “amenity=” http://www.openstreetmap.org/browse/node/1153440818/history http://www.openstreetmap.org/browse/node/1156696653/history и получилась точка с name и без каких-либо ещё тегов.
Зданий Пулковской обсерватории, покрытое кустарником - http://www.openstreetmap.org/browse/way/27379602
Кинотеатр, он же - заброшенная деревня - http://www.openstreetmap.org/browse/way/62365485
Детский сад, он же шоссе - http://www.openstreetmap.org/browse/way/40433125
Здание = дорога - http://www.openstreetmap.org/browse/way/86601892
Дорога=озеро - http://www.openstreetmap.org/browse/way/60503929
Линия электропередач, она же дорога - http://www.openstreetmap.org/browse/way/80765386
Промзона, имеющая адрес, она же лес - http://www.openstreetmap.org/browse/way/54117446
motorcar=Северная ТЭЦ - http://www.openstreetmap.org/browse/way/33227541
Остров, висящий над землёй - http://www.openstreetmap.org/browse/way/30430221
Забор (не дорога) с ограничение скорости - http://www.openstreetmap.org/browse/node/1192706200
Всё в одном - лес, парк, лесопосадки - http://www.openstreetmap.org/browse/way/45419917

И т.п.
Возможно - не всё ошибки, но сочетания непривычные :slight_smile:

Может быть, здесь ошибки нет. Это ворота, а не забор; и если на воротах стоит знак ограничения скорости, то тэг maxspeed поставлен правильно. Его надо бы ставить на дорогу, но здесь дорогу пока не нарисовали.

Да, там именно так, как сказал Surly.
Кстати, за этими воротами находится навес для транспорта - крыша на бетонных столбах. Может кто-нибудь посоветует, как отмечать такие сооружения поизящнее? Пока обозначил просто как covered=yes.

И чем то, что стало после бота, хуже чем то, что было до него?
На карте мааса объектов, не имеющих никаких тегов кроме name. Это, конечно, ошибка, но не бота.

locality - это ни разу не заброшенная деревня, это - ненаселенная местность, имеющая собственное название. Например, урочище.

Здание либо озеро может быть окружено дорогой. Хотя в случае с озером это, конечно, маловероятно.

А вот линия электропередачи, идущая вдоль дороги - обычное дело.

Вообще-то здесь весьма своеобразная промзона - радиопередающий цех. Зачастую это территория, на которой стоят антенны, а сама территория обычно от леса не очищается.

А это, вероятно, результат “подсказок” при наборе + опечатка - пользователь нажал “m” вместо “n”.

PS. Но, вообще-то проблема неоднозначной интерпретации данных существует. Особенно при конвертации - когда требуется отнести объект к одному из заранее предопределенных типов. Я лично эту задачу решаю так:

  1. Просматриваются все теги объекта и отчаются распознанные key.
  2. Отмеченные значения key рассматриваются в порядке приоритета. Приоритет задается заранее волевым решением.
  3. Если для данного key удается однозначно идентифицировать value, эта комбинация и считается типом объекта, на чем анализ заканчивается.
  4. Если объект содержит несколько распознанных key, притом для очередного не удалось распознать value, рассматривается следующий по приоритету key.
  5. Если объект так и не удалось отнести ни к одному предопределенному типу, он попадает в список ошибок.

Не уверен, что я делаю правильно. Может, будут какие предложения по обработке данного рода конфликтных ситуаций?

Я не ставил целю провести подробный анализ странных данных. Поэтому придраться к моим словам при желании легко. Именно поэтому я вообще не собираюсь выкладывать сколько-нибудь сырые данные для всеобщего обозрения, ибо объём критики скорее всего вообще лишит интереса к OSM.

Грубо говоря это не ошибка бота. Он просто порождает из ошибочных данных пустые именованные объекты.

Хорошо, кинотеатр, он же - урочище :slight_smile:

Здание либо озеро может быть окружено дорогой. Хотя в случае с озером это, конечно, маловероятно.

Оба варианта возможны теоретически, но практически так никто рисовать бы не стал или такая практика была бы очень странной. Дорога проходящая по стене здания возможна, но тогда должен быть level=1 или level=-1. Скорее всего дорога рядом.

Вдоль дороги - да. Но зачем накладывать друг на друга два разных объекта. Как навигатор или рендер должны это отображать? Как электифицированная дорога или провода по которым можно ходить? :slight_smile:

Меня тоже этот объект заинтересовал. Его нет на подробных картах!! Там просто лес. Military? Но вот с описанием landuse=industrial всё же не бьётся - “Используйте тег landuse=industrial чтобы обозначить область, использующуюся в промышленных целях, например заводы, фабрики или склады”.

Резюме: три ипостаси - данные, правила и рендер должны сливаться в экстазе. То есть данные соответствовать правилам, правила не создавать проблем данным, рендер отображать данные и следовать правилам. Если находится спорный случай то нужно либо избегать противоречивых данных либо изменять правила. Если кто-то не по делу использует теги, может менять описания тегов?

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