Проверялка границ по ОКТМО, НП по ОКАТО и улиц по КЛАДР

А вот всё ли вы вытащите из геометрии?

Просто вопрос - а сколько городов в Архангельский области? Действуя по геометрической схеме мы находим отношение Архангельской области. Вот оно - http://www.openstreetmap.org/browse/relation/140337 и натравливаем скрипт. И что в итоге? Город Нарьян-Мар который находится на территории Архангельской области в итог не попал. Ненецкий автономный округ входящий в состав Архангельской области не вошёл в отношение Архангельской области … Аналогичная картина и с Тюменской областью. Обидно? Геометрического алгоритма недостаточно?

А как насчёт работы геометрического алгоритма в случае Иультинского района - http://www.openstreetmap.org/browse/relation/1949881 ? Всегда ли он даст ожидаемые ответы?

Или например граница Нижегородской области и Мордовии - почтитайте обсуждение Сарова на нашем форуме. А теперь сравните контур Мордовии в окрестностях Саров в ОСМ - http://www.openstreetmap.org/browse/relation/72196 и в Яндексе - http://maps.yandex.ru/-/CVbjzD8J Есть разница?

Что значит обидно? Если должно быть верно “Город Нарьян-Мар находится на территории Архангельской области” значит вот эти отношения являются неверными - “Ненецкий автономный округ входящий в состав Архангельской области не вошёл в отношение Архангельской области”. Надо исправлять либо сами отношения либо их административные уровни.

Что значит недостаточно? Вы нашли ошибку в границах благодаря этому алгоритму, даже не запуская его. :slight_smile:

У меня сложилось такое впечатление, то что программисты (в данном случае fserges и другие) на самом деле хотят написать инструмент и под него уже подогнать ОСМ.

Что-то мне подсказывает, то что is_in который здесь обсуждается это такой очень старый костыль, который нужно выпиливать, выпиливать и ещё раз выпиливать.
Почему? Объясню чуть ниже.

И так программист, который спрашивает меня как сделать валидатор насел пунктов (а не адм тер дел) .
На что мой ответ примерно таков:
Первое. Нужна первичная база по которой будет работать валидатор к примеру ФИАС(не ОКТМО, ОКАТО или КЛАДР). Так же с возможностью внесения автором валидатора новых НП, или изменений. И как следствие никаких кодов в виде fias:code (желательно, но необязательно, т.к. если будут какие-то ошибки я не думаю, что исправление бд будет полноценным с кодами кладра и т.п.) .
Второе. Каждая точка деревни должна иметь addr:country, addr:region addr:district и думаю всё же правильным будет указание addr:subdistrict (сельских поселений т.к. они в фиасе есть) при 100% совпадении деревня должна считаться замапленной (соответственно если два одинаковых имени и два одинаковых имени то ок, три или один не ок). Этот пункт я думаю может быть реализован даже на диффах еже минутных!!!
Третье. Когда будет отточен второй пункт. Появится ещё инструмент, а именно проверка полигона точки на соответствие тэгов точки нп. Его например можно cделать из выгрузок гислаба. Не думаю, что получится сразу это реализовать на минутных диффах, хотя всё зависит от искуссности программиста.
Четвёртое. Когда будет реализованы предыдущие этапы и будет готовый продукт, то можно вынести отдельным пунктом разрывы адм границ. Т.е. неправильно замапленными или битыми .
Пятое. Когда останется высшая ступень : ) , то уже проверки нелогичности. Типа почему addr:disctict не равен name соответствующему отношению и т.д.

Теперь я выскажу своё мнение поповоду почему это должно выглядеть именно так,а не по другому. Идея приравнивать и брать тэги из вложенности отношений просто идеальна! Однако на практике она плохо реализуема. Я не говорю про техническую сторону вопроса. А про мапперскую. У нас есть границы до районов, но не для сельских поселений(или штучные, далее сп). Для сп их так просто не обрисуешь + они постоянно меняются. Поэтому я считаю, что реализация проверки наличия деревни (по addr:*) должна быть отдельна от проверки границ. Реально обоснованным последним перед названием думаю максимум сельские поселения, хотя может всё же имеет смысл использовать административное деление (т.е. страна, область, район, нп), т.к. тут можно напридумывать много: Страна, область, район, сельское поселение, сельский округ, нп.

А если серьёзно сказать fserges начни уже писать)))), т.к. практика показывает, что не вики и участники диктуют как маппить, а валидаторы))). Т.к. они приводят к одинаковой схеме тэггирования на всей территории страны. И если мапперы захотят использовать валидатор , то либо им придётся подстраиваться под него, либо не использовать.

Извините за 5 минут вашей жизни потраченных на чтение этих строк. Более коротко не получилось.

lenux, это называется “схема Карлсруэ” и в русском OSM на практике никем не применяется. Причина проста: поддерживать 100500 копий адресного дерева на каждом объекте нереально.

Alexandr Zeinalov прочитал в вики. Там говорится о домах. Я же предлагаю делать исключительно для НП. В ЯО их порядка 6к, значит с полигонами всего 12к и для очень большинства все они прописаны. Прописывать все addr: до нп для домов(и для объектов внутри нп) не нужно. Это не логично, т.к.они находятся в полигоне нп. А его пусть и формальные границы всегда можно нарисовать.
Однако как я думаю не стоит говорить о схеме реализации валидатора приравнивать к реализации других вещей, типа адресного поиска, пои и т.д. Т.е. тем самым например полный адрес соседнего магазина или НП в поиске строится по одному принципу, а в валидаторе по иному принципу.

Я использую subarea

Не весь ОСМ денно и ношно сидит на форуме
Вопрос странный, вроде всё очевидно. is_in - это аналог subarea времён отсутствия в ОСМ отношений. В те далёкие времена так пытались наладить семантику вложенных объектов. Он полностью потерял значение с появлением релейшенов. Suarea - это как раз тот дополнительный механизм контроля целостности про который вы говорили выше. У него есть недостаток - он реализован через отношения, а отношения легко рушить. Но польза от него на мой взгляд с лихвой это покрывает. Давайте кто-нибудь мне расскажет, как без гемороя выгрузить в JOSM границы Московской области, 3-4ёх входящих районов и вложенных поселений. Я понимаю, что случай очень частный, но как иначе следить за этим непростым зоопарком в отсутствии валидатора границ?

Мне нужен. Вы его сносить собрались? Это явно не случай кладротегов.

Научите - КАК вы это делаете? Вот сколько использую subarea, ни разу с этим проблем не имел. Серьёзно. Мне очень интересно, где же эти грабли, мимо которых я постоянно промахиваюсь.

По всей стране их порядка 200 тыс.

В России нет формальных границ нп. Есть лишь границы поселений, в которых границы отдельных нп не определены или не всегда определены.

Например, у меня на даче нет границы деревни. Всё, что можно нарыть, это то, что есть два кадастровых квартала с довольно странными границами. Но кадастровое деление не является административным.

… и мы придём к тому, что у нас будет 100500 разных адресов у одних и тех же объектов: по навигатору, по валидатору, по ФИАС и тд. Зачем нам это нужно?

osmosis --tf accept-relations type=boundary --uwn usedByTag=false

Напомню также известную историю с попытками создать relation всех снимков Bing высокого разрешения.

Иногда мне кажется что мы говорим на разных языках, поэтому приведу свой опыт. Я здесь ничего не предлагаю, только описываю свой опыт.

Я веду БД с “поселениями” около 10 лет и со всеми НП около 5 лет. Сколько и в каких регионах населённых пунктов можно подсмотреть здесь (данные немного устарели но порядок тот же) - http://www.gks.ru/free_doc/new_site/perepis2010/croc/Documents/Vol1/pub-01-03.pdf Раз в год (иногда чаще, спасибо “Большой Москве”) я эти данные актуализирую и ничего. Я не анализирую никакие геометрии. Я знаю что есть деревня Петрово Судогодского района Владимирской области и есть деревня Петрово Бабаевского района Вологодской области. Я это вбил один раз а могу извлекать сколькоо хочу. Зачем мне перечитывать иерархии или геометрии каждый раз когда мне нужна информация по какому-то району или по объектам относящимся к деревне Петрово? Даже если это относительно несложгная процедура - зачем? Количество НП не такое уж и большое и вполне валидируемое. Я читаю какие-то страшилки что “всё пропало”, деревень в России миллионы и новые деревни появляются сотнями если кто-то запортит одну-другую деревню то всё. Но ошибку найти легко и исправить.

Но итогом дискуссий я наверное считаю что лучше иметь валидный классификатор АТД/населённых пунктов у себя в личной БД, что либо улучшать в ОСМ бессмысленно ибо ничем кроме пустых споров не заканчивается. Просто наставлю костылей в программе импорта в мою БД и этого достаточно. А критические ошибки (сломанные границы, ошибки в названиях, вандализм) стоит предлагать как результат работы валидатора.

Повторюсь - это просто наблюдение, ничего менять в ОСМ я не собирался а теперь и подавно не собираюсь.

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

Я боялся, что их миллионы. Если меня хватило (и ещё несколько активных мапперов до меня), то следовательно для 200к нас пунктов нужно порядка 33 (дада 33 богатыря:D и дядька Черномор) Даже если по 4-ре человека на область и у которых цель обмапить нас пункты, то всего 120-200 человек хватит, правда очень активных, а не делающих правки раз в день по 3-4 объекта(30 точек и 10 линий).

Так мы формально считаем границ нп -границу участков. Я так маплю деревни вообще от дома несколько метров, не обводя частные случаи у кого больше земли за домом у кого меньше. И все довольны. Главное в границы внести жилые дома.

Пока что у нас нет классификации для нас пунктов(чёткой до какого уровня указывать). Поэтому я не вижу ничего где было 100500 разных адресов :wink: . Хотя если с другой стороны посмотреть, всё кажется лаконичным. Например разработчики osm.org.ru вполне учли, что деревни надо искать и показывать по точкам, а на главном osm.org всё дублируется.
И как следствие главный вывод в том, что нам нужно наполнять базу. И если на текущем этапе программисты не знают как поддерживать 100500 копий, то завтра вполне и техника сможет, и программисты научаться.
Хотя я думаю мы говорим о разных вещах.

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

  1. Принять “стандарт”(я не говорю, что его должны “одобрить” я имею ввиду для себя для валидатора), что деревни например описываться должны так: Страна,область,район,название и не обязательные: тип,окато, октмо
  2. По такому “стандарту” распарить ФИАС. Исходный файл я полагаю будет до 1 Гигабайта (т.к. фиас 1,5гбайт но там с улицами почт индексами и т.д.). Предположим, что 200к нас пунктов. Если очень грубо посчитать, что на каждую ячейку по 40 символов, юникод 8байт, значит для 200к деревень: 200000408*7/1024/1024=427мбайт. (Если с юникодом, а без него 53 мбайта)
    3.1. С помощью osmfilter из local.osm или из planet.osm (по тех возможности) выбрать точки деревень (place=town|village|hamlet) с addr:country=RU, что из себя образует osm файл размером с несколькими может сотнями мегабайт (максимум). (на local.osm у меня вроде заняло минут 15-ть, или 10-ть и то всё упёрлось в hdd)
    3.2. С помощью osmconvert из полученного ОСМ файла преоборазовать в csv где будет id, и 7-мь столбцов по “стандарту” (тут даже из файла п.3.1 всё делается молниеносно)
    Мини итог: п.1-2 я не знаю сколько времени займут. 3-ий занял у меня час на чтение мануалов : )
  3. Таким образом в идеале получится одна табличка с ФИАСом 100-500 мбайт, а другая с деревнями из ОСМ такая же. Т.е. в оперативку они войдут полностью. И задача будет сведена к сопоставлению двух массивов. Впринципе по желанию можно их будет загнать в любой инструмент который тебе будет удобен например SQLite , MySQL
  4. Анализ этих двух табличек должен выдать результат в виде ещё нескольких табличек: 1. Деревни, которые есть в ФИАС, но нет в ОСМ 2. Деревни, которые есть в ОСМ, но нет в ФИАС 3. Деревни, которые есть в ОСМ, но нельзя сопоставить в ФИАС (например в ФИАСе 2 деревни с таким названием, а в ОСМ получилось 1 или 3 деревни)

И мои поздравления! Валидатор готов.
Мы же будет загружать и в том же Excel е смотреть результаты работы скрипта. Я думаю, что возможно в будущем можно на минутных диффах сделать такие обновления ;).

Да, блин. Да. Снова и снова.

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

по ФИАС есть такая - http://wiki.gis-lab.info/w/ФИАС информация на gis-lab’е

В рамках моих колупаний с ФИАС и ОСМ могу сказать: ФИАС по этой схеме вытащить можно. ОСМ сложнее.
Это связано с тем, что у ФИАС для каждого объекта прописан уровень, а у ОСМ не для всех (admin_level на тех же деревнях скорее исключение чем правило)

Ну если спросить лично меня, то я бы сказал так: есть база ФИАС. Поскольку она описыват существующее деление, то эти объекты должны быть в ОСМ. А еще в ОСМ должно быть много чего.
Так что главная задача - найти такое наибольшее множество данных, которое бы описывало бы и административные (ФИАС) и бытовые реалии, дополнив потом с обоих сторон. Тогда ОСМ сможет осуществлять привязку административной теории “к земле” (создав “заглушки” для чисто административных сущностей мы все равно дадим им больше реального воплощения чем строчка в документе, как сейчас).

Scondo вытащить из ОСМ можно и так (полагаю, что текстовый файл разделенный запятыми парсить легче чем xml или его потом зафигачить в удобную бд):
Для НП:

  1. bzip2 -d RU-YAR.osm.bz2
  2. ./osmfilter RU-YAR.osm --keep=“addr:country=RU AND addr:region= AND addr:district= AND (place=town OR place=village OR place=hamlet OR place=city)” --drop-ways --drop-relations --ignore-dependencies > res.osm //Магия
  3. ./osmconvert res.osm --drop-ways --drop-relations --out-csv --csv-headline --csv-separator=“,” --csv=“@id addr:country addr:region addr:district place name” > out.csv //То же магия
    После очистки от других областей в Calc (аналог Екселя в libreoffice) 5067 точно относится к области и ещё 1234 нп имеющих только названия и place . И одна просто точка деревни без названия.
    Думаю эти 1к нас пунктов можно исправить за 3-4часа.

Теперь для улиц, к сожалению, я думаю подойдёт проверка только по cladr:code поскольку тэги вроде addr: не проставляются массово.

  1. ./osmfilter RU-YAR.osm --keep=“highway= AND name= AND cladr:code= AND cladr:suffix= AND cladr:name=” --ignore-dependencies > res.osm
  2. ./osmconvert res.osm --out-csv --csv-headline --csv-separator=“,” --csv=“@id @oname highway addr:city cladr:code cladr:suffix cladr:name name” > out.csv
    Для Ярославской области(ЯО) всего 2632. По СГ 2445 улиц.
    Теперь для домов. Я думаю, что минимум из тэгов на домах может висеть addr:city (проставляется быстро для всего города) , addr:housenumber - номер, addr:street- улица.
    При желании получить кладр улиц, то см предудыщий пункт по улицам. Полагаю что названия города + улицы будет уникальным.
  3. ./osmfilter RU-YAR.osm --keep=“addr:city= AND addr:street= AND addr:housenumber= AND building=” --ignore-dependencies > res.osm
  4. ./osmconvert res.osm --out-csv --csv-headline --csv-separator=“,” --csv=“@id @oname addr:city addr:street addr:housenumber building name” > out.csv
    Для ЯО получилось 17760 домов. Учитывая, что по СитиГиду 23886 адресов. А без addr:city (только улицы, дома и номера) получилось 25303 пункта, то можно тогда предположить, что просто это решается навешиванием addr:city

В заключение хочу сказать, что данные операции выполнялись быстро, на local.osm и тем более на planet.osm не получилось проверить. Т.к. это будет в моём случае не тест производительности этих приложений и способа, а тест моего жёсткого диска.

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

  • Есть ряд тэгов addr:country addr:region addr:district addr:city , который при правильном и аккуратном использовании поиска в JOSM проставляются массово и быстро. И я не думаю, что этого стоит боятся.

Ну вот, опять все проблемы предлагают решать не программированием, а добавлением сотни тысяч тэгов…

ок. Alexandr Zeinalov вы сможете напрограммировать нам валидатор по фиас?

Максимум что можно было бы вешать это addr:city, остальная иерархия тут очень лишняя.

lenux, если вы не можете запрограммировать нам валидатор, то теги addr:city на всех объектах вам не помогут. Проверять геометрическую вложенность не сложнее, чем проверять тег.

Образцы кода есть и на жаве и на перле.