gpt4 book ai didi

postgresql - Postgres/postgis - 确保所有多边形都是封闭的

转载 作者:行者123 更新时间:2023-11-29 11:29:35 25 4
gpt4 key购买 nike

我需要编写一个查询来查找任何未闭合的多边形并通过复制第一个点并创建一个额外的端点来关闭它们。

我能够选择无效的行:

SELECT delivery_zone_id, polygon from delivery_zone WHERE ST_IsClosed(polygon::geometry) = FALSE;

而且我能够从每个多边形中转储各个点:

SELECT delivery_zone_id, ST_AsText((dp).geom) FROM
(SELECT delivery_zone_id, ST_DumpPoints(polygon::geometry) AS dp
FROM delivery_zone
WHERE ST_IsClosed(polygon::geometry) = FALSE
) AS coords;

结果是这样的:

1   POINT(-96.80037 33.09812)  ## Copy this point and add it to the set
1 POINT(-96.80427 33.0956)
1 POINT(-96.80401 33.09219)
1 POINT(-96.79603 33.09222)
1 POINT(-96.79346 33.09647)
1 POINT(-96.80037 33.09857)

4 POINT(-96.80037 33.099) ## Copy this point and add it to the set
4 POINT(-96.80427 33.0956)
4 POINT(-96.80401 33.09219)
4 POINT(-96.79603 33.09222)
4 POINT(-96.79346 33.09647)
4 POINT(-96.80037 33.09923)

这是我缺乏sql技能的地方。我需要一些帮助来复制第一个点并使用该数据创建一个新的终点。欢迎伪查询 - 我只需要看看它可能是什么样子,我就可以填补空白。


更新:最终解决方案

感谢下面 JGH 的回答,我能够创建以下更新查询。这将找到任何未闭合的多边形并通过复制第一个点添加一个新的端点。

Note: this will only work with simple "single" polygons. If you have complex outer and inner polygons, you will need to make some drastic changes to this query.

UPDATE delivery_zone dz
SET polygon=ST_MakePolygon(ST_AddPoint(subquery.openline, ST_PointN(subquery.openline, 1), -1))
FROM (
SELECT delivery_zone_id, ST_ExteriorRing(polygon::geometry) AS openline
FROM delivery_zone WHERE ST_IsClosed(polygon::geometry) = FALSE
) AS subquery
WHERE dz.delivery_zone_id = subquery.delivery_zone_id;

最佳答案

您可以尝试使用线添加点,然后转换为多边形。

请注意,创建一个非闭合多边形是不可能的...不太确定您是如何获得的,希望您能够首先将它们转换为一条线。

所以,我们的想法是获取直线,然后在最后一个位置 (-1) 添加一个点。这个点与这条线的第一个点(位置 1)相同。最后你可以转换为多边形

WITH src AS (
SELECT ST_GeomFromText('LINESTRING(0 0, 0 1, 1 1, 1 0)') As openline)
SELECT st_asText(openline),
st_asText(ST_MakePolygon(st_addPoint(openline,st_PointN(openline,1),-1)))
FROM src;



st_astext | st_astext
-----------------------------+--------------------------------
LINESTRING(0 0,0 1,1 1,1 0) | POLYGON((0 0,0 1,1 1,1 0,0 0))
(1 row)

关于postgresql - Postgres/postgis - 确保所有多边形都是封闭的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51312258/

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