osm2pgsql:函数 AddGeometryColumn 不存在

Posted

技术标签:

【中文标题】osm2pgsql:函数 AddGeometryColumn 不存在【英文标题】:osm2pgsql: Function AddGeometryColumn doesn't exist 【发布时间】:2012-10-19 10:01:58 【问题描述】:

我想使用工具 Osm2pgsql 将 OSM file 导入我的 PostgreSQL 数据库(Windows,Postgres 版本 9.2)。

当我运行以下命令时

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

我该如何解决这个问题?

【问题讨论】:

您是否将 PostGIS 安装到此数据库中? “开始”菜单中有一个 PostGIS 文件夹。我是否需要为特定数据库显式安装 PostGIS? 【参考方案1】:

您似乎尚未将 PostGIS 支持添加到您尝试使用 osm2pgsql.exe 的数据库中。见the PostGIS installation documentation (2.0)。

由于您使用的是 PostGIS 2.0,因此您应该可以通过 CREATE EXTENSION postgis; 加载 PostGIS。此命令必须以超级用户身份运行 - 通常是用户 postgres。使用:

psql -U postgres mydbname

以用户 postgres 的身份连接。

看来至少 osm2pgsql 的 Windows 版本不支持 PostGIS 2.0 - 或者至少在六个月前不支持。请参阅 OSM GitHub 上的 this issue report 和 instructions on how to set a PostGIS 2 database to be compatible with an osm2pgsql that expects PostGIS 1.x。未来的读者应该在继续之前检查这些步骤是否仍然需要; Windows 版的osm2pgsql 可能会在某个时候更新以支持 PostGIS 2。

【讨论】:

当我在命令行窗口中运行"C:\Program Files\Post greSQL\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 的错误。我该如何解决它们? @DmitriPisarenko 你有template_postgis 数据库吗?而是从该模板创建数据库。如果您不想这样做,那么很难从错误中说出什么是错误的。您需要查看 first 错误。尝试使用附加参数 -v ON_ERROR_STOP=1 运行 psql 命令。 我已经从模板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; @DmitriPisarenko 好的,您在 PostgreSQL 9.2 上使用 PostGIS 2.0,因此您可以只在数据库中使用 CREATE EXTENSION postgis;。您必须以 PostgreSQL 超级用户身份运行此命令(与之前所示直接加载 PostGIS SQL 时相同),因为您正在将新的 C 函数加载到系统中。默认超级用户是用户postgres,因此以postgres 用户身份连接到数据库,并将-U postgres 参数设置为psql。答案已更新。 我已经做到了。当我执行osm2pgsql.exe --create -d ccp-gis-test artyom.xml -U postgres -W --style default.style 时出现几个新错误:1) 表planet_osm_point 不存在。 2) 表planet_osm_point_tmp 不存在。 3) 函数astext(geometry) 不存在。【参考方案2】:

相当晚了,但我在 16 年 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 被引用,整数和 boolean 未被引用,当然正确的值在适当的位置。

祝你好运。

【讨论】:

以上是关于osm2pgsql:函数 AddGeometryColumn 不存在的主要内容,如果未能解决你的问题,请参考以下文章

osm2pgsql windows “illegal option -W” error

从 GPS 坐标生成行政区划?

legacy.sql、osm 数据和 PosGIS 2.0 的 PostgreSQL 安装

损失函数(损失函数代价函数目标函数)​​​​​​​MSE0-1损失函数绝对误差损失函数分位数损失函数Huber损失函数感知损失函数Hinge损失函数指数损失函数对数损失函数

Kotlin函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )

测开之函数进阶篇・第五篇《递归函数纯函数匿名函数偏函数》