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

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, это критично для гармина

Согласен что решается, но если регионов сильно больше 10? Не принципиально конечно, только для удобства.

Так вот на нём и возникла непонятная то ли варнинг то ли ошибка, карты при этом собираются:
DBD::SQLite::db do failed: Safety level may not be changed inside a transaction at C:/osm2mp/lib/SQLite_File.pm line 318.
fix-close-nodes как раз и заинтересовал в твоём репозитарии.

Вот ещё ошибки при переводе:


yatr: failed request zh-en for щлШчФ-цЭС at C:/osm2mp/lib/LangTransform/YaTranslate.pm line 109.
Wide character in warn at C:/osm2mp/lib/LangTransform/YaTranslate.pm line 109.
yatr: failed request zh-en for щлШчФ-цЭС at C:/osm2mp/lib/LangTransform/YaTranslate.pm line 109.
Wide character in warn at C:/osm2mp/lib/LangTransform/YaTranslate.pm line 109.
yatr: failed request zh-en for ц¦Вц+ЛцЭС at C:/osm2mp/lib/LangTransform/YaTranslate.pm line 109.
Wide character in warn at C:/osm2mp/lib/LangTransform/YaTranslate.pm line 109.

Поправил конструкции, которые не нравятся перлу, теперь запускается на 5.24 (проверял, опять же, на линуксе).
На гитхабе пока залил отдельной веткой (прямая ссылка на архив https://github.com/cheshire-mouse/osm2mp/archive/perl524.zip )

Теперь про ошибки SQLite в клубничном перле. Проблема в сторонней библиотеке SQLite_File.pm (лежит в папке lib). Она без проблем работает на линуксе, но на винде начинает выпендриваться. Использование более свежей версии проблему не решило.

Если закомментировать вызов **PRAGMA synchronous = off **, ошибка уйдет, файл даже соберется, но при завершении программы получишь три новые ошибки. И моего понимания перла как-то не очень хватает, чтобы это пофиксить. Возможно, есть смысл попробовать другие сорта перла под винду.

Вобщем моя вера в кросплатформенность сильно пошатнулась сегодня

Очень печально такое слышать :frowning:

проверь последнюю версию из той же ветки (perl524)

На 5.16 всё отлично работает, ошибок не выдаёт. А на 5.24 выскакивает ошибка и когда нажмёшь OK следущая ошибка:


Loading configuration...
malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "(end of string)") at C:/osm2mp/lib/LangTransform/YaTranslate.pm line 68.

PS: Правда Bio::DB::SeqFeature::Store::DBI::SQLite пока так и не удалось поставить на 5.24.

Я такого не смог словить. Думаю, что-то не сложилось с установкой перла (или библиотеками).

Если по шагам, то я делал так
0) на виртуалке развернута Win7 x64

  1. устанавливаем strawberry perl 5.24, для x64, с оф сайта
  2. утилитой “Create local library areas” выбираем пользовательскую папку для библиотек
  3. открываем Perl command line
  4. запускаем perl osm2mp.pl
  5. если не хватает библиотеки, заходим в cpan и запускаем install
  6. повторяем 4-5 пока osm2mp не будет запускаться без ошибок
  7. пробуем конвертировать perl osm2mp\osm2mp.pl -dl ru -tl en -o out.mp --lt-yatr-key @yatr.key --lt-yatr-cache-dir cache in.osm

Никаких лишних библиотек не ставил, только то, что просит osm2mp

На ActivePerl свежего розлива проблем тоже не было

Переустановил по новой, ошибок что выше не выскакивает на аналогичном примере, зато выскакивают следующие варнинги:


Processing nodes...
        (in cleanup) Can't call method "commit" on an undefined value at C:/osm2mp_x/lib/SQLite_File.pm line 794.
All cache engines failed; data will not be saved! at C:/osm2mp_x/lib/LangTransform/YaTranslate.pm line 175.
        (in cleanup) Can't call method "commit" on an undefined value at C:/osm2mp_x/lib/SQLite_File.pm line 794.
All cache engines failed; data will not be saved! at C:/osm2mp_x/lib/LangTransform/YaTranslate.pm line 175.
        (in cleanup) Can't call method "commit" on an undefined value at C:/osm2mp_x/lib/SQLite_File.pm line 794.
All cache engines failed; data will not be saved! at C:/osm2mp_x/lib/LangTransform/YaTranslate.pm line 175.

Вот ведь.
Попробуй следующий вариант с гитхаба

Вот теперь всё отлично! :slight_smile: Ещё вопрос на эту же тему, при запуске конвертации нескольких файлов использующих перевод Яндекса выскакивает следующая ошибка:


DBD::SQLite::db do failed: database is locked at C:/navitel/lib/SQLite_File.pm line 319.
DBD::SQLite::db do failed: database is locked at C:/navitel/lib/SQLite_File.pm line 319.

Это как то влияет на перевод или только данные перевода не кэшируются?

В теории, sqlite позволяет работать с одной базой нескольким процессам, но, судя по этим ошибкам и Лешиным комментам в коде, вариант с параллельной работой явно не закладывался. Вобщем, если в каких-то случаях будет работать, то это просто удачное стечение обстоятельств.

Кстати иногда всё же в конце вылазит эта ошибка, один раз из десяти конвертированных файлов:


All done!!

	(in cleanup) Can't locate object method "DESTROY" via package "OSM::Hash" at C:/navitel/lib/OSM.pm line 59 during global destruction.

Правда не заметил что бы как то влияло на работу.

Поправил. Но, думаю, это еще не все, и где-нибудь снова всплывет.

Привет. Подскажи как getbound собрать? osm2mp64.exe собрался и работает, а с getbound`ом засада, собирается, но не работает:


No clipper class available at Math/Polygon/Tree.pm line 35.
BEGIN failed--compilation aborted at Math/Polygon/Tree.pm line 35.
Compilation failed in require at script/getbound.pl line 31.
BEGIN failed--compilation aborted at script/getbound.pl line 31.

PS: Пробовал без параметров собирать, пробовал по аналогии файл pp-opts создавать, результат тот же

PPS: Нашёл недостающее звено :slight_smile: Math::Geometry::Planar::GPC::PolygonXS


-I lib

-M Carp
-M Log::Any
-M Log::Any::Adapter
-M FindBin

-M App::OsmGetbound::OsmApiClient
-M App::OsmGetbound::OsmData
-M App::OsmGetbound::RelAlias
-M App::OsmGetbound::WriterPoly
-M App::OsmGetbound::WriterShp

-M Math::Polygon
-M Math::Polygon::Tree

-M Getopt::Long
-M List::Util
-M List::MoreUtils
-M File::Slurp

-M YAML

-M Math::Clipper
-M Math::Geometry::Planar::GPC::PolygonXS


Рано обрадовался:


C:\osm2mp>getbound 60189 -o Russia.poly -onering
Bad subroutine name for autodie: read at App/OsmGetbound/WriterPoly.pm line 10.
BEGIN failed--compilation aborted at App/OsmGetbound/WriterPoly.pm line 10.
Compilation failed in require at (eval 455) line 1.

Собрался getbound и вроде как всё работает даже, вот такой файл зависимостей в итоге вышел:


-I lib

-M Carp
-M Log::Any
-M Log::Any::Adapter
-M FindBin

-M strict
-M warnings
-M autodie
-M utf8
-M Encode

-M LWP::UserAgent

-M Geo::Openstreetmap::Parser
-M Geo::Shapefile::Writer

-M App::OsmGetbound::OsmApiClient
-M App::OsmGetbound::OsmData
-M App::OsmGetbound::RelAlias
-M App::OsmGetbound::WriterPoly
-M App::OsmGetbound::WriterShp

-M Math::Polygon
-M Math::Polygon::Tree

-M Getopt::Long
-M List::Util
-M List::MoreUtils
-M File::Slurp

-M YAML

-M Math::Clipper
-M Math::Geometry::Planar::GPC::PolygonXS


PS: Geo-Shapefile-Writer тока не встал, пришлось руками подкинуть в папку lib, собирал на Strawberry Perl 5.16.3 x64.


//hint// to see the cpan-testers results for installing this module, try:
  reports LIOSHA/Geo-Shapefile-Writer-0.006.tar.gz
Running make install
  make test had returned bad status, won't install without force
Stopping: 'install' failed for 'L/LI/LIOSHA/Geo-Shapefile-Writer-0.006.tar.gz'.

На базе Perl 5.16 На базе Perl 5.24

Подскажите пожалуйста, кто знает - вот в конфиге вижу что можно вставить кусок кода на перле.
А вопрос такой - в этом куске можно как в самом скрипте функции задавать или можно пользоваться только уже заданными функциями?
Сам скрипт изменить не могу - у меня работает только компилированный вариант.

Насколько я знаю там YAML язык разметки используется. Сам бы хотел где то найти толковое описание применительно к osm2mp. А то всё больше методом тыка. :slight_smile: