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

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


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:

Аналогично :frowning: А уж отсутствие навыков программирования вообще вселяет уныние.

Вот например, второй день никак не могу найти/сообразить, как в condition задать проверку условия наличия в значении тега символа #…
Т.е. если в building:colour цвет задан в HEX, начинающийся с # - то сделать определенной действие.
Перепробовал кучу вариантов - все без толку…

Я кажется столкнулся с такой же проблемой. Похоже это баг конвертера.

Если в конфиге стоит так:
label: [ name, loc_name, brand, operator, place_name ]
то конвертер вытягивает названия только из name.

Если сделать так:
label: [ name:en, name, loc_name, brand, operator, place_name ]

то конвертер начинает вытягивать названия из любого name:*, что первое попадется.
Например, на объекте нет name:en, зато есть name:ru - в .mp мы имеем название на русском, благополучно транслитированное в латиницу.

Вот, как-то с Лешей общался, может, что полезное найдешь:

boris, 21.03.17 15:08:06:
Привет. Решил еще раз глянуть логику работы конвертера с разными языками. Если стоит только target-lang=ru и default-lang=, вроде бы сначала ищется ru, потом пробует перевести, затем en и коль ничего не получилось - транслитерация. А вот если поставить --namelist label=name:ru,name,name:en, то там, где был русский в названии улицы появляется транслитерация (в адресе остается русский). Если поставить так --namelist label=name,name:ru,name:en, то в названии опять русский. Если в таком порядке --namelist label=name,name:en,name:ru, тоже русский. Ну и если так --namelist label=name:en,name:ru,name, то будет на английском. Да, в исходном названии улицы присутствуют и русский и английский. На домах есть только name и оно на русском. Во всех вариантах там транслитерация.

boris, 15:08:39:
Это такое в Южной Осетии :slight_smile:

liosha, 15:09:54:
привет. всё правильно: ты говоришь, что название надо искать в name:ru, значит, другие языки он ищет в name:ru:ru

boris, 15:11:04:
Во как… То бишь попросить искать в чистом name не получится.

liosha, 15:11:23:
не надо использовать namelist

boris, 15:12:29:
А как сделать, если нет name:ru, то брать name?

liosha, 15:13:12:
default-lang=ru

boris, 15:14:56:
Да, но в названии улицы name не на русском, но есть name:ru.

liosha, 15:15:39:
ну да, сначала посмотрит name:ru, потом name

boris, 15:16:05:
Ща гляну, что получится.

boris, 15:20:31:
Действительно, так все сработало :-). Спасибо.

boris, 15:23:51:
А вообще сейчас namelist-ом что-то интересное можно достать?

liosha, 15:24:08:
не думаю

boris, 15:24:20:
Ясно, спасибо.

liosha, 15:24:26:
по идее он для old_name вместо name