Мультиязычные адреса

Немножко про Беларусь.

Дом линкуется к улице по addr:street=name + ближайшее расстояние.
name:* лежат на линии улицы, в доме - только addr:street.
Если в доме несколько адресов, то адреса стоят на точках внутри зданий и линкуются аналогично.

Как это работает, можно посмотреть по указателю вверху карты, например, на http://openstreetmap.by/?zoom=18&lat=53.898315&lon=27.556999 - попереключайте языки, чтобы увидеть разные адреса на русском-английском-белорусском.

Попытки решать это как-то иначе (через сложные релейшены, тегами addr:street:*) в целом показали свою неэффективность.

Но почему тогда при конвертации не подхватываются name:ru с тегов линий улицы, а берётся значение addr:street на том языке, на котором оно написано?

Я имел в виду вот это http://www.openstreetmap.org/browse/relation/81697
a1 - Страна

a6 - улица с домами

Структурированная схема, готовая для конвертации, с name:*
Можно про нее поподробнее, и функции препроцесорра который, насколько я знаю, ее обрабатывает перед конвертацией в MP

Точки даже рассматривать не стоит.

Нет. Во-первых, иметь две схемы нельзя, во-вторых, сложность никуда не девается.

Это не решение проблемы, а уход от нее.
Адреса - объективно у дома, а не у точек внутри него. У нас же получается, что у одного объекта все равно не может быть двух разных адресов, а разные адреса - у разных объектов (у полигона и у точки).

Это нелогично: правило должно быть одно - общее.
Это во-первых.
А во-вторых, чем тег name:* отличается от других тегов, что убирать нужно именно его?
И что делать в случае, когда улица обозначена hw=residental, а в отноршении - она же hw=primary?

Выше чем где? В варианте с точкой внутри дома с самостоятельным адресом?
Система адресации в первую очередь должна быть логичной и только после этого компактной.
Правильно надо расставлять приоритеты. Иначе вместо “улица Ленина” нужно писать исключительно “ул. Ленина”, а то иначе “профит отрицательный”.

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

Мне кажется это неверно, т.к. направление связей обратное тому, которое должно быть. Адрес должен ссылаться на дом, а не дом на список адресов.

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

Тогда по факту вообще ничего использовать нельзя, т.к. “полной поддержки во всех редакторах” нет вообще ни у чего.

Как в отношение вообще попало hw= ?
Что-то я пролестнул назад и не нашел объяснения чем плохо если указать в роли для дома “1” в одном отношение (главная улица для дома) и “2” или пусто в другом (второстепенные и прочие дублирующие адреса) ?

Это надо спрашивать у того, кто туда его поместил. Могу лишь отметить, что это достаточно распространенная практика.

На сегодняшний момент неофициально подразумевается, что если в роли стоит цифра “1”, то это значит “дом номер один”.
Проблема здесь в том, что адрес не обязан быть числом, поэтому не существует формального алгоритма способного определить, что значение роли является именно адресом, а не чем-то иным.
По-хорошему должно быть что-то вроде “role=bno:123a литер Ц корпус 11 строение 8”, где “bno:” - служебное слово для отличия адресов от всего остального.

Это предположение неверно.

Это неверно. Потому что на практике есть один главный адрес + (десяток неофициальных) * (десяток разных написаний), и все они используются.
Главный адрес надо писать на доме в рендерах и именно его использовать там, где поддерживается только один адрес. Но дом должен искаться и по любому из остальных адресов.

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

Тэги, тэги. Поэтому альтернативы карлсруэ и нет.

Тем что это невозможно сделать. Нельзя понять какое отношение главное.

Не понимаю почему так.

Берем дом, берем его отношения и ищем в них его с ролью равной числу “1” → Это его главная улица. Соответственно наоборот, берем отношение “улица” пробегаем по домам, в них сверяем номер с нужным индексом в доме → находим нужный дом.

Понял. Какой ужас. Вообще-то, ваши стрелки из данных никак не следуют - у дома есть только номера, без улиц и он никуда не ссылается. А у улиц, значит, в role задаётся номер номера дома в доме.
Ну это немного нежизнеспособно. Схема хрупкая, ибо от смены любого номера всё рассыпается. Данные размазываются по нескольким объектам, для редактирования надо лезть во все. Собрать адрес можно только имея все объекты, причём довольно интересно как будет выглядеть на SQL извлечение номера по номеру… Не, не канает.

Схема отлично работает с мультиязычностью, но у нее побольше накладные расходы (для построения полного адреса нужно последовательно вытаскивать всю цепочку отношений, что и делает препроцессор), чем у схемы с адресацией, основанной на вхождении в полигон НП. Еще один минус схемы - он корректно работает только в условиях строгой вложенности.
Я ж для того и предлагал сократить вложенность ровно до двух (дом и город), чтобы данные можно было использовать напрямую из объектов и, на мой взгляд, более дуракоустойчивую.
По сути это похоже на схему с отношениями, но не с последовательной вложенностью, а с вложенностью, равной двум: все внутригородские атрибуты адреса (a4-a6) навешиваются на дом, а все атрибуты адреса города (a1-a3) - на город (или же дом входит во все внутригородские отношения, а город - во все отношения региональные).
Дополнительно предлагается разрешить использовать не числовые, а общепринятые названия (addr:a1 = addr:state = addr:region = addr:province etc). Конкретные теги есснно обсуждаемы.

Пока идет дисскусия, хочу предложить мой способ, получить name из name:ru - там где это прописано соотвественно.
Я думаю этот вариант будет полезен тем, кто конвертирует данные напрямую из OSM файлов.

Нам понадобится osmosis и 2 плагина к нему TagTransform и relationtags
первый проход, члены отношения street и associatedStreet в свои свойстава получают associatedStreet:name:ru и street:name:ru, с помощью relationtags
osmosis.bat --rb UZ.osm.pbf --rt types=street,associatedStreet separator=: --wx uzbekistan.osm

потом, с помощью плагина TagTransform все что имеет тег name:ru - переводим его в name
osmosis.bat --rx uzbekistan.osm --tt --wx uzb_ru.osm
используется такой transform.xml


<?xml version="1.0"?>
<translations>
 
  <translation>
    <name>Fill name from name:ru</name>
    <description>Find all tags with name and name:ru.</description>
    <match mode="and">
      <tag k="name" match_id="name_uz" v=".*"/>
      <tag k="name:ru" match_id="name_ru" v=".*"/>
    </match>
    <output>
      <copy-all/>
        <tag k="name" from_match="name_ru" v="{0}"/>
     </output>
  </translation>
 
</translations>

последний этап, перевести теги associatedStreet:name:ru и street:name:ru , полученные в результате первого прохода в addr:street
osmosis.bat --rx uzb_ru.osm --tt file=streetname_ru.xml --wx uzbekistan.osm
используется такой streetname_ru.xml


<?xml version="1.0"?>
<translations>
 
  <translation>
    <name>Replace addr:street from name:ru tag in street relation</name>
    <description>Find all tags with name and name:ru.</description>
    <match mode="and">
      <tag k="associatedStreet:name:ru" match_id="streetname_ru" v=".*" />
      <tag k="associatedStreet:role" match_id="1_ru" v="house" />
    </match>
    <output>
      <copy-all/>
     <tag k="addr:street" from_match="streetname_ru" v="{0}"/>
     </output>
  </translation>
 
  <translation>
    <name>Replace addr:street from name:ru tag in street relation</name>
    <description>Find all tags with name and name:ru.</description>
    <match mode="and">
      <tag k="street:name:ru" match_id="streetname_ru" v=".*" />
      <tag k="street:role" match_id="1_ru" v="house" />
    </match>
    <output>
      <copy-all/>
     <tag k="addr:street" from_match="streetname_ru" v="{0}"/>
     </output>
  </translation>
</translations>

Замечания и предложения по улучшению приветсвуются.

PS если кто-то знает как заполнить addr:region и addr:district населенных пунктов из name:xx соотвестувующих полигонов - прошу поделиться.

А зачем эти сложности?
Конвертер osm2mp с патчем от larry0ua умеет получать названия улиц из тегов линий улицы, входящих в релейшн или из тегов самого релейшена. Без осмозиса и плагинов.
А вот когда есть домик с addr:street=Названиененарусском и рядом улица с name=Названиененарусском и name:ru=Русскоеназвание, то получить оттуда русское название улицы конвертер не может.

Вот это ещё нерешённая проблема.
Вообще-то при создании карт под навигатор карта страны разбивается осмозисом на области. И при конвертации название области указывается вручную в bat-файле.
А вот с названиями районов в addr:district действительно проблема. Как мне кажется, конвертор должен делать так: берём координаты точки, обозначающей центр населённого пункта, смотрим, в территорию какого района она попадает, берём название (на нужном языке) с тегов границ района, прописываем это название в addr:district
(по аналогии с привязыванием улиц к населённым пунктам).

А addr:district - как? у меня в одной области 2 населенных пункта с одинаковым названием в разных районах. Да и недоросла наша страна для разбивки на области еще, всю страну конвертеры еще переваривают.

Один из вариантов в тегах addr:region и addr:district использовать ISO 3166, а потом коды пост-процессором переводить в нужный вариан name

Для district-ов исо-коды не определены

Насколько сложно сделать в osm2mp или вообще в отдельном скрипте, анализ в каком районе и области находится населенный пункт, по границе мультиполигона и проставить для него addr:region и addr:district из name:xx полигона?
Возможно ли это?