【问题标题】:Mix of both POINT and LINESTRING objects in PostgreSQL column. How to extract both the POINT and first point out of the LINESTRING?PostgreSQL 列中 POINT 和 LINESTRING 对象的混合。如何从 LINESTRING 中提取 POINT 和 first 点?
【发布时间】:2020-02-17 07:31:49
【问题描述】:

所以我在 PostgreSQL 数据库中有一个包含 POINT 对象和 LINESTRING 对象的列。现在我的最终目标是从这些对象中提取纬度和经度。对于 POINT 对象,我可以简单地通过查询来做到这一点:

SELECT ST_X(records.primary_location) AS latitude,
       ST_Y(records.primary_location) AS longitude
FROM records

现在,如果它只是数据库中的 POINT 对象,这将得到我所有的纬度和经度。 但是,也有 LINESTRING。从这些我想提取第一个点,然后检索每个点的纬度和经度。为了实现从 POINTS 和 LINESTRING 获取纬度/经度,我尝试了:

SELECT ST_X(ST_PointN(records.primary_location, 1)) AS latitude,
       ST_Y(ST_PointN(records.primary_location, 1)) AS longitude
FROM records

我假设ST_PointN() 会从 LINESTRING 中提取第一个点,并从 POINT 对象中保留一个点。但是,这不起作用。

有没有人知道如何从一列中的这两种类型的对象中同时检索纬度/经度坐标?另外,我希望这发生在一个查询中。

【问题讨论】:

    标签: sql postgresql postgis


    【解决方案1】:

    您是否尝试过根据ST_GeometryType 的结果将这些条件嵌入到CASE 表达式中?

    数据样本

    CREATE TABLE t (geom GEOMETRY);
    INSERT INTO t VALUES ('POINT(1 1)'),
                         ('LINESTRING (8 1, 1 3, 4 4)'),
                         ('POINT(8 2)'),
                         ('LINESTRING (4 2, 2 4, 5 5)');
    

    查询

    SELECT 
      CASE 
        WHEN ST_GeometryType(geom) = 'ST_Point' 
          THEN ST_AsText(geom)
        WHEN ST_GeometryType(geom) = 'ST_LineString' 
          THEN ST_AsText(ST_PointN(geom,1))
      END
    FROM t;
    
        case    
    ------------
     POINT(1 1)
     POINT(8 1)
     POINT(8 2)
     POINT(4 2)
    (4 Zeilen)
    

    如果您确定列中除了点和线串之外没有其他几何类型,则可以使其更简单

    SELECT 
      CASE 
        WHEN ST_GeometryType(geom) = 'ST_LineString' 
          THEN ST_AsText(ST_PointN(geom,1))
        ELSE ST_AsText(geom)
      END
    FROM t;
    
     st_astext  
    ------------
     POINT(1 1)
     POINT(8 1)
     POINT(8 2)
     POINT(4 2)
    (4 Zeilen)
    

    【讨论】:

      猜你喜欢
      • 2018-08-23
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多