Esri geometry api java 学习 功能实现 (4) 空间分析、几何分析
Esri geometry api java 中,使用最多的功能莫过于空间关系的判断和计算,常规的操作是:
求交、求并、求差、求对等差分
对应的函数为
Difference Union Intersection SymmetricDifference (调用方法请点击查看)
他们其实是共通的,下面我们先从最简单的几何原理实现它。
一、原理实现
首先回顾前面所说过的面数据结构,一个面的数据是由一条封闭的折线(向量)顺时针围成的。其中顺时针就标志着:折线(向量)的前进的方向上的左边是空,右边是实。
那么这个结构在多个形状重叠的情况下会有什么表现呢?
这时我们放弃原来的个体(两个面),把这个形状按照边重新拆开并且重点观察每个子图形的内边界的空实判断:
图形1 的边界有空有实
图形2 的边界全部实的
图形3 的边界有空有实
这时我们发现了:
- 图形2是由所有图形的边界的右边组成的,它正是求交的结果
- 图形1、3是由所有图形的边界的右边组成的,它正是求差、求对等差分的结果
- 图形1+图形2+图形3 都包含右边,把所有的含右边的图形组合就是求并的结果
同时看下图形的所有左边:
- 所有为空的边组成的形状就是外轮廓(同时也是求并的结果)
至此我们找到了空间分析的基本原理。
二、准备工作 (结构)
虽然上面的原理听起来很简单的,但是实现起来却非常困难:
1.要将很多很多的、不同类型的图形存在一个“画布”上
就是这一步
2.要实现形状的重新分割
就是这一步
下面介绍Esri geometry如何实现上面的功能:
准备工作:
首先一个大画布:EditShape
EditShape分三层:EditShape包含很多geometry(点层、线层、面层),每个geometry(线层、面层)由很多path(有向折线)组成,每一条path由很多vertex(点)组成。
其次是保证重新分割的结构:Topograph
cluster在这里是节点
halfEdge指半边结构(见半边结构讲解)
chain是建立的环
看着这些几何结构,再想想我们的空间数据,接下来的思路是:
空间数据转换为可差分的半边拓扑结构 -> 半边的分割重组 -> 结果输出为空间数据
- 把地理数据vertex(点) -> 转换为几何cluster(节点)
- 将地理数据path(有向折线) -> 建立有向的可切割的halfEdge(半边)
- 用地理数据path(有向折线) -> 给halfEdge(半边)赋值:左边还是右边
- halfEdge(半边)->把原图形彻底打散成面的最小单位chain(环)
- halfEdge(半边)->判断空和实确定chain(环)的属性(1.全实;2.有空有实;3.全空。)
- 根据具体的空间操作返回不同的chain,将重叠边消除,重新组合出path。
- path -> geometry -> 输出结果
三、实现方法
前置:
打断相交线,在交点处生成新的节点。
第一步:将所有节点按照Y轴顺序排列
第二步:建立半边
遍历每个节点,寻找每个节点所在PATH上的顺序下一点,两点间建立半边结构
上图中间箭头为地理数据Path的方向,建立两个小箭头的半边结构数据,最终会得到无序的半边结构。建立好的半边结构可以根据顺序分为 half(同Path顺序) || twinHalf(反Path顺序),可以给他们不同的属性
第三步:排序
将每个节点下属(从此节点发出)的所有半边按照顺时针排列
这样做的好处是什么呢?当一个半边此节点时,我们按顺序取得的下一个半边就是这个指来此节点要连接的下一个半边,见下图:
第四步:成环
遍历个节点,遍历节点上的半边,将半边一直延伸到下一个直到成环
最终结果是:将一个有交集的面分割成了不相交的最小单位面
=====》
第五步:确定面属性
遍历环上每一个半边的属性,分为
边界有空有实=>差集
边界全部空的=>并集
边界全部实的=>交集
根据空间分析的要求返回不同的数据。