osm2pgsql:函数AddGeometryColumn不存在。

16
我希望将OSM文件导入我的PostgreSQL数据库(Windows, Postgres 版本9.2),使用工具Osm2pgsql
当我运行以下命令时:
osm2pgsql.exe --create -d mydb artyom.xml -U myuser -W --style default.style

我遇到了错误

SELECT AddGeometryColumn('planet_osm_point', 'way', 900913, 'POINT', 2 );
 failed: FEHLER:  Funktion addgeometrycolumn(unknown, unknown, integer, unknown,
 integer) existiert nicht
LINE 1: SELECT AddGeometryColumn('planet_osm_point', 'way', 900913, ...
               ^
HINT:  Keine Funktion stimmt mit dem angegebenen Namen und den Argumenttypen ├╝b
erein. Sie m├╝ssen m├Âglicherweise ausdr├╝ckliche Typumwandlungen hinzuf├╝gen.

Error occurred, cleaning up

德语翻译:

SELECT AddGeometryColumn('planet_osm_point', 'way', 900913, 'POINT', 2 );
 failed: ERROR:  Function addgeometrycolumn(unknown, unknown, integer, unknown,
 integer) doesn't exist
LINE 1: SELECT AddGeometryColumn('planet_osm_point', 'way', 900913, ...
               ^
HINT: No function matches the specified name and argument types. Maybe you need
to make explicit casts.

Error occurred, cleaning up

我该如何修复这个问题?


1
你在这个数据库中安装了PostGIS吗? - Craig Ringer
在“开始”菜单中有一个PostGIS文件夹。我需要为特定的数据库显式安装PostGIS吗? - Glory to Russia
2个回答

26

看起来你还没有在试图使用osm2pgsql.exe的数据库中添加PostGIS支持。请参考PostGIS安装文档(2.0)

由于你正在使用PostGIS 2.0,你应该能够只需CREATE EXTENSION postgis;来加载PostGIS。此命令必须以超级用户身份运行 - 通常是用户postgres。使用:

psql -U postgres mydbname

使用用户postgres进行连接。

看起来至少在Windows版本的osm2pgsql不支持PostGIS 2.0,或者六个月前仍然不支持。请参见OSM GitHub上的此问题报告以及有关如何设置PostGIS 2数据库以与期望PostGIS 1.x的osm2pgsql兼容的说明。未来的读者在继续之前应该检查这些步骤是否实际上仍然是必需的;很可能Windows版本的osm2pgsql会在某些时候更新以支持PostGIS 2。


当我在命令行窗口中运行"C:\Program Files\PostgreSQL\9.2\bin\psql" -d ccp-web -f postgis.sql --username=ccp-web-user时,我会得到很多错误,比如psql:postgis.sql:6054: ERROR: Current Transaction was canceled, remaining commands will be ignored。我该如何解决这些问题? - Glory to Russia
@DmitriPisarenko 你有一个名为template_postgis的数据库吗?最好从这个模板创建数据库。如果你不想这样做,很难从错误信息中得知问题所在。你需要查看第一个错误。尝试使用额外的参数-v ON_ERROR_STOP=1运行psql命令。 - Craig Ringer
我用模板template_postgis_20创建了一个数据库。当我运行带有-v ON_ERROR_STOP=1命令时,我收到错误psql:C:/Program Files/PostgreSQL/9.2/share/contrib/postgis-2.0/postgis.sql:47: ERROR: no permission for laguage c。我认为这是失败的命令:CREATE OR REPLACE FUNCTION spheroid_in(cstring) RETURNS spheroid AS '$libdir/postgis-2.0','ellipsoid_in' LANGUAGE 'c' IMMUTABLE STRICT; - Glory to Russia
@DmitriPisarenko 好的,你正在使用PostgreSQL 9.2上的PostGIS 2.0,所以你可以在你的数据库中只需运行CREATE EXTENSION postgis;。你必须以PostgreSQL超级用户身份运行此命令(与直接加载PostGIS SQL时相同),因为你正在将新的C函数加载到系统中。默认的超级用户是用户postgres,所以请使用-U postgres参数连接到数据库作为用户postgres。答案已更新。 - Craig Ringer
@DmitriPisarenko 好主意,但我不是你想要的人;我了解Pg,但不熟悉GIS/OSM方面。 - Craig Ringer
显示剩余3条评论

3

虽然有点晚,但我在2016年9月偶然发现了这个SQL语句:

SELECT AddGeometryColumn('planet_osm_point', 'way', 900913, 'POINT', 2 );

需要改写为以下函数格式:

('catalog','schema','table','column',srid,'type',type_mod,boolean);

空格并不重要。因此,类似以下内容的代码即可实现该功能:

SELECT AddGeometryColumn('','','planet_osm_point', 'way', 900913, 'POINT', 2,true );

检查实际的INSERT语句,确保正确的列名在我的版本中为“geom”。

确保varchars用引号括起来,整数和布尔值不用引号括起来,当然要确保正确的值放在正确的位置。

祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接