因此,我在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对象中保留一个点。但是,这不起作用。
有人知道如何在同一列中同时从这两种类型的对象中检索经/纬度坐标吗?另外,我希望这种情况只发生在一个查询中。
答案 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)