首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >delete_node故障与osm2pgsql

delete_node故障与osm2pgsql
EN

Stack Overflow用户
提问于 2013-10-29 09:44:20
回答 1查看 422关注 0票数 1

我更新到OSM,并尝试再次设置一个工作流程,将personnal数据(使用JOSM软件创建)转换为Tilemill地图。

为此,我使用osm2pgsql来用OSM文件填充postgres/postgis数据库。在更新之前,相同的工作流运行良好。

我使用Postgresql.app版本9.3.0.0和osm2pgsql版本0.84.0

当我启动osm2pgsql命令时,会得到以下错误:

代码语言:javascript
复制
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文件的第一行:

代码语言:javascript
复制
<?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/medi-pgsql.c文件中:

代码语言:javascript
复制
           "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 );

如果你有什么想法的话,欢迎你!

谢谢

格雷格

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-11 17:11:10

在osm2pgsql人员的帮助下,我发现问题主要是由于osm2pgsql中使用了JOSM文件。

实际上,JOSM文件并不是纯OSM文件,因为其中缺少一些键/值:版本、用户和时间戳。

由于不需要这些标记,为了通过兼容性测试,我用这个脚本对来自josm的OSM文件进行了预处理:

代码语言:javascript
复制
#!/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数据库中。

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

感谢你们所有人

格雷格

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19654622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档