2013-10-29 43 views
1

我更新到OS X Mavericks,並嘗試再次設置一個工作流程,將個人OSM數據(使用JOSM軟件創建)轉換爲Tilemill地圖。osm2pgsql的delete_node失敗

爲此,我使用osm2pgsql用我的OSM文件填充postgres/postgis數據庫。更新之前,相同的工作流程運行良好。

我用Postgresql.app版本9.3.0.0和osm2​​pgsql版本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的錯誤報告,但這個論壇並不是非常活躍,所以我不期望有任何幫助。

  "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); 

如果您有什麼想法,你太客氣:

我在osm2pgsql代碼的delete_node部分是osm2pgsql /中pgsql.c文件中找到!

感謝

格雷格

+0

注:似乎到'PREPARE get_node_list後一個分號失蹤(...'語句中的下一個(= delete_node)語句可能吸收到get_copy。語句(或解析器扼殺和忽略) – wildplasser

+0

感謝wildplasser,你是對的,這很奇怪。似乎在[此代碼]中有類似的其他錯誤(https://github.com/openstreetmap/osm2pgsql/blob /master/middle-pgsql.c),我不明白爲什麼沒人發現那些丟失的分號。我下載了代碼,我將它編譯並告訴你這是否是問題。再次感謝您的評論 – iero

+0

如果讀取以前版本的代碼,則看起來get_node_list()行最近已添加到代碼中。看來,關於[此代碼](https://github.com/openstreetmap/osm2pgsql/blob/master/middle-pgsql.c)的其餘部分(即第101至第106行),在末尾的半角字符第88行需要刪除。我不知道C編程足以回答這個問題。你怎麼看? (注意,我更新了github上的bug報告) – iero

回答

1

通過osm2pgsql傢伙的幫助下,我想通了,這個問題主要是由於使用JOSM文件到osm2pgsql。

事實上,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數據庫中有我的數據。

有了這個腳本,我可能也能通過滲透測試!

感謝大家

格雷格