OSMOSIS + mySQL

Благодаря помощи форумчан я у себя поднял и настроил под windows связку OSMOSIS + mySQL.

Использовался модифицированный osmosis по ссылке от Jagor.

Несколько дней назад перестали импортироваться ежечасные обновления.
Предположительная причина - дублирование тегов точек (например, как в http://www.openstreetmap.org/browse/node/386480254/history , т.к. в истории создается уникальный индекс из полей id, version и k)

Одновременно после миграции 0.6 стали возникать проблемы с версиями элементов, поэтому было принято решение перезалить в локальную базу полный дамп.
Скачал дамп planet-090506.osm.bz2 , создал заново базу в mySQL скриптом с http://gweb.bretth.com/apidb06-mysql-v25.sql

Запускаю osmosis --read-xml-0.6 “C:\planet-090506.osm.bz2” --bounding-polygon-0.6 file=“c:\navi\russian_federation.poly” --write-mysql-0.6 user=“openstreetmap” database=“osm” forceUtf8=yes validateSchemaVersion=no

Осмосис вылетает с ошибкой:

C:\planet-090506.osm.bz2.  publicId=(null), systemId=(null), lineNumber=6663, c
olumnNumber=128.
        at org.openstreetmap.osmosis.core.xml.v0_6.XmlReader.run(XmlReader.java:
114)
        at java.lang.Thread.run(Unknown Source)
Caused by: org.xml.sax.SAXParseException: XML document structures must start and
 end within the same entity.

Скачиваю предпослений дамп, то же самое.

Скачиваю последний осмосис (0.31.1), там еще интереснее:

java  -cp C:\NAVI\Osmosis\osmosis.jar;C:\NAVI\Osmosis\lib\bzip2-20090327.jar;C:\NAVI\Osmosis\lib\commons-logging-1.0.4.jar;C:\NAVI\Osmosis\
ib\jpf-1.5.jar;C:\NAVI\Osmosis\lib\mysql-connector-java-5.1.6.jar;C:\NAVI\Osmosis\lib\postgis-1.3.2.jar;C:\NAVI\Osmosis\lib\postgresql-8.3-603.jdbc4.jar;C:\NAV
\Osmosis\lib\stax2-api-3.0.1.jar;C:\NAVI\Osmosis\lib\woodstox-core-lgpl-4.0.3.jar org.openstreetmap.osmosis.core.Osmosis  --read-xml-0.6 "C:\planet-090429.osm.
z2" --bounding-polygon-0.6 file="c:\navi\russian_federation.poly"  --write-mysql-0.6 user="openstreetmap" database="osm" forceUtf8=yes validateSchemaVersion=no

08.05.2009 12:55:56 org.openstreetmap.osmosis.core.Osmosis run
INFO: Osmosis Version 0.31
08.05.2009 12:55:56 org.openstreetmap.osmosis.core.Osmosis run
INFO: Preparing pipeline.
08.05.2009 12:55:56 org.openstreetmap.osmosis.core.Osmosis main
SEVERE: Execution aborted.
org.openstreetmap.osmosis.core.OsmosisRuntimeException: Task type write-mysql-0.6 doesn't exist.
        at org.openstreetmap.osmosis.core.pipeline.common.TaskManagerFactoryRegister.getInstance(TaskManagerFactoryRegister.java:60)
        at org.openstreetmap.osmosis.core.pipeline.common.Pipeline.buildTasks(Pipeline.java:50)
        at org.openstreetmap.osmosis.core.pipeline.common.Pipeline.prepare(Pipeline.java:112)
        at org.openstreetmap.osmosis.core.Osmosis.run(Osmosis.java:79)
        at org.openstreetmap.osmosis.core.Osmosis.main(Osmosis.java:30)

org.openstreetmap.osmosis.core.OsmosisRuntimeException: Task type write-mysql-0.6 doesn’t exist.

Пробовал и просто --write-mysql, результат такой же.

Кто сталкивался и как бороться?

в осмоcиме кривой ридер bz2
по первому пункту спасёт bzcat planet.bz2|osmosis --read-file file=-

PS только не спрашивайте, почему раньше bz2 файлы читались нормально :wink:

Если можно, всю командную строку до конца… И это под Windows?

это в юниксах
под виндой лучше 7z использовать:
7z e -so file.bz2 | osmosis --read-file file=- …

Нашел подтверждение наличия проблемы :expressionless:
http://www.mail-archive.com/dev@openstreetmap.org/msg07090.html

Два дня бьюсь, пока ничего не получается :frowning:

C:\NAVI\Osmosis\bin>7z e -so "C:\planet-090506.osm.bz2"  | osmosis --read-xml-0.
6 file=- --bounding-polygon-0.6 file="c:\navi\russian_federation.poly"  --write-
mysql-0.6 user="openstreetmap" database="osm" forceUtf8=yes validateSchemaVersio
n=no
...
C:\NAVI\Osmosis\bin>java  -cp C:\NAVI\Osmosis\osmosis.jar;C:\NAVI\Osmosis\lib\bz
ip2-20090327.jar;C:\NAVI\Osmosis\lib\commons-logging-1.0.4.jar;C:\NAVI\Osmosis\l
ib\jpf-1.5.jar;C:\NAVI\Osmosis\lib\mysql-connector-java-5.1.6.jar;C:\NAVI\Osmosi
s\lib\postgis-1.3.2.jar;C:\NAVI\Osmosis\lib\postgresql-8.3-603.jdbc4.jar;C:\NAVI
\Osmosis\lib\stax2-api-3.0.1.jar;C:\NAVI\Osmosis\lib\woodstox-core-lgpl-4.0.3.jar
org.openstreetmap.osmosis.core.Osmosis  --read-xml-0.6 file=- --bounding-polyg
on-0.6 file="c:\navi\russian_federation.poly"  --write-mysql-0.6 user="openstree
tmap" database="osm" forceUtf8=yes validateSchemaVersion=no

09.05.2009 11:48:41 org.openstreetmap.osmosis.core.Osmosis run
INFO: Osmosis Version 0.30.2
09.05.2009 11:48:41 org.openstreetmap.osmosis.core.Osmosis run
INFO: Preparing pipeline.
09.05.2009 11:48:41 org.openstreetmap.osmosis.core.Osmosis run
INFO: Launching pipeline execution.
09.05.2009 11:48:41 org.openstreetmap.osmosis.core.Osmosis run
INFO: Pipeline executing, waiting for completion.


Everything is Ok

Size:       0
Compressed: 6081583493
09.05.2009 15:50:32 org.openstreetmap.osmosis.core.pipeline.common.ActiveTaskMan
ager waitForCompletion
SEVERE: Thread for task 1-read-xml-0.6 failed
org.openstreetmap.osmosis.core.OsmosisRuntimeException: Unable to load current w
ay nodes.
        at org.openstreetmap.osmosis.core.mysql.v0_6.MysqlWriter.complete(MysqlW
riter.java:1044)
        at org.openstreetmap.osmosis.core.filter.v0_6.AreaFilter.complete(AreaFi
lter.java:345)
        at org.openstreetmap.osmosis.core.xml.v0_6.XmlReader.run(XmlReader.java:
111)
        at java.lang.Thread.run(Unknown Source)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationExce
ption: Cannot add or update a child row: a foreign key constraint fails (`osm`.`
current_way_nodes`, CONSTRAINT `current_way_nodes_ibfk_2` FOREIGN KEY (`node_id`
) REFERENCES `current_nodes` (`id`))
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)

        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou
rce)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
        at com.mysql.jdbc.Util.getInstance(Util.java:381)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.ja
va:1734)
        at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:995)
        at org.openstreetmap.osmosis.core.mysql.v0_6.MysqlWriter.complete(MysqlW
riter.java:1041)
        ... 3 more
09.05.2009 15:50:33 org.openstreetmap.osmosis.core.Osmosis main
SEVERE: Execution aborted.
org.openstreetmap.osmosis.core.OsmosisRuntimeException: One or more tasks failed
.
        at org.openstreetmap.osmosis.core.pipeline.common.Pipeline.waitForComple
tion(Pipeline.java:146)
        at org.openstreetmap.osmosis.core.Osmosis.run(Osmosis.java:85)
        at org.openstreetmap.osmosis.core.Osmosis.main(Osmosis.java:30)

это тоже некоторый тупак осмомиса. :slight_smile:
сначало он отсекает ноды по границе.
потом добавляет веи, которые могут пересекать границу. т.о. для веев не хватает нодов.
по хорошему, либо надо делать осмосаса 2х проходным, либо пересортировывать веи вперёд нодов (и всё-равно переделывать осмосис).
либо строго резать веи по предполагаемым боундам :slight_smile:

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

так же очевидно, но нельзя резать веи по границе.

либо сосать в скуль всю планету и кутить по границе уже там.