Polygon/MultiPolygon间,交界区域计算遇到的一些问题...

522 阅读3分钟

1. 起因

不久前,接收到业务方一个判断关于多边形之间,是否存在包含关系(比如交集区域面积大于任意一多边形面积的50%即认定为包含),最终输出存在包含关系的多边形关系数据的需求。

很明显,业务逻辑相对简单,主要难点是判定包含关系过程中的一些技术实现逻辑。

image.png

2. 问题

ok,首先拆分一下涉及到的判断步骤,看看其中涉及到的技术难点:

  1. 无效数据过滤:判定多边形的Polygon数据是否有效(是否闭合、是否内交等);
  2. 判定多边形是否相交:多边形相交的判断逻辑;
  3. 计算相交区域Polygon:计算出两个相交多边形的交集Polygon数据;
  4. 计算多边形面积:如何根据Polygon数据计算面积

3. 一些尝试

3.1 方案探索及问题解决

因为有之前类似的项目经验我遇到的一个难题,早在1966年就已经有解决方案了...
所以第一个念头就是,技术方案是否可以复用在这个项目中?

很遗憾。仔细思考了下业务逻辑后,发现并不可行。

image.png

上一项目:允许一定精度损失的模糊距离匹配
当前项目:两个多边形要么相交,要么不相交,不存在模糊的第三个选项

好叭,只好调研新的方向了。
不过这也正是解决难题的乐趣所在,不是吗?

ceeb653ely1gczidi30oeg209c09c4ln.gif

其实仔细想来,这类空间计算需求相对常见,理论上应该存在相关的科学计算包。

经过一番搜索,在这篇问题中找到了思路。 stackoverflow.com/questions/7…

其中一个回答中提到的st_intersection函数,根据名字来看,貌似是符合需求的?

image.png

再结合我所使用到的spark计算框架,找到了这样一个开源项目:Apache Sedona image.png

逐个确定当前框架如何实现2. 问题中提到的技术问题:

  1. 无效数据过滤:ST_IsValid
  2. 判定多边形是否相交:ST_Intersects
  3. 计算相交区域Polygon:ST_Intersection
  4. 计算多边形面积:ST_AreaSpheroid

似乎,所有问题都迎刃而解啦? ad5f2626-5584-4ca1-8809-567474172f11.jpg

才怪咧,到了demo测试阶段,才发现原始数据质量问题才是大头...
比如: MultiPolygon类型的数据存储为Polygon格式,导致无法通过poly有效性检验(ST_IsValid) MultiPolygon存储为Polygon的错误数据.png 关于Polygon和MultiPolygon定义以及在geojson中存储格式上的区别,可以参考这篇文章:GIS的polygon和multipolygon
在和原始数据提供方沟通后,由于数据使用方较多,本项目暂时采用兼容方案对这类数据予以兼容。

然后在解决了Polygon未闭合、Polygon内交、MultiPolygon内交等其他数据问题后,demo测试数据最终跑通。

polygon内交.png

MultiPolygon内交.png

5. 总结

这次的问题解决并没有像之前那么曲折,主要是加深了对于geojson数据格式的理解以及polygon的常见格式错误,在此记录一下。

希望能对有类似问题的人有所帮助,欢迎留言评论~

image.png

6. 参考文章

几何图形的有效性与简单性
apache-sedona
geojson格式详解
GIS的polygon和multipolygon
Mutipolygon与Polygon的转换
polygon和multipolygon
Invalid number of points in LinearRing
GEOJSON标准格式学习