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
legacy.sql、osm 数据和 PosGIS 2.0 的 PostgreSQL 安装
损失函数(损失函数代价函数目标函数)MSE0-1损失函数绝对误差损失函数分位数损失函数Huber损失函数感知损失函数Hinge损失函数指数损失函数对数损失函数