重命名postGIS表并更新GeoServer?


9

我想重命名我的postGIS表之一。但是,当我通过应用一个简单的

ALTER TABLE old_name RENAME TO new_name;

据我了解,空间数据不会使用新名称进行更新。首先,可以通过运行函数来修复这些引用:

SELECT probe_geometry_columns()

之后桌子本身还可以吗?还是应该采取其他措施?其次,如何更新GeoServer以便找到该新表?到目前为止,如果我运行上述命令,然后在GeoServer上编辑图层信息以指向新名称...,我仍然会收到错误消息(GeoServer仍尝试使用旧名称查找它)。确实,在GeoServer上应该在哪里更改图层名称?

Answers:


4

为了重命名表,您将不得不在两个地方的元数据中更改名称。首先在PostGIS上,然后在Geoserver配置上。

要更改PostGIS,可以直接更新geometry_columns。尽管probe_geometries将具有将该条目插入到几何列中的作用,但也将具有DESCRIBINGING所有表的方案以及插入任何缺少的几何列条目的作用。如果您有很多表,这会变得昂贵,那么为什么不直接更新geometry_columns表呢?

要更新geoserver,您有多种选择。当然,您可以通过GUI手动完成此操作,但是我有一种想要自动化的感觉。编写用于编辑geoserver安装文件夹中的配置文件并重新启动geoserver的Shell脚本,但这也是解决问题的长途之路。我建议您使用geoserver REST config API,该API允许您通过RESTful调用来操纵图层配置。

更新:

如果“更新几何列”不明显,请执行以下操作:

UPDATE geometry_columns set f_table_name = 'my_new_table_name' where f_table_name = 'my_old_table_name';

更新8年(!!!)之后(2018):

就像下面提到的某些人一样,在PostGIS 2.0之后,元数据表会在ALTER语句之后自动更新。


请原谅我的无知,但由于我是PostGIS的新手。我究竟如何更新geometry_columns?我是否理解正确,即运行probe_函数(不带任何参数)是否具有相同的作用?
Mimo

1
从probe_geometry_columns看实现,trac.osgeo.org/ postgis / changeset/ 7548正在遍历数据库中的每个表,查找模式是否具有字符串“ geometrytype”,如果所需的条目不存在,则插入新记录。在geometry_columns中。但是,仍然保留了孤儿记录。那么,为什么不只是做:UPDATE GEOMETRY_COLUMNS SET f_table_name = 'new_table_name',其中f_table_name = 'old_table_name'
鸭脚稗亚瑟Burhum

表明Not Found The requested URL /latest/en/user/restconfig/rest-config-api.html was not found on this server.
Scaramouche


7

请注意,在PostGIS 2.0+中,您所要做的只是正常

ALTER TABLE old_name RENAME TO new_name;

geometry_columns视图(或geography_columns)中的条目也将被更新。


3
SELECT Probe_Geometry_Columns();

是一个方便的实用程序。

首先,当我们将几何列附加到现有表时,

SELECT AddGeometryColumn('my_table', 'geo_column', 1234, 'MULTIPOINT', 2);

我们正在向函数提供将几何类型(geo_column)类型的列固定到指定表(my_table)所需的所有信息,并将诸如SRID(1234),几何类型(MULTIPOINT)和维数(2)之类的重要细节写入geometry_columns表。本质上,它是一个ALTER和三个UPDATE。

通过其他方式(从shapefile加载,在CREATE TABLE AS中选择​​等)创建几何列可以导致空间表对于外部应用程序不可见,尽管它们在数据库中工作得很好。如果没有正确的详细信息存储在geometry_columns中,则实际的几何值将作为无意义的字符串显示在寻找投影点,线或面的应用程序中。

调用probe函数会检查类型为geometry的每一列,将新值添加到geometry_columns并报告冲突。

回到您的问题,如果名称更改未反映在geometry_columns中,则GeoServer不认为重命名的表包含空间数据。还需要考虑的另一点是,探测功能会创建一条反映新表名的重复记录,但不会摆脱原始记录,这是GeoServer的另一个潜在问题。

所有这些,我建议您:1)运行探针,然后立即删除旧记录;或2)通过对geometry_columns的ALTER更改名称来更改f_table_name值。

抱歉,请耐心等待,但希望对您有所帮助。


谢谢您的回复。我现在开始更好地了解postGIS。不过,我还是不确定需要采取的必要步骤。首先我应该执行名称更改,然后执行probe()吗?如何更改geometry_columns?
Mimo

更改geometry_columns的最简单方法是打开pgAdmin,右键单击表,选择视图数据,选择视图所有行,单击包含旧表名的单元格,然后键入新表名。或者,UPDATE SET GEOMETRY_COLUMNS f_table_name = 'new_table_name' WHERE f_schema_name = 'SCHEMA_NAME' AND f_table_name = 'old_table_name'
rec.thegeom

1

我不确定SELECT probe_geometry_columns()的作用,但是您可以轻松地检查geometry_columns表以查看新表名是否在其中,或者它是否仍指向旧表名。

我怀疑您需要重新加载GeoServer存储以确保其“通知”更改。或者,停止并启动即可。


“重新加载GeoServer存储”是什么意思?
Mimo

在状态页面(docs.geoserver.org/latest/en/user/webadmin/server/status.html)上,有一个重新加载按钮。
伊恩·特顿

谢谢。但是,重新加载无效。我仍然收到一个GeoServer错误,抱怨找不到找不到重命名的图层。它仍然尝试以旧名称找到它。
Mimo

您是否确实更改了图层定义以指向新的表名?
伊恩·透顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.