User:Zverik/Правим ошибки границ

From OpenStreetMap Wiki
Jump to navigation Jump to search
Yav-110306-errors.gif

Ну что за дела — стоило оставить ошибки в валидаторе без внимания, так за пару дней снова всё вернулось к обычному состоянию: факап по каждому пункту. Давайте так. Исправим-ка каждую ошибку вместе. Всего есть три типа ошибок, нередко взаимосвязанных. Справа нарисованы два: частые и редкие. Есть ещё ошибки границ, выражающиеся в красных цифрах количества областей и районов.

На этой странице рассмотрим редкие ошибки. Таких, обычно, всего ничего: меньше десятка на всю страну. На картинке их семь типов. Запустим JOSM (запомните: для добавления ошибок запускаем Potlatch, для устранения — JOSM) и пойдём искать их по порядку.

S-STATUS: Странный статус

Чаще всего это какой-то посёлок городского типа или город получил статус hamlet. Такого быть просто не может, разве что кто-нибудь вспомнил древнее правило про тысячу человек и опустил посёлок в 900 жителей. В любом случае, ищем: последовательно перебираем регионы, пока не наткнёмся на S-STATUS, затем так же ищем область. Если в области отрисованы районы, то придётся покопаться и в них. В нашем случае это оказался Заволжский район Ивановской области ЦФО:

Yav-s-status-1.gif

Что можно узнать из этой картины? Поскольку пункт «воздвиженье» отсутствует в списке нераспознанных, этот предположительно пгт давно недавно нарисован и обведён полигоном place=*; name=село Воздвижене. Соответственно, здесь две ошибки: S-STATUS и S-WITHIN. Вторая получается от того, что точка place и ограничивающий её полигон имеют разные названия, что равнозначно вложенным разным населённым пунктам.

Подготовим JOSM для работы. Нужно добавить значок скачивания объекта на панель инструментов, чтобы не тыкаться в меню и не раскорячивать пальцы на клавиатуре. Это просто: откройте панель настроек и переместите нужный пункт на панель. Для удобства стоит ещё добавить кнопку «создать мультиполигон» из меню инструментов.

Josm-add-icon.gif

В валидаторе тыкаем на значок области Mf area.png справа от «села Воздвижене» и копируем номер линии. Затем вставляем в окно скачивания линии в JOSM (кнопку для открытия которого мы только что добавили). Затем тыкаем в название «воздвиженье» и оттуда копируем в JOSM номер точки. Можно написать автору этих объектов письмо с разъяснением ошибок, если не лень.

Yav-s-status-2.png

О, да у точки статус city! Проверим страницу поселения, для верности:

Yav-s-status-3.gif

Да, это село. City для села — не очень хорошо, поэтому исправляем на то же значение, что стоит у полигона: village. Заодно ставим точке и полигону нормальное название, скопированное из валидатора: «Воздвиженье» (тем самым устраняя S-WITHIN). Всё, обе ошибки поправлены. Тыкаем в валидаторе на слова «Российская Федерация» и возвращаемся в начало.

B-BAD-LEVEL: Неверный уровень границы

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

Ошибка BAD-LEVEL обычно означает, что внутри границы уровня N оказалась другая граница уровня тоже N или ниже (чем ниже уровень — тем крупнее административная единица). Пример под рукой: Мценский район Орловской области ЦФО содержит Мценск, предположительно, городской округ:

Yav-b-bad-level-1.gif

Сначала нужно проверить в википедии их взаимный статус. Вбиваем в википоиск «Мценский район», и на нужной странице явно написано, что Мценск — ГО. Таким образом, его границу просто нужно исключить из границы района. Качаем то и то. Дальше просто: выделяем линию (!) границы Мценска, открываем редактор отношения района, добавляем линию с ролью inner:

Yav-b-bad-level-2.gif

Но что это? Одна и так же линия является и административной границей (boundary=administrative), и границей населённого пункта (place=*)?

Yav-b-bad-level-3.gif

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

Ctrl+C (копируем теги), жмём кнопку «Создать мультиполигон», удаляем теги type, boundary и admin_level, выделяем свежесозданное отношение мультиполигона, жмём самую правую кнопку для его выбора:

Yav-b-bad-level-4.gif

Жмём Ctrl+Shift+V для вставки тегов и удаляем всё, кроме type, boundary, admin_level и name. Всё, у нас есть полноценное отношение границы городского округа и граница населённого пункта без лишних тегов.

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

B-TOPO: Топологическая ошибка границы

B-TOPO обычно приводит к тому, что границы пропадают из списка валидатора. Поэтому найти, где они случились, несложно. В данном случае новичок поработал в Архангельской области:

B-topo-1.gif

У нас есть координаты — замечательно! Открываем в JOSM «Инструменты -> Добавить точку» (Shift+D) и копируем туда числа. Одно но: их нужно поменять местами:

B-topo-2.gif

Дальше жмём «3» («Вид -> Масштабировать до выделения») и «Delete» (ведь нам не нужна больше эта точка). Затем скачиваем данные. Пока ничего подозрительного...

B-topo-3.gif

Ох ё... Граница-то построена замкнутыми полигонами!

B-topo-4.gif

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

B-topo-5.gif

Нужно, по сути, перерисовать все сломанные части границ с нуля. Качаем отношения для всего, что поломано: Архангельск, Новодвинск и Приморский район. Последние два уже есть в списке отношений JOSM (на них правую кнопку мыши, «Скачать участников»). Границу Архангельска скачиваем обычным путём, как данные OSM, и затем докачиваем её целиком. Да, и мультиполигон place для Архангельска тоже нужно будет починить.

Как вы понимаете, документировать процесс починки этого невозможно без слома мозга у меня и у вас, поэтому расскажу принцип. Он прост: все полигоны, по которым проходит граница, превращаем в мультиполигоны (перемещая теги с линий на отношение), нужные линии вставляем в отношение границы (а ненужные — убираем). В редакторе добиваемся, чтобы все границы и все мультиполигоны были замкнуты. И так, узел за узлом, линия за линией, наводим порядок. На следующий день смотрим в валидаторе, не пропустили ли кустик.

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

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

S-TOPO: Топологическая ошибка НП

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

Yav-s-topo-0.gif

Ставим точку с этими координатами, удаляем, качаем окрестности:

Yav-s-topo-1.gif

Вот и тот тип ошибки, о котором я только что писал:

Yav-s-topo-2.gif

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

Yav-s-topo-3.jpg

В общем случае, тип топологической ошибки (границы или НП) не влияет ни на причины, ни на способ правки. S- или B- — просто отражение тегов на отношении или линии, которая составляет границу. Чаще всего встречаются ошибки двух видов: такое вот самопересечение, либо соприкасающиеся замкнутые линии мультиполигона (или отношения boundary, что одно и то же). Второй вид, как я упомянул выше, правится разделением линий и созданием новых отношений мультиполигона при необходимости.

Intermission

Кстати. Границы с топологическими ошибками не распознаются валидатором, поэтому их можно искать по принципу «-1»: если в административной единице наличествуют все границы, кроме одной, то надо бы на неё посмотреть. Так я сначала нашёл Еловский район Пермского края. Там не хватает Калиновского СП. Давайте заглянем, что с ним.

Yav-inter-1.gif Yav-inter-2.gif

Копируем номер отношения и загружаем его в JOSM. Центр Калиновского СП — село Калиновка, его точку тоже загружаем. Теперь качаем окрестности:

Yav-inter-3.gif

Смотрим отношения на ближайшей линии — там два поселения, никак не напоминающие Калиновское. В списке отношений его тоже нет.

Yav-inter-4.gif

Ну и ладно: поселение просто не нарисовано, и это не наша работа. Зачем мы туда заходили? Есть тип ошибки границы, которую валидатор не отлавливает: разрыв. Если в отношение границы забыли добавить линию, оно перестаёт быть замкнутым, и исчезает для валидатора. Но здесь просто нет отношения, и нет намёков, как его рисовать. Центр одного поселения просто находится внутри другого. Можно написать об этом сообщение автору границ, но мы пойдём дальше.

B-EQUALS: Границы совпадают

Ошибки совпадения границ всегда ходят парой, по одной на каждую из совпадающих границ. Одна такая пара нашлась в той же Архангельской области:

Yav-b-equals-1.gif

Открываем каждый из этих районов и копируем номера отношений в JOSM. [Справка] нам прямо подсказывает возможную причину: «Релейшн одной из границ собирается в полигон неверно - не собирается одно из колец». Смотрим на границу между районами (это всегда граница между районами, т.к. одно из колец принадлежит обоим районам, откуда и совпадение границ, хоть и частичное):

Yav-b-equals-2.gif

Ну да, так оно и есть. Кто-то объединил мультиполигон в обычный полигон (тот же, кто портил Приморский район тем же способом), не обращая внимания на отношения. Докачиваем окрестности, чтобы не потерять контекст и не разрушить какие-нибудь другие отношения, и осторожно расцепляем линии:

Yav-b-equals-3.gif

Нам повезло: это была внешняя линия мультиполигона riverbank (зачем было соединять всё в одну линию?..), поэтому всего-то нужно было разбить её в местах соединений и исключить лишние части из обоих отношений границ районов.

Так мы исправили две ошибки B-EQUALS, но остались ещё две. Они нашлись в Кировской области. Остерегайтесь Кировской области: у них там чёрт ногу сломит, как и в Калининградской. И, поверьте, лучше править только те ошибки, за которыми вы пришли. А не то проснутся хранители.

Но будем осторожны и войдём. На этот раз совпадают границы Слободского района и Слободского городского округа. Качаем оба:

Yav-b-equals-4.gif

Ну да, дырка. Никакого отношения к совпадению границ, просто дырка. Мысленно желаем удачи человеку, осмелившемуся править там границы, и ищем, чем бы эту границу заткнуть.

Находим с одной стороны вот такую загогулину:

Yav-b-equals-5.gif

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

B-CAP-NS: Центр — не населённый пункт

Эти ошибки находятся в Подольском районе и округе Подольск Московской области. Странным образом ролью admin_centre в отношениях этих границ обладают автобусная остановка и перекрёсток автодорог. А должна быть точка города Подольск. Судя по истории, так было и раньше, просто недавно проставили явные роли.

Yav-b-cap-1.gif

Что ж, исправляем. Ищем точку города Подольск, ссылка на неё есть в валидаторе на странице ГО Подольск. Копируем номер точки в JOSM, выкачиваем её и добавляем в оба отношения как admin_center, убирая из отношений левые точки с этой ролью.

S-LAT-MIX: Смесь латиницы и кириллицы

Повезло, ошибку не пришлось долго искать: Ростовская область, вне районов с нарисованными границами.

Yav-b-latmix-1.gif

Суть ошибки элементарна: среди букв названия присутствует латинская, замаскированная под русскую. Такое бывает при импорте GNS. Исправлять тоже несложно: тыкаете в название, срисовываете номер точки в JOSM и заново перевводите название населённого пункта. На этот раз шпион прятался в последней букве «c».

Последовательность

Вот, собственно, и вся наука исправления редких ошибок. Как видно, часть из них совершенно очевидна, но некоторые исправить почти невозможно. Главное — не принять вторые за первые и не натворить ещё больших бед. Не знаете, как править — оставьте эту работу на других.

На практике, конечно, ошибки не ищутся одна за одной по областям, а наоборот, открывается каждый федеральный округ и каждая область по порядку и смотрится, есть ли там кто. Если есть — правим. Можно для поиска использовать карту, но так получается, как ни странно, дольше.

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

S-GNS: Импорт GNS

Шесть с половиной тысяч ошибок сейчас, и десятки тысяч в будущем. Откуда они берутся? Кто-то скопировал точку из реестра GNS, и даже не подвинул её. Поскольку точность координат в реестре весьма условная, то с большой вероятностью такая точка стоит на болоте, на дороге, или висит где-нибудь на дереве в лесу. Её нужно передвинуть в центр деревни или посёлка с соответствующим названием. Проверка на импорт делается по координатам, поэтому нет смысла убирать теги source, например.

И поскольку таких точек слишком много, нужно подумать: стоит ли с ними бороться? Может, тот, кто их добавил такой кучей, сам со временем разберётся? И что вы будете делать с точками, в радиусе десяти километров от которых на спутниковых снимках не разобрать ни единого населённого пункта?

S-WITHIN: Вложенные НП

Один населённый пункт внутри другого. Первый способ получить эту ошибку мы рассмотрели в прошлой главе, при починке S-STATUS. Есть ещё как минимум два очевидных случая, когда возникает эта ошибка. Если искать её целенаправленно, то, пожалуй, потребуется карта (ищите синие ромбики).

  • две точки НП внутри одного полигона place;
  • деревня внутри города, должна быть suburb.