我有一个 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 Polygon 数据类型的预期顺序保持一致。搜索发现PostGIS ST_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;
最佳答案
您可以直接转换为多边形
:
select '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))'::geometry::polygon;
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))
(1 row)
关于postgresql - 交换纯 PostgreSQL 多边形数据中的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68489716/