postgresql - 交换纯 PostgreSQL 多边形数据中的坐标

标签 postgresql postgis

我有一个 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/

相关文章:

javascript - pg-promise task and map with multiple same level nested queries

参数错误的postgresql调用函数

postgresql - Azure PostgreSql,扩展 postgis

sql - 将列名传递给函数

postgresql - 在 mac os 中找不到 PostGIS 扩展(安装在不同的目录中)和 $libdir/postgis-2.3

r - 用于 rgdal 的 Mac postgres/postgis 驱动程序

java - 如何在 java 中调用 PostgreSQL 函数?

postgresql - 从另一个容器访问 Docker postgres 容器

sql - 加快从另一个表更新

python - Heroku教程运行python manage.py syncdb更新本地数据库报错