ArcGis for Java : 判断一个几何Geometry与多个几何Geometry之间的关系 的解决方案

需求

浓缩下需求,就是判断几何Geometry与Geometry之间的关系。

这个还是很好做的,GeometryEngine里面应有尽有:

相等equals、相交intersects​、边缘相接触touches、在..之内within...

GeometryEngine官方文档

但实际的需求是:判断一个点是否在多个面之内,并确定到底在哪一个面内。

这里用的是java语言,在文档里,判断一个几何是否在另一个几何之内的方法是:

第一个参数传点,第二个参数传面。

可以判断,但是这里只能传一个Geometry.

如果我需要判断一个点,是否在几百上千个面以内呢?挨个遍历的效率太低了。

解决方案

格局打开,在within的上面,有一个union方法:

union方法可以传一个list,然后返回union的结果,一个合集。

这里是官方文档对union方法的介绍,以我四级考八次的英语水平介绍一下:

其实我还蛮好奇union后的结果是什么样子的,它是怎么处理几何之间的那些缝隙的,可惜一直比较忙(懒),没有把它在地图上可视化一下看看。

仅仅union是不够的,因为需求里需要返回该点具体在哪个面之内。

所以——

假如有一个点,一千个固定存在的面。

那么,在系统程序初始化的时候,查询出所有固定存在的面。

再将这1000个面分成5个面集合,面集合1,面集合2,面集合3,面集合4,面集合5,每个集合均分200个面。

把每个集合里的面union成一个面,对应得到组合面A,组合面B,组合面C,组合面D,组合面E。

要判断点是否在这一千个面内,就先用within方法,直接遍历判断该点是不是在组合面ABCDE里面。

如果不在,则该点不在这1000个面以内。

如果在,那么上一个步骤,我们是可以获取到该点究竟在哪个组合面之内的。

假如在组合面D内,已知组合面D是由面集合4组合而成的,所以接下来我们需要判断,该点究竟在面集合4里面的哪一个面里面。

这里直接遍历就好了。

但其实一次性遍历200个还是很慢的,建议再走一次流程,细分一下,把数量降到50,就很快了,大概是这样的思路。

posted on 2022-01-18 16:05  northwest  阅读(373)  评论(0编辑  收藏  举报

导航