【发布时间】:2021-07-22 18:13:04
【问题描述】:
我有一个 PostgreSQL 11 表,其中包含一个普通的 PostgreSQL Polygon 列,用于存储地理区域,如下所示(简化):
CREATE TABLE areas
(
name TEXT NOT NULL,
bounds POLYGON NOT NULL
);
然后我将 > 100 行手动输入的数据插入到此表中,坐标顺序为纬度、经度(这是导航中常见的顺序),例如在此示例中:
INSERT INTO areas (name, bounds) VALUES (
'Hamburg Harbour',
'((53.543420, 9.875492), (53.486682, 9.885482), (53.467172, 9.990250), (53.519363, 9.993678),
(53.521112, 10.011104), (53.533893, 10.018592), (53.544478, 9.965988))'
);
我现在收到了一些其他区域,其坐标采用 PostgreSQL 多边形数据类型的默认顺序 x、y(即经度、纬度)。因此,我决定交换所有现有区域的坐标,以与新收到的区域以及 PostgreSQL 多边形数据类型的预期顺序保持一致。一搜发现PostGISST_SwapOrdinates()函数can accomplish this,像这样:
SELECT ST_AsText(ST_SwapOrdinates(bounds::geometry, 'xy'))
FROM areas
WHERE name = 'Hamburg Harbour';
输出:
POLYGON((9.875492 53.54342,9.885482 53.486682,9.99025 53.467172,9.993678 53.519363,10.011104 53.521112,10.018592 53.533893,9.965988 53.544478,9.875492 53.54342))
到目前为止一切顺利。但是,我想将交换后的坐标存储回像上面那样的表中,其中包含一个普通的 PostgreSQL Polygon 类型列。 ST_SwapOrdinates() 函数返回 PostGIS 几何类型数据,ST_AsText() 函数只是将其转换为相同的文本表示。这些都不是 PostgreSQL Polygon 数据类型。尝试了各种方法将结果转换回普通的 PostgreSQL Polygon 类型,但均未成功。在somewhat related post 中,但转换方向相反,该解决方案建议使用 regexp_replace() 构造一个符合预期格式的字符串。我不敢相信没有更简单的方法可以将 PostGIS 几何转换为 PostgreSQL 多边形。我错过了什么明显的东西吗?
已编辑:
感谢@JGH,答案很简单(我很确定@JGH 的建议是我已经尝试过的许多事情之一,但显然不是!),即从 PostGIS 类型几何转换为 PostgreSQL 类型多边形。
以下创建一个交换坐标的新表:
CREATE TABLE areas_swapped AS
SELECT name, ST_SwapOrdinates(bounds::GEOMETRY, 'xy')::POLYGON
FROM areas;
【问题讨论】:
标签: postgresql postgis