PostgreSQL列中POINT和LINESTRING对象的混合。如何从LINESTRING中提取POINT和第一点?

时间:2019-10-21 08:23:06

标签: sql postgresql postgis

因此,我在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对象中保留一个点。但是,这不起作用。

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

1 个答案:

答案 0 :(得分:1)

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

数据样本

pages = [
'www.page.com/page1'
'www.page.com/page2'
]

查询

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)