1

OS X Mavericks にアップデートし、個人の OSM データ (JOSM ソフトウェアを使用して作成) を Tilemill マップに変換するワークフローを再度セットアップしようとしました。

このために、osm2pgsql を使用して、postgres/postgis データベースに OSM ファイルを追加します。更新前は、同じワークフローでうまくいきました。

Postgresql.app バージョン 9.3.0.0 と osm2pgsql バージョン 0.84.0 を使用しています

osm2pgsql コマンドを起動すると、次のエラーが表示されます。

osm2pgsql SVN version 0.84.0 (64bit id space)

Using projection SRS 900913 (Spherical Mercator)
Setting up table: coast_point
...
Reading in file: ../src/misc/00_Coast.osm
delete_node failed: ERROR:  prepared statement "delete_node" does not exist
(7)
Arguments were: -476852, 
Error occurred, cleaning up

だから、「delete_node」エラーがあり、その理由は本当にわかりません。負の 'id' 値を正の値に変更しようとしましたが、同じエラーが発生しました。

エラーの原因となった OSM ファイルの最初の行は次のとおりです。

<?xml version='1.0' encoding='UTF-8'?>
<osm version='0.6' upload='true' generator='JOSM'>
  <node id='-476852' action='modify' visible='true' lat='-4.660264310091712' lon='11.79785544887142' />
  <node id='-476850' action='modify' visible='true' lat='-4.659760277426281' lon='11.78306037634432' />
...

以前は機能していたすべてのファイルで同じエラーが発生しました。

osm2pgsql githubでバグ レポートを開きましたが、このフォーラムはあまり活発ではないため、そこからの助けは期待できません。

osm2pgsql コードで、delete_node 部分が osm2pgsql/middle-pgsql.c ファイルにあることがわかりました。

           "PREPARE get_node (" POSTGRES_OSMID_TYPE ") AS SELECT lat,lon,tags FROM %p_nodes WHERE id = $1 LIMIT 1;\n"
           "PREPARE get_node_list(" POSTGRES_OSMID_TYPE "[]) AS SELECT id, lat, lon FROM %p_nodes WHERE id = ANY($1::" POSTGRES_OSMID_TYPE "[])",
           "PREPARE delete_node (" POSTGRES_OSMID_TYPE ") AS DELETE FROM %p_nodes WHERE id = $1;\n",
     .copy = "COPY %p_nodes FROM STDIN;\n",
  .analyze = "ANALYZE %p_nodes;\n",
     .stop = "COMMIT;\n"

  (...)
  pgsql_execPrepared(node_table->sql_conn, "delete_node", 1, paramValues, PGRES_COMMAND_OK );

心当たりのある方、大歓迎です!

ありがとう

グレッグ

4

1 に答える 1

1

osm2pgsql 関係者の助けを借りて、この問題は主に osm2pgsql で JOSM ファイルを使用したことが原因であることがわかりました。

実際、バージョン、ユーザー、タイムスタンプなどのキー/値が欠落しているため、JOSM ファイルは純粋な OSM ファイルではありません。

これらのタグは必要ないので、互換性テストに合格するために、このスクリプトを使用して josm の OSM ファイルを前処理しました。

#!/bin/bash

SOURCE=$1
TARGET=$2

cat $SOURCE | sed s/"node id=\'-"/"node id=\'"/g | sed s/"nd ref=\'-"/"nd ref=\'"/g \
    | sed s/" action=\'modify\'"//g \
    | sed "/node/ s/ timestamp='[^']*'//" \
    | sed "/node/ s/ action='[^']*'//" \
    | sed "/node/ s/ version='[^']*'//" \
    | sed "/node/ s/ user='[^']*'//" \
    | sed "/node/ s/ id/ version='1' user='iero' timestamp='1970-01-01T12:00:00Z' id/" \
    | sed "/way/ s/ timestamp='[^']*'//" \
    | sed "/way/ s/ action='[^']*'//" \
    | sed "/way/ s/ version='[^']*'//" \
    | sed "/way/ s/ user='[^']*'//" \
    | sed "/way/ s/ id/ version='1' user='iero' timestamp='1970-01-01T12:00:00Z' id/" \
    | sed "/relation/ s/ timestamp='[^']*'//" \
    | sed "/relation/ s/ action='[^']*'//" \
    | sed "/relation/ s/ version='[^']*'//" \
    | sed "/relation/ s/ user='[^']*'//" \
    | sed "/relation/ s/ id/ version='1' user='iero' timestamp='1970-01-01T12:00:00Z' id/" \
    > $TARGET

これは私たちが作成できる最も美しい/最適なスクリプトではありませんが、うまく機能しているようです。現在、pgsql データベースにデータがあります。

このスクリプトを使えば、Osmosis のテストにも合格できるかもしれません!

皆様のおかげで

グレッグ

于 2013-11-11T17:11:10.443 に答える