我需要编写一个查询,找到任何未关闭的多边形,并通过复制第一个点并创建一个额外的结束点来将其关闭。
我能够选择无效的行:
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的答案,我能够创建以下更新查询。这将查找任何未关闭的多边形并通过复制第一个点添加新的结束点。
注意:这仅适用于简单的“单一”多边形。如果您有复杂的外部和内部多边形,则需要对此查询进行一些重大更改。
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;
polygon
列的数据类型是什么? - JGH