gpt4 book ai didi

sql - 在 PostgreSQL 列中混合使用 POINT 和 LINESTRING 对象。如何从 LINESTRING 中提取 POINT 和第一个点?

转载 作者:行者123 更新时间:2023-11-29 13:08:14 32 4
gpt4 key购买 nike

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

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

现在,如果它只是数据库中的 POINT 对象,这将使我获得所有纬度和经度。但是,还有 LINESTRINGs。我想从中提取第一个点,然后检索每个点的纬度和经度。为了从 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 对象中的一个点。但是,这不起作用。

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

最佳答案

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

数据样本

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)

关于sql - 在 PostgreSQL 列中混合使用 POINT 和 LINESTRING 对象。如何从 LINESTRING 中提取 POINT 和第一个点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58482412/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com