Rya*_*ale 5 postgresql postgis sqlgeography sqlgeometry
我需要编写一个查询,该查询查找所有未闭合的多边形,并通过复制第一个点并创建另一个终点来关闭它们。
我可以选择无效的行:
SELECT delivery_zone_id, polygon from delivery_zone WHERE ST_IsClosed(polygon::geometry) = FALSE;
Run Code Online (Sandbox Code Playgroud)
而且我能够转储来自每个多边形的各个点:
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;
Run Code Online (Sandbox Code Playgroud)
结果看起来像这样:
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)
Run Code Online (Sandbox Code Playgroud)
这是我缺乏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;
Run Code Online (Sandbox Code Playgroud)
您可以尝试使用线添加点,然后转换为多边形。
让我们注意,创建一个不闭合的多边形是不可能的......不太确定你是如何得到一个的,希望你能够首先将它们转换为一条线。
因此,我们的想法是获取这条线,然后在最后一个位置 (-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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
325 次 |
| 最近记录: |