【问题标题】:POSTGRES POSTGIS sfcgal - st_3darea not workingPOSTGRES POSTGIS sfcgal - st_3darea 不工作
【发布时间】:2021-07-14 14:02:19
【问题描述】:

我对 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

请帮忙。

欢迎提出建议

【问题讨论】:

  • 你试过 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));
  • 谢谢,它正在使用 makevalid。但是为什么它不是有效的呢?
  • doc“ST_Overlaps、ST_Touches、ST_Within 都暗示空间相交。如果上述任何一个返回 true,则几何图形也在空间相交。不相交意味着空间相交为 false。”
  • @GrigoryIlizirov postgis 抱怨,因为多边形“共享一些坐标”(触摸)。我相信 JGH 的评论已经足够清楚了。欢呼

标签: postgresql postgis


【解决方案1】:

您的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 所指出的(参见 cmets):

ST_Overlaps、ST_Touches、ST_Within 都暗示空间相交。如果上述任何一项返回 true,则几何图形也在空间上相交。不相交意味着空间相交为假。

【讨论】:

    【解决方案2】:

    一般来说,几何“MULTIPOLYGON”并不意味着对多边形有任何限制。这取决于应用程序。在 Postgres 中,不允许 MULTIPOLYGON 多边形接触或相交。在 Esri 应用程序中,术语“MULTIPOLYGON”是指一组不允许彼此相交但可以接触的多边形,因此 MULTIPOLYGON 可用于表示一个mesh surface,其中多边形彼此相邻。 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)))'));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 2022-10-16
      • 2021-05-04
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      相关资源
      最近更新 更多