【问题标题】:Swapping coordinates in plain PostgreSQL polygon data在普通 PostgreSQL 多边形数据中交换坐标
【发布时间】: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


    【解决方案1】:

    你可以直接投到polygon:

     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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2012-07-05
      • 2016-10-09
      • 1970-01-01
      • 2016-09-11
      • 2017-11-04
      • 1970-01-01
      相关资源
      最近更新 更多