Як правильно вказувати адресу ?

нова змінна, щоб зробити next якщо вона порожня. можна зробити без неї, звичайно, присвоювати зразу в street_name

name_from_list читає заданий список для street він заданий був name:ru,name, і з відповідного об"єкту бере підходящу назву.

а проблему з addr:street я не чіпав, значить, воно і до мене не працювало.

на рахунок меншої кількості - можете додати перед next if !$street_name; стрічку $street_name = name_from_list( ‘street’, $reltag->{$relation_id} ) if !$street_name; - хай в крайньому випадку заповнює з назви відношення.

Спробую прибрати. Я не профі-програміст, але вважаю, що зайва операція присвоювання у циклі - то не є добре.

О, дякую. Тепер починаю трошки розуміти :slight_smile:

я й не звинувачую. В оригінальній версії така сама проблема.

IMHO, відсутність членів типу street у релейшені - це помилка. І відсутність назв у тих членів - теж помилка. І ці помилки треба виправляти в базі OSM, а не у конверторі. Наявність тисячі таких релейшенів у Харкові - це результат незавершеного імпорту даних dima_ua.
“Причешемо” імпортовані дані - таких помилок не стане.

Однак рядок $street_name = name_from_list( ‘street’, $reltag->{$relation_id} ) if !$street_name; я додам. Нехай буде.

Гм. Щось я нахомутав у скрипті…
Рядок street_name = name_from_list( ‘street’, $reltag->{$relation_id} ) if !$street_name; схоже, не працює, бо кількість будинків така сама, що й без нього.

if ( $flags->{street_relations} ) {
    for my $type ( qw{ street associatedStreet } ) {
        my $list = $relations->{$type};
        next if !$list;

        while ( my ($relation_id, $members) = each %$list ) {
            my $street_name;
            for my $member ( @$members ) {
               next if !( $member->{role} eq 'street' );
               next if !( $member->{type} eq 'way' );
               $street_name = name_from_list( 'street', $waytag->{$member->{ref}} );
               $street_name = name_from_list( 'street', $reltag->{$relation_id} ) if !$street_name;
	       next if !$street_name;

               last;

            }
            next if !$street_name;
            
            for my $member ( @$members ) {
                next if !( $member->{role} ~~ [ 'house', 'address' ] );
                $street{"$member->{type}:$member->{ref}"} = $street_name;
            }
        }
    }
    printf STDERR "  %d houses with associated street\n", scalar keys %street;
}

я мав на увазі перед іншим next if !$street_name; :slight_smile: той, який перед for my $member

Переробив. Тепер працює правильно. А я потроху починаю розуміти логіку роботи програми

if ( $flags->{street_relations} ) { 
    for my $type ( qw{ street associatedStreet } ) {
        my $list = $relations->{$type};
        next if !$list;

        while ( my ($relation_id, $members) = each %$list ) {
            my $street_name;   -   створюємо змінну 
            for my $member ( @$members ) {    перебираємо у циклі всіх членів релейшена
               next if !( $member->{role} eq 'street' );   переходимо до наступного члена, якщо роль не street
               next if !( $member->{type} eq 'way' );    переходимо до наступного члена, якщо тип не way
               $street_name = name_from_list( 'street', $waytag->{$member->{ref}} );  беремо назву вулиці з тегів члена релейшена. Тут, чесно кажучи, я ще не зовсім зрозумів синтаксис. Ну нехай.
               next if !$street_name; переходимо до іншого члена, якщо назву вулиці не чомусь отримали.
               last; Закінчуємо цикл, бо назва вулиці вже знайдена.
            }
	    $street_name = name_from_list( 'street', $reltag->{$relation_id} ) if !$street_name;  якщо серед членів релейшена не знайшли того, кто має роль sreet, тип way та має в тегах назву вулиці, то беремо назву вулиці з тегів релейшена.
            next if !$street_name; якщо й в тегах релейшена не знайшли назву вулиці, то це не релейшен, а якась недороблена гидота. Переходимо до іншого релейшена
            for my $member ( @$members ) { знову перебираємо членів релейшена (якщо вже знаємо назву вулиці)
                next if !( $member->{role} ~~ [ 'house', 'address' ] ); переходимо до іншого члена, якщо роль не house або address
                $street{"$member->{type}:$member->{ref}"} = $street_name; записуємо в теги члена релейшена назву вулиці
            }
        }
    }
    printf STDERR "  %d houses with associated street\n", scalar keys %street;
}

Сконвертував карту Харківської області з пропатченим конвертором. Відкрив у GPSmapEdit. Перевірив адреси. Патч працює правильно.

Думаю, вже можна турбувати liosha щодо включення цього патчу в офіційну версію.

…а польский формат может хранить адрес только на одном языке?

По моему, да. Нужный язык выбирается перед конвертированием из OSM в польский формат. (но я могу и ошибаться)

Замість того, щоб вмовляти реалізовувати зміни в конверторі можна спробувати трохи інакший шлях - звести osm-файл до того вигляду, що очікує liosha.
Це можна зробити написавши(на Java) плагін для Osmosis’а або просто незалежну утілітку, який переноситиме в name/addr:street об’єктів значення з потрібних name:**.
Так само можна генерувати addr:district, addr:region базуючись на геометричних включеннях одними полігонами інших.
Приклади плагінів тут: http://svn.openstreetmap.org/applications/utils/osmosis/plugins/

ну, препроцесінг це хороший варіант :slight_smile:

проблема в тому, що тепер постало питання - а чи справді варто на hw ставити всі можливі name:xx чи може їх перенести в відношення? імхо, ця ідея має сенс, в добре відмаплених можна зняти теги name:xx з купи поділених відрізків (яких може бути і 2, і 20) і внести у відношення. Нема дублювання - менше проблем з невірними назвами і необхідністю вносити name:xx на всі можливі відрізки. А в погано відмаплених містах нема таких проблем з кількістю відрізків і іменами на них

Якщо така ідея прийнятна, буде потрібно якийсь пропозал написати, чи що…

Особисто мені така ідея зрозуміла і прийнятна, але все ж таки досить багато конверторів і рендерів використовують саме name:** на лініях
Видалення name:** в лініях буде розцінюватися як вандалізм

Хлопці, є ще такий нюанс стосовно релейшенів.

Я натрапив на ситуацію, коли для однієї вулиці було два релейшена (перший релейшен хтось зробив вручну, другий виник після імпортування даних dima_ua)
Перший релейшен мав тег type=associatedStreet, інший мав тег type=street. При цьому частина будинків та лінія вулиці були в першому релейшені, а інша частина будинків - у другому. А оскільки релейшени були різних типів, то у переліку релейшенів вони розташувалися не поруч. Якби ДЖОСМ при наборі не підкинув автоматом назву вулиці та якби я не тицнув на один з будиночків, я б навіть не дізнався, що є дублікат релейшена.

Давайте вже якось дійдемо згоди щодо використання street або associatedStreet
“Плюси” street

  1. коротше писати (однак це не досить вагомий аргумент, оскільки при набиранні ass… автоматично підкидається associatedStreet

“Плюси” associatedStreet

  1. цей тип є рекомендованим у пропозалі схеми Карлсруе (а про street написано лише “дозволяється використання”)
  2. JOSM (з relation toolbox) більше любить associatedStreet. Навіть вміє (однією кнопкою) розтавляти ролі street, house. А також автоматично прописує в тег релейшена name з відрізків вулиці.

Очевидно що плюсів в associatedStreet більше і вони вагоміші.
Використовую саме його, тому що так само прочитав в документації.
І будуть ще люди, які спочатку читають документацію, а потім вже діють. Не всі одразу занурюються в Potlatch з думкою “о, зараз я все перероблю, тут і так все зрозуміло, нащо ті інструкції” :slight_smile:

Ну, тоді може треба буде пройтися роботом по релейшенах та замінити street на assosiatedStreet. Тільки спочатку імпорт по Харкову закінчемо.:slight_smile:

А я не бачу зовсім переваг assosiatedStreet перед street. В першому випадку теги відношення обмежуються лише type і name, а в другому можна використовувати всі доступні теги. Потім, assosiatedStreet допускає лише street і house, а street дозволяє прив’язати будь-який об’єкт до вулиці. Так що ні в якому випадку не варто

А більше й не треба. А якщо й буде треба (як зараз у Харкові тимчасово додаємо street_id з номером), то можна додати й власні теги. Нема там тих обмежень.

А більше й не треба. А якщо треба прив’язати якійсь об’єкт, що не є будинком, то просто пропишіть йому у релейшені роль house.

Ще й як варто! Інакше й надалі будуть виникати дублі релейшенів.

Хлопці, де ви то взяли? На сьгоднішній день street та associatedStreet є повними сінонімамі.

Я сам починав мапити як associatedStreet, але потім, після виходу втулка relationtoolbox переключився на street через те, що підтримка associatedStreet в ньмоу певний час була відсутня.

Якщо ви бачите два зв’язки, їх треба об’єднати, один видалити, я видалаю більш нові. Об’єднання я роблю так:

  1. Вибрати відношення, яке буде видалено у reltoolbox (вулиця → два кліка на відношенні)

  2. Скопіювати відношення у буфер обміну (ctrl + c)

  3. Праву кнопку на назві відношення → Виділіти всі члени відношення

  4. Переключитися знову на відношення, видалити його

  5. Вибрати, яке залишиться (вулиця → два кліка на відношенні у reltoolbox)

  6. Скопіювати теґи (ctrl+shift+v)

  7. У історії виділень знайти виділення всіх членів старого відношення (зазвичай воно перед пунктом “неможливо вибрати”, тим, де було старе, вже видалене відношення)

  8. Перейти на редагування відношення (олівець у reltoolbox), відкриється стандартний діалог

  9. Зі списка справа перенести члени у відношення. Буде питання, чи дублювати члени у нове, сказати “ні”, і можливо “більше не питати”

Трохи воно задовге, може якось написати плагін, але думаю, що то не часта операція.

Ну, так або так як в вікі написано, або так як хочеться. Тут треба вже вирішитися. Не можливо в одному місці казати, що треба слідкувати вікі, а в іншомо казати, що обмежень немає. В ОСМ взагалі немає ніяких обмежень на теги.

Навіть якщо це віртуальний об’єкт? Тим самим підмінити одну суть іншою і втратити інформацію? Ні, дякую.

Від дублів варто позбавлятися, але не варто змінювати масово одне відношення на інше без очевидних переваг, лише томущо одне відношення зручніше прописувати в одному редакторі.

Якщо об’єкт має роль house, то мається на увазі, що об’єкт “виконує роль” будинка при адресації. Це не значить, що об’єкт сам стає будинком.

Якщо актор у театрі виконує роль Юлія Цезаря - це не значить, що актор насправді стає Юлієм Цезарем :slight_smile:

Ну так у вікі й написано: type=associatedStreet
І не написано, що неможна додавати власні теги до релейшену. Але це будуть лише ваші власні теги. Ніхто не зобов’язаний їх потім обробляти (у конвертерах, у рендерах). А яких тегів у релейшені не вистачає? note? description?

І як ви пропонуєте це “мається на увазі” програмно розпізнавати?

Покажіть мені, де тут написано, що допускаються інші теги. Якщо “власні” теги ніким не будуть оброблятися, то для чого вони тоді потрібні?
Не вистачає, наприклад: highway, name:*, surface, …