2013-10-29 45 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数据库中有我的数据。

有了这个脚本,我可能也能通过渗透测试!

感谢大家

格雷格