Построение иерархии в ОСМ
Собственно простая и понятная работа. Идёт по списку линий с admin_level = N и находит к кому эта линия относится.
admin_level=2 - Россия. С этого начинаем. admin_level=3 - федеральные округа. Смотрим, входит в Россию или нет. Если часть входит в состав России а часть нет - идёт уровнем выше. И так далее. Если всё нормально, то объект попадает в верхний admin_level, если границы пересекаются и часть внутри а часть снаружи то поднимаются admin_level выше.
И вот тут я должен написать про ограничение. Нет проверки, а есть ли пересечение с линиями того же уровня. Да, я проверяю, есть ли пересечение района с регионом. Но пересечение районов с районами не проверяется.
Такая проверка была в первой версии. Но время работы валидатора сильно увеличивалось. Я сделал вторую версию, чтобы запускать валидатор в скоростном режиме и полном. Но в третьей версии проверки ушли. Я перешёл на ежедневный прогон, а ошибок в ОСМ было так много, что ценность отловли этих ошибок была мала.
А сейчас качество в ОСМ гораздо лучше чем было 12 лет назад, да и работа в PostGIS не столь трудна.
Сравниваем с ОКТМО
Собственно самая вкусная проверка. Я сопоставляю данные входящие в состав региона или района в ОСМ и в ОКТМО. Тут сложный алгоритм, но пишется легко.
Сначала сравниваем имена. Смотрим, а одно ли имя? Если совпали и имя одно - в таблице АТД прописваем объект ОСМ.
Далее мы смотрим name2, alt_name, oktmo:user и т.д. Если несколько назаваний то смотри official_status, oktmo:user и т.п. В общем пытаемся найти код ОКТМО всеми способами.
Я запускал валидатор с буквой Ё. Но оказалось довольно сложной проверкой. Как правильно, Е или Ё. В конце концов выкинул эти проверки.
В конце концов таблица АТД имеет как код ОКТМО так код ОСМ.
Создание отчёта
Это самая простая работа. Идём по уровню в ОСМ и смотрим как названия ОКТМО так и то что найдено в ОСМ. Если зелёная строка то объект есть в ОСМ и в ОКТМО, красная строка если найден в ОСМ но либо название не то, либо “вылетел” за границу. Серый - если есть в ОКТМО но не смог найти в ОСМ.
Вот собственно и всё. Надеюсь что вы поняли, что валидатор простой. Его недолго заново написать. Только я до сих пор не изучил PostGIS, поэтому не могу переписать валидатор.
А вот то что ОКТМО меняется 12 раз в году, при этом часто содержит ошибки - это неизбежно и постоянно требует время.
Ах да. Ещё важный момент. В момент импорта отбрасываются объекты у которых addr:country и т.п. не содержат RU.
Но вот зараза, в pbf файл включена обрезка, при этом объект либо не имеет страны, либо релэйшен битый. Можно автоматически выбрасывать из валидатора, но я предпочитаю делать это вдумчиво. А вдруг это Россия, но кто-то сдвинул объект случайно. Сейчас наверное это не нужно, но лет 10 это было иногда полезно. Граница России тогда двигалась!
Есть ещё один случай. У нас был релэйшен города. Но кто-то удалил вэй. Релэйшен не принадлежит никакой стране. Его выбрасывать? Поэтому все спорные случаи я не обрабатываю автоматически а предпочитаю рассмотреть глазами.
Валидатор нет смысла запускать пока не решён вопрос с Крымом. Если что, мне чтобы всё восстановить нужно пол-час работы.
Но по хорошему это нужно решать в DWG. Что-нибудь ответили в DWG? Всё таки изменения Mazda05 были сделаны 6 дней назад, какое-нибудь решение по поводу отрисовки должно быть принято.
Если что, Mazda05 сделал с одной стороны разумную вещь а с другой стороны неразумную. Или откатывать его изменения полностью или частично.
К сожалению отправил только 27 мая в 8:12 МСК (5:12 UTC), пока ответа не было (прошло менее 48 часов). До этого жаловался через профиль на сайте, но видимо сообщение не было зарегистрировано, отправил на почту, номер тикета пришёл через 2 минуты.
По поводу названий не согласен, так как:
Названия, которые поменяли только на бумаге (например, в Крыму Советский район → Ічкінський район, Кировский район → Іслямтерецький район, Ленинский район → Єдикуйський район, Красногвардейский район → Курманський район). Разумеется, все документы по ценности примерно соответствуют бумаге, на которой они написаны (так как фактически на земле остаются те же самые названия, так как приоритет должен быть у российских названий).
Кстати в новых регионах России (прежде всего ЛНР и ДНР) та же самая проблема с топонимами: за последние 11 лет выпускали бумажки с переименованием улиц и других названий, которые не значат примерно ничего, зато вполне возможно попали в OSM. Даже на тех российских территориях, которые пока ещё контролируются украинскими властями, любые переименования со временем могут быть возвращены обратно. Но это уже вопросы политики, а не картографии, я сторонник правила Truth on the Ground.
Все названия в теге name=* должны быть на русском языке (как и почти все остальные имена собственные в Крыму и Севастополе). Жаль что пока что к остальным территориям это не относится, но ничего, это ещё вопрос времени.
В отношение Республика Крым (3795586) не добавлены новые участники, хотя старые исключены. Разумеется, это было сделано намеренно и эти правки не соответствует действующему законодательству (так как подобных изменений не было).
Куча ошибок типа отсутствующих тегов old_name (как и с переименованием улиц по всей украинской территории), адресных тегов (addr:country, is_in:country, is_in:country_code), которые нарушают соглашение по Крыму. Разумеется, все эти действия без обсуждения с российским сообществом. Пока не проверял все правки по Крыму, но чувствую там тоже могут быть ошибки.
И самое главное — если не остановить сейчас, потом такие правки будут повторяться. @fserges, спасибо за валидатор, у меня тоже есть по названиям улиц, когда-нибудь буду актуализировать и возвращённые территории.
Делать то делов, нужно просто ИЛИ откатить ИЛИ аккуратно исправить.
Вариант с откатом я опущу, это просто делать. Расскажу что нужно аккуратно исправить. В качестве примера возьму Первомайский район (RU) и Курманский район (UA). Я не разбираюсь в АТД Украины. Возможно, они имеют другие границы и поэтому нужно делать admin_level=6 версий для RU и UA. То есть Mazda05 делал разумное изменение, только сделал кое-как.
Первомайский район (RU). Он испорчен. Надо ставить admin_level=6, is_in:county=RU, wikipedia=ru:Первомайский район и убить поля koatuu и is_in:county_code (мы не используем этого кода). Будет схема для RU.
И что в итоге? Ну получил он бан (предупреждение) на 0 часов, время вышло. Будут какие либо шаги или самим нужно править?
Если они будут править, то будем ждать. Если не будут править, то кто будет править? Я могу, но я всё же не хотел бы этого делать. Я занимаюсь городами и селами.
Собрался я вносить изменения, изменил первый стандарт и … я не готов к сохранению данных. Я просмотрел все границы и в них много бардака внесено последним автором. Он половину сделал одним способом а половину другим.
Часть данных он скопировал, соответственно я изменил бы оригинал и оставил копию. Но он так сделал лишь только часть! То ли нужно дублировать кучу данных под UA, то ли откатывать его изменения. Выглядел бы наполовину сторонник RU а на половину UA.
Но если я буду работать очень аккуратно, то вопрос - а стоит ли? Шансы на то что Крым будет возвращен UA считаю очень низкими, а работа над современным АТД требует немало сил, причём включая как официальные документы России так и Украины.
Реально проще откатить правки. Если нужно что-то делать с UA - пожалуйста добавляте. Но надо работать аккуратнее а не так как тяп-ляп сделали.
Изменений в Крыму в лучшую сторону по-прежнему нет. Прошло 14 дней с момента изменений. Сделал прогон валидатора, поскольку нужно отслеживать изменения на территории РФ.
60189 Россия
3795586 Республика Крым admin_level4 RU
3788485 Севастополь admin_level4 RU
3826844 городской округ Алушта admin_level8 RU
3826845 городской округ Армянск admin_level8 RU
3826847 городской округ Джанкой admin_level8 RU
3826848 городской округ Евпатория admin_level8 RU
3826851 городской округ Керчь admin_level8 RU
3826854 городской округ Красноперекопск admin_level8 RU
3826856 городской округ Саки admin_level8 RU
3826860 городской округ Симферополь admin_level8 RU
3826864 городской округ Судак admin_level8 RU
3826882 городской округ Феодосия admin_level8 RU
3826900 городской округ Ялта admin_level8 RU
1574582 Бахчисарайский район admin_level6
1590251 Черноморский район admin_level6
1754552 Белогорский район admin_level6
1754553 Джанкойский район admin_level6
1754554 Красногвардейский район admin_level6
1754555 Красноперекопский район admin_level6
1754556 Кировский район admin_level6
1754557 Ленинский район admin_level6
1754558 Нижнегорский район admin_level6
1754559 Первомайский район admin_level6
1754560 Раздольненский район admin_level6
1754561 Сакский район admin_level6
1754562 Советский район admin_level6
1754564 Симферопольский район admin_level6
Это хорошо, что есть правильная subarea Крыма. Но для валидатора неправильные данные.
Пример. городской округ Джанкой. Было admin_level=6 (правильно) а стало admin_level=8. По правилам объекты 8-го уровня это городские поселения а не округа. Это внутренняя структура района. Он по определению законодательства РФ всегда входит в состав района. А городские округа объекты того же уровня что и районы. Они входят в регион непосредственно.
Джанкойский район. Мало того что addr:country=UA и is_in:country=Ukraine, так ещё и boundary=historic. Валидатор не проверяет историю.