解决geometry自相交导致的问题

原sql:

st_area(st_intersection ( st_transform(st_union ( ds2_stat_inbound_data.dsd_geometry ), 4530), st_transform(ro_global_dim_space.gdsgeometry, 4530) )) as day_area

其中st_intersection (geometry,geometry)会出现如下错误:

lwgeom_intersection: GEOS Error: TopologyException: Input geom 0 is invalid: Self-intersection at or near point 42626468.098990165 5294850.7621195437 at 42626468.098990165 5294850.7621195437

原因:在使用st_intersection()计算两个多边形相交的部分时,遇见了单个多边形自相交而无法计算的情况。

解决方案:

ST_buffer(geometry, -0.00),对于Geometry类型对象,返回以给定点为中心点,距离小于或等于指定距离的所有点组成的Geometry对象。对于Geography类型对象,则在几何空间参考系中计算。

st_makevalid(geometry),该函数尝试在不丢失任何输入顶点的情况下创建给定无效几何体的有效表示。返回有效的几何图形时不会更改。

通过st_buffer()做了多边形膨胀。 百度一番之后,看一些文章提到要用 st_buffer解决这个问题:但是单纯用st_buffer(geom, 0.001)处理之后发现, buffer范围太大导致相交地块儿差不多都是圆形.....当时感觉很纠结,觉得用st_buffer是不是计算不了,后面有空看了下文档,发现st_buffer() 在应用时依赖数据库所使用的空间引用系统:

Units of radius are measured in units of the spatial reference system.

经过一阵子的研究,确定了,多边形自相交的话可以通过st_makevalid(geometry)函数解决这个问题。 当然,如果需要批量解决子乡郊问题,一个个处理会很费时, 可以使用st_isvalid(geometry) = 'f' 查出存在问题的 多边形数据进行批量更新。

posted @ 2022-08-26 16:51  电磁感应  阅读(353)  评论(0)    收藏  举报