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

Схема отлично работает с мультиязычностью, но у нее побольше накладные расходы (для построения полного адреса нужно последовательно вытаскивать всю цепочку отношений, что и делает препроцессор), чем у схемы с адресацией, основанной на вхождении в полигон НП. Еще один минус схемы - он корректно работает только в условиях строгой вложенности.
Я ж для того и предлагал сократить вложенность ровно до двух (дом и город), чтобы данные можно было использовать напрямую из объектов и, на мой взгляд, более дуракоустойчивую.
По сути это похоже на схему с отношениями, но не с последовательной вложенностью, а с вложенностью, равной двум: все внутригородские атрибуты адреса (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:

Почему?

Тогда в любом случае без :{lang}. Пусть ищет район как хочет и берёт переводы с него. Как и с улицей.