Конвертер OSM -> MP

Беру pbf c ГисЛаб, osmconvert разворчивает в .osm
потом этот файл отдаю в osm2mp ключ bpoly указывает на файл границы, external_node отсутвуют.

если речь про конструктор - то в GUI режиме может, см. Multi Chart… в пакетном - вряд ли

имхо смысла нет - увеличение времени конвертации растет по экспоненте в косвенной зависимости от объема польского.
по моим замерам - исходники до 100 мегабайт конвертятся в dcm несколько минут, около 150 - уже порядка 20 минут.
опять-таки - оперативка не резиновая, да и не забываем про ограничение для 32х битного приложения.
зы. если mplua еще интересует - могу выложить

Странно, у меня на дороге создаются два внешних нода, с одной и другой строны обрезки. А не может быть, что Ваша обрезка захватывает шире, чем граница дампа, и не пересекает дороги?

Я страну не режу. Я конвертирую по регионам (областям). Всё хорошо. Иногда режу область - по границе районов. И то же норма вроде.

Кто раскажет про применение в settings.xml раздела:
################################

Tags to skip

################################

— skip_tags

created_by: 1

Хочу скажем добавить name:pl (name:de…). Как то не срастается - то выдаёт ошибку, то просто не замечает.

Marych73
Я режу osmconvert`ом по офсетным границам (чуть большего размера) с ключами -v --drop-author --emulate-osmosis --complete-ways --complex-ways, а потом конвертирую уже по точным. Всё стыкуется отлично.

У кого то сохранились старые версии getbound.pl? Пытаюсь на Linux запустить под perl 5.22, osm2mp там заработал как часы, а с getbound`ом засада. У меня две версии с разными ошибками не запускаются.
PS: Устал от глюков perl под виндой. Карты выборочно вылетают при конвертации, а под Linux те же самые без проблем.

Только такая - https://yadi.sk/d/r3icnWIH3GEqnW

А что за ошибки, если не секрет?

Не секрет, вот с последней доступной:


user@user-linux-pc ~/Russia/getbound $ ./getbound.pl 60189 -o Russia.poly -onering
Smartmatch is experimental at lib/App/OsmGetbound/OsmApiClient.pm line 163.
Smartmatch is experimental at lib/App/OsmGetbound/OsmApiClient.pm line 167.
Smartmatch is experimental at ./getbound.pl line 154.
Downloading relation ID=60189
GET http://www.openstreetmap.org/api/0.6/relation/60189/full
Strings with code points over 0xFF may not be mapped into in-memory file handles
Can't open 'SCALAR(0x240b800)' for reading: 'Invalid argument' at lib/App/OsmGetbound/OsmData.pm line 94
 
Файл poly при этом не создаётся.

У меня с ней ошибки что выше.

А вот ошибки с более старой:


user@user-linux-pc ~/getbound1 $ ./getbound.pl  60189 -o Russia.poly -onering
Smartmatch is experimental at ./getbound.pl line 147.
Smartmatch is experimental at ./getbound.pl line 442.
Smartmatch is experimental at ./getbound.pl line 446.
Downloading relation ID=60189
GET http://www.openstreetmap.org/api/0.6/relation/60189/full
Strings with code points over 0xFF may not be mapped into in-memory file handles
read error at /usr/lib/x86_64-linux-gnu/perl5/5.22/XML/Parser/Expat.pm line 474.

Сейчас попробовал так же имеющуюся у меня exe`шную версию под linux, вот такие ошибки (стоит Wine):


user@user-linux-pc ~/getbound1 $ ./getbound.exe  60189 -o Russia.poly -onering
fixme:msvcrt:MSVCRT__wsopen_s : pmode 0x01ed ignored
fixme:msvcrt:MSVCRT__wsopen_s : pmode 0x01ed ignored
fixme:msvcrt:MSVCRT__wsopen_s : pmode 0x01ed ignored
fixme:msvcrt:MSVCRT__wsopen_s : pmode 0x01ed ignored
Can't locate Win32.pm in @INC (@INC contains: .) at -e line 779.
BEGIN failed--compilation aborted at -e line 965.

подкинул Win32.pm


user@user-linux-pc ~/getbound1 $ ./getbound.exe  60189 -o Russia.poly -onering
fixme:msvcrt:MSVCRT__wsopen_s : pmode 0x01ed ignored
fixme:msvcrt:MSVCRT__wsopen_s : pmode 0x01ed ignored
fixme:msvcrt:MSVCRT__wsopen_s : pmode 0x01ed ignored
fixme:msvcrt:MSVCRT__wsopen_s : pmode 0x01ed ignored
Can't locate strict.pm in @INC (@INC contains: .) at Win32.pm line 4.
BEGIN failed--compilation aborted at Win32.pm line 4.
Compilation failed in require at -e line 779.
BEGIN failed--compilation aborted at -e line 965.

strict.pm просит уже perl 5.24

Продолжил эксперименты с perl но уже в Windows x64, поставил strawberry-perl-5.24.1.1-64bit.msi, к инструкции в wiki дополнительно выполнил:
cpan -i match::smart Sub::Infix File::Slurp
osm2mp запускается без проблем, а вот с getbound те же самые проблемы что и в Linux:


C:\osm2mp\getbound>perl getbound.pl 60189 -o Russia.poly -onering
Smartmatch is experimental at lib/App/OsmGetbound/OsmApiClient.pm line 163.
Smartmatch is experimental at lib/App/OsmGetbound/OsmApiClient.pm line 167.
Smartmatch is experimental at getbound.pl line 154.
Downloading relation ID=60189
GET http://www.openstreetmap.org/api/0.6/relation/60189/full
Strings with code points over 0xFF may not be mapped into in-memory file handles

Can't open 'SCALAR(0x28b0660)' for reading: 'Invalid argument' at lib/App/OsmGet
bound/OsmData.pm line 94

PS: Но тут хотя бы имеется возможность установить более старую версию strawberry-perl, благо все дистрибутивы доступны в отличии от activestate perl. А в Linux на Perl завязана графическая оболочка.

PPS: Поспешил что osm2mp без проблем, файл примера из wiki в конце выдаёт ошибку, но файл MP создаётся:


All done!!

        (in cleanup) Can't call method "DESTROY" on an undefined value at C:/osm
2mp1/lib/OSM.pm line 59 during global destruction.

Продолжил экспериментировать с strawberry-perl, опробовал помимо 5.24 ещё версии 5.20, 5.18 и 5.16.
getbound работает тока на 5.16. На 5.24-5.20 модули ставятся ощутимо быстрее, начиная с 5.18 начинают заметно медленнее ставиться и какие то модули перестают устанавливаться (например PerlIO::encoding). В связи с разницей в скорости установки модулей было бы интересно сравнить скорость конвертации эталонного файла. Не уверен что версия perl может влиять на скорость конвертации, но всё же.

Попробуйте такой вариант: https://github.com/cheshire-mouse/osm-getbound . Делал небольшой допил под свои нужды, похоже этот баг тоже правил

P.S. Рекомендую ключ -api op_ru - так быстрее и гуманнее по отношению к основной базе

Спасибо, работает. :slight_smile: тока потребовалось доустановить Math::Clipper.
Правда выдаёт тройку предупреждений, но файл создаётся:


user@user-linux-pc ~/getbound1 $ ./getbound.pl 60189 -o Russia.poly -onering
Smartmatch is experimental at /home/user/getbound1/lib/App/OsmGetbound/OsmApiClient.pm line 169.
Smartmatch is experimental at /home/user/getbound1/lib/App/OsmGetbound/OsmApiClient.pm line 174.
Smartmatch is experimental at ./getbound.pl line 201.
Name "main::DIR_ALIASES" used only once: possible typo at ./getbound.pl line 113.
Downloading relation ID=60189
GET http://www.openstreetmap.org/api/0.6/relation/60189/full
Creating polygons
Merging rings
Writing
All Ok

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

А можно по некоторым дополнительным ключам пояснить? Приведу тока те что не до конца понятны:
-singlerequest - download relations in a single request
(overpass only) одиночный запрос, зачем?
-file - use local OSM dump as input файл osm из которого будет браться релейшен?
-srcout - save OSM xml into file
(works for single relation or
for single request mode) что то вроде дампера всех данных внутри релейшина?
-clip - clip (union) rings Замыкает кольцо с разрывом (ошибкой в данных)?
-noinner - exclude inner rings from processing Предположу что убирает innerы, оставляя только outerы?
-writer - writer to use Добавляет подпись того кто выкачивает релейшин в нём?
-om - something to do with writer ?
-offset|buffer - enlarge resulting area by moving bound N degrees С offset понятно. А buffer?

Загружает все отношения одним overpass запросом. Позволяет избежать бана при загрузке большого количества границ, состоящих из нескольких отношений.

Сохраняет osm-файл, загруженный с сервера для повторного использования. Я использую, когда нужно сделать два poly для одного отношения (с offset и без), так быстрее и, опять же , меньше шансов, что забанят.

Объединяет соседние полигоны в один, удобно, если нужно собрать карту нескольких соседних областей.

noinner - вроде так
writer/om - как я понимаю, определяют формат вывода, на данный момент есть только poly
buffer - просто синоним offset

Теперь более менее понятно. Функционала заметно прибавилось. Не хватает тока вычитания какого то конкретного релейшина из другого большего.

gryphon Попробовал с твоего репозитария osm2mp, под strawberry-perl-5.24.1.1-64bit выдаёт такую ошибку и не запускается, с liosha`ного без ошибок:


C:\osm2mp_x>osm2mp.pl
Init failed for LangTransform::YaTranslate: Experimental keys on scalar is now forbidden at C:/osm2mp_x/lib/LangTransform/YaTranslate.pm line 81.
Compilation failed in require at C:/osm2mp_x/lib/LangSelect.pm line 51.
Experimental keys on scalar is now forbidden at C:\osm2mp_x\osm2mp.pl line 678.

Хотя под linxux`ом на 5.22 тока варнинги выдавал, но работал.

gryphon
Поставил версию strawberry-perl-5.16.3.1-64bit вот такие ошибки из твоего репозитария при сборке с переводом Яндексом:


Processing nodes...
DBD::SQLite::db do failed: Safety level may not be changed inside a transaction at C:/osm2mp/lib/SQLite_File.pm line 318.
DBD::SQLite::db do failed: Safety level may not be changed inside a transaction at C:/osm2mp/lib/SQLite_File.pm line 318.
DBD::SQLite::db do failed: Safety level may not be changed inside a transaction at C:/osm2mp/lib/SQLite_File.pm line 318.

Хотя Bio::DB::SeqFeature::Store::DBI::SQLite хоть и не без проблем но установил.
PS: Если всё что я щас пишу тебе не интересно дай знать, а то получится как с liosha, написал и тишина.

Я просто долго читаю. Но вполне могу что-то пропустить/забыть, если что, пингуй через личку

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

По osm2mp.
На домашнем компе у меня perl 5.22, osm2mp работает, возможно с ворнингами, но ничего особо навороченного здесь не конвертирую. На боевом сервере старый добрый 5.16, там работает вообще без замечаний, но все зависимости собирались cpan-ом уже не помню как давно.
Я попробую найти 5.24 из заставить его там работать, но, если у тебя запускается последняя версия из Лешиного реопозитария ( https://github.com/liosha/osm2mp ), то использовать мой вариант большого смысла нет: там основное изменение - другой алгоритм для fix-close-nodes, это критично для гармина