1. 起因
不久前,接收到业务方一个判断关于多边形之间,是否存在包含关系(比如交集区域面积大于任意一多边形面积的50%即认定为包含),最终输出存在包含关系的多边形关系数据的需求。
很明显,业务逻辑相对简单,主要难点是判定包含关系过程中的一些技术实现逻辑。
2. 问题
ok,首先拆分一下涉及到的判断步骤,看看其中涉及到的技术难点:
- 无效数据过滤:判定多边形的Polygon数据是否有效(是否闭合、是否内交等);
- 判定多边形是否相交:多边形相交的判断逻辑;
- 计算相交区域Polygon:计算出两个相交多边形的交集Polygon数据;
- 计算多边形面积:如何根据Polygon数据计算面积;
3. 一些尝试
3.1 方案探索及问题解决
因为有之前类似的项目经验我遇到的一个难题,早在1966年就已经有解决方案了...
所以第一个念头就是,技术方案是否可以复用在这个项目中?
很遗憾。仔细思考了下业务逻辑后,发现并不可行。
上一项目:允许一定精度损失的模糊距离匹配。
当前项目:两个多边形要么相交,要么不相交,不存在模糊的第三个选项。
好叭,只好调研新的方向了。
不过这也正是解决难题的乐趣所在,不是吗?
其实仔细想来,这类空间计算需求相对常见,理论上应该存在相关的科学计算包。
经过一番搜索,在这篇问题中找到了思路。 stackoverflow.com/questions/7…
其中一个回答中提到的st_intersection函数,根据名字来看,貌似是符合需求的?
再结合我所使用到的spark计算框架,找到了这样一个开源项目:Apache Sedona
逐个确定当前框架如何实现2. 问题中提到的技术问题:
- 无效数据过滤:ST_IsValid;
- 判定多边形是否相交:ST_Intersects;
- 计算相交区域Polygon:ST_Intersection;
- 计算多边形面积:ST_AreaSpheroid;
似乎,所有问题都迎刃而解啦?
才怪咧,到了demo测试阶段,才发现原始数据质量问题才是大头...
比如: MultiPolygon类型的数据存储为Polygon格式,导致无法通过poly有效性检验(ST_IsValid)
关于Polygon和MultiPolygon定义以及在geojson中存储格式上的区别,可以参考这篇文章:GIS的polygon和multipolygon。
在和原始数据提供方沟通后,由于数据使用方较多,本项目暂时采用兼容方案对这类数据予以兼容。
然后在解决了Polygon未闭合、Polygon内交、MultiPolygon内交等其他数据问题后,demo测试数据最终跑通。
5. 总结
这次的问题解决并没有像之前那么曲折,主要是加深了对于geojson数据格式的理解以及polygon的常见格式错误,在此记录一下。
希望能对有类似问题的人有所帮助,欢迎留言评论~
6. 参考文章
几何图形的有效性与简单性
apache-sedona
geojson格式详解
GIS的polygon和multipolygon
Mutipolygon与Polygon的转换
polygon和multipolygon
Invalid number of points in LinearRing
GEOJSON标准格式学习