Ошибка delete_node с osm2pgsql

Я обновился до OS X Mavericks и снова пытаюсь настроить рабочий процесс для преобразования личных данных OSM (созданных с помощью программного обеспечения JOSM) в карты Tilemill.

Для этого я использую osm2pgsql для заполнения базы данных postgres/postgis файлами OSM. До обновления тот же рабочий процесс работал хорошо.

Я использую 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 );

Если у вас есть идеи, пожалуйста!

Спасибо

Грег


person iero    schedule 29.10.2013    source источник
comment
Примечание: кажется, что после оператора PREPARE get_node_list( ... отсутствует точка с запятой. Оператор next(=delete_node), вероятно, поглощается оператором get_copy (или блокируется и игнорируется синтаксическим анализатором)   -  person wildplasser    schedule 30.10.2013
comment
Спасибо wildplasser, вы правы, это странно. Похоже, что в этом коде есть и другие подобные ошибки. , я не понимаю, почему никто не заметил эти пропущенные точки с запятой. Скачал код, скомпилирую и скажу, в этом ли проблема. Еще раз спасибо за ваш комментарий   -  person iero    schedule 31.10.2013
comment
Если прочитать предыдущую версию кода, окажется, что строка get_node_list() недавно была добавлена ​​в код. Кажется, что касается остальной части (т.е. строки 101-106) этого кода, что точку с запятой в конце 88-й строки нужно убрать. Я недостаточно знаю программирование на C, чтобы ответить на этот вопрос. Что вы думаете? (обратите внимание, я обновил отчет об ошибке на github)   -  person iero    schedule 31.10.2013


Ответы (1)


С помощью ребят из osm2pgsql я понял, что проблема была в основном из-за использования файлов JOSM в osm2pgsql.

На самом деле файлы JOSM не являются чистыми файлами OSM, поскольку в них отсутствуют некоторые ключи/значения: версия, пользователь и временная метка.

Поскольку мне не нужны эти теги, я предварительно обработал файлы OSM из josm с помощью этого скрипта, чтобы пройти тесты на совместимость:

#!/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.

С этим скриптом я тоже смогу пройти тесты на осмос!

Спасибо вам всем

Грег

person iero    schedule 11.11.2013