POSTGRES POSTGIS sfcgal - st_3darea 不工作
POSTGRES POSTGIS sfcgal - st_3darea not working
我在使用多边形 st_3darea、st_3dintersection 等 sfcgal 扩展方法时遇到问题。
当多边形接触时,我收到一条错误消息,提示多边形相交。
这两个三角形显然不相交只接触:
SELECT st_3darea(ST_GeomFromText(
'MULTIPOLYGON Z (((1 0 0, 1 1 0, 0 1 1, 1 0 0)),
((1 0 0, 0 1 1, 0 0 1, 1 0 0)))'));
但是我得到一个错误:
ERROR: MultiPolygon is invalid : intersection between Polygon 0 and 1 : MULTIPOLYGON(((1/1 0/1 0/1,1/1 1/1 0/1,0/1 1/1 1/1,1/1 0/1 0/1)),((1/1 0/1 0/1,0/1 1/1 1/1,0/1 0/1 1/1,1/1 0/1 0/1)))
SQL state: XX000
请帮忙。
欢迎大家提出建议
您的 MULTIPOLYGON
无效,因为多边形相交。使用 ST_MakeValid
解决这个问题:
SELECT
ST_3DArea(
ST_MakeValid('MULTIPOLYGON Z (((1 0 0, 1 1 0, 0 1 1, 1 0 0)),
((1 0 0, 0 1 1, 0 0 1, 1 0 0)))'::geometry));
st_3darea
------------------
1.41421356237309
(1 row)
正如@JGH 所指出的(见评论):
ST_Overlaps, ST_Touches, ST_Within all imply spatial intersection. If any of the aforementioned returns true, then the geometries also spatially intersect. Disjoint implies false for spatial intersection.
一般来说,几何“MULTIPOLYGON”并不意味着对多边形有任何限制。这取决于应用程序。在 Postgres 中,MULTIPOLYGON 多边形不允许接触或相交。在 Esri 应用程序中,术语“MULTIPOLYGON”指的是一组不允许彼此相交但可以接触的多边形,以便 MULTIPOLYGON 可以用来表示一个 mesh surface where polygons are adjacent to each other. WKT format specification 定义 MULTIPOLYGON 为一组没有任何限制的多边形.
要在 Postgres 中表示网格表面,我们应该使用 POLYHEDRALSURFACE。这个几何图形也是多边形的集合,但它们必须彼此相邻。
因此,这将起作用:
SELECT st_3darea(ST_GeomFromText(
'POLYHEDRALSURFACE Z (((1 0 0, 1 1 0, 0 1 1, 1 0 0)),
((1 0 0, 0 1 1, 0 0 1, 1 0 0)))'));
我在使用多边形 st_3darea、st_3dintersection 等 sfcgal 扩展方法时遇到问题。
当多边形接触时,我收到一条错误消息,提示多边形相交。 这两个三角形显然不相交只接触:
SELECT st_3darea(ST_GeomFromText(
'MULTIPOLYGON Z (((1 0 0, 1 1 0, 0 1 1, 1 0 0)),
((1 0 0, 0 1 1, 0 0 1, 1 0 0)))'));
但是我得到一个错误:
ERROR: MultiPolygon is invalid : intersection between Polygon 0 and 1 : MULTIPOLYGON(((1/1 0/1 0/1,1/1 1/1 0/1,0/1 1/1 1/1,1/1 0/1 0/1)),((1/1 0/1 0/1,0/1 1/1 1/1,0/1 0/1 1/1,1/1 0/1 0/1)))
SQL state: XX000
请帮忙。
欢迎大家提出建议
您的 MULTIPOLYGON
无效,因为多边形相交。使用 ST_MakeValid
解决这个问题:
SELECT
ST_3DArea(
ST_MakeValid('MULTIPOLYGON Z (((1 0 0, 1 1 0, 0 1 1, 1 0 0)),
((1 0 0, 0 1 1, 0 0 1, 1 0 0)))'::geometry));
st_3darea
------------------
1.41421356237309
(1 row)
正如@JGH 所指出的(见评论):
ST_Overlaps, ST_Touches, ST_Within all imply spatial intersection. If any of the aforementioned returns true, then the geometries also spatially intersect. Disjoint implies false for spatial intersection.
一般来说,几何“MULTIPOLYGON”并不意味着对多边形有任何限制。这取决于应用程序。在 Postgres 中,MULTIPOLYGON 多边形不允许接触或相交。在 Esri 应用程序中,术语“MULTIPOLYGON”指的是一组不允许彼此相交但可以接触的多边形,以便 MULTIPOLYGON 可以用来表示一个 mesh surface where polygons are adjacent to each other. WKT format specification 定义 MULTIPOLYGON 为一组没有任何限制的多边形.
要在 Postgres 中表示网格表面,我们应该使用 POLYHEDRALSURFACE。这个几何图形也是多边形的集合,但它们必须彼此相邻。
因此,这将起作用:
SELECT st_3darea(ST_GeomFromText(
'POLYHEDRALSURFACE Z (((1 0 0, 1 1 0, 0 1 1, 1 0 0)),
((1 0 0, 0 1 1, 0 0 1, 1 0 0)))'));