我更新到OSX Mavericks,并尝试重新设置一个工作流,将个人OSM数据(使用JOSM软件创建)转换为Tilemill映射。
为此,我使用osm2pgsql用我的OSM文件填充postgres/postgis数据库。在更新之前,相同的工作流工作得很好。
我使用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上打开了一个bug报告,但是这个论坛不是很活跃,所以我不希望从那里得到任何帮助。
我在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 );
如果你有什么想法的话,欢迎!
谢谢
格雷格
最佳答案
在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数据库中。
有了这个脚本,我可能也能通过渗透测试!
谢谢你们大家
格雷格
关于postgresql - osm2pgsql的delete_node故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19654622/