postgresql - osm2pgsql delete_node 失败

标签 postgresql openstreetmap postgis osx-mavericks tilemill

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

为此,我使用 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 上打开了一个错误报告但是这个论坛不是很活跃,所以我不希望从那里得到任何帮助。

我在 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 数据库中有我的数据。

有了这个脚本,我也许也能通过 Osmosis 测试!

谢谢大家

格雷格

关于postgresql - osm2pgsql delete_node 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19654622/

相关文章:

postgresql - 如何使用 PostgreSQL 和 ubuntu 连接特定用户并创建数据库

postgresql - 子事务 ID 消耗哪些资源?

leaflet - 如何在 L.tileLayer 的传单 map 中使用 localhost TileServer GL?

openstreetmap - EPSG 的开放式街道 map 服务器 :4326

Postgresql:无法访问文件 « $libdir/postgis-2.1 » 没有这样的文件或目录

postgresql - Postgres/PostGIS 查找线是否与圆相交?

postgresql - 如何在 PostgreSQL 中获取给定日期的星期几?

database - 如何使用 PostgresQL 进行多选

sql - unaccent() 防止在 Postgres 中使用索引

python - 在 SQLAlchemy 中使用 Postgres/PostGIS View