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

Понял. Какой ужас. Вообще-то, ваши стрелки из данных никак не следуют - у дома есть только номера, без улиц и он никуда не ссылается. А у улиц, значит, в 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 полигона?
Возможно ли это?

Теоретически возможно, конечно, но только не всегда оно будет правильно. Часто название района в адресе не нужно.

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

Кстати, ещё есть проблема с улицами, имеющими одинаковые названия и расположенными в одном городе, но в разных районах.
Их можно различать по названию городского района в addr:suburb, но непонятно где брать локализованные названия addr:suburb.
По идее, их нужно брать с тегов мультиполигона городского района. Не?

В osm2mp они берутся из addr:suburb:{lang}

addr:suburb:{lang} нет в вики, не обсуждали, не голосовали, не принимали. И вообще, это что, на каждом домике в таких улицах прописывать кучу addr:suburb:{lang} на разных языках? Ужас!

С чего это? Только улицу. suburb площадной, если что.

Или на каждом домике, или на релейшене улицы.
Других вариантов мультиязычности я не вижу.

Ну, желаю успехов в ожидании :smiley:

Зачем же? Разве оно не может браться с полигона как, например, city?

Ну, вот есть домик с addr:housenumber=11 и addr:street=“Улица Ленина”.
Но одна улица Ленина в Таковском районе города (name=“улица Ленина”, addr:suburb=“Таковский р-н”), а вторая улица Ленина в Сяковском районе (name=“улица Ленина”, addr:suburb=“Сяковский р-н”).

Вопрос: к какой улице Ленина привязан домик?

Так что это будет выглядеть так:
На КАЖДОМ домике теги
addr:housenumber=11
addr:street:ru=улица Ленина
addr:street:uk=Леніна вулиця
addr:street:by=Ленина вуліца
addr:street:en=Lenin Strett
addr:street:ar=OOOOOOO
addr:street:gr=OOOOOOO

addr:sreet:nn=NNNNNNNNN

addr:suburb:ru=Ленинский р-н
addr:suburb:uk=Ленінський р-н
addr:suburb:by=Лєнинський р-н
addr:suburb:en=Leninsky District
addr:suburb:ar=OOOOOOO
addr:suburb:gr=OOOOOOO

addr:suburb:nn=NNNN

Мапперы замахаются вводить ЭТО для каждого домика. И очень большая вероятность ошибки при вводе данных.

Ещё раз: улицы с одинаковыми названиями в разных районах должны обрабатываться также как улицы с одинаковыми названияи в разных НП, а именно по вхождению в полигон города или района, никаких addr:suburb не нужно.

Уже пробовали, получается фигня. Так что нужно явно указывать.

dimonster, попробуй прочесть фразу до конца :smiley: