(四)建筑物多边形化简系统——“去尾巴”和分割复杂多边形

实际操作中,发现有的多边形存在“尾巴”或者很细的部分。“尾巴”细长,明显不是有效建筑物区域,特点就是区域面积小,看起来细长,附着于大面积多边形外测或者连接两个多边形

需要去除尾巴或者分割多边形,为后面拟合多边形做准备。

(四)建筑物多边形化简系统——“去尾巴”和分割复杂多边形

(四)建筑物多边形化简系统——“去尾巴”和分割复杂多边形

(四)建筑物多边形化简系统——“去尾巴”和分割复杂多边形

算法思想

去除“尾巴”(凸出部分)和分割多边形的算法思想:

1.求平均距离。

针对环,遍历每个点,求到下一个点之间的距离,计算该环两点间的平均距离L,为之后设定阈值做准备。   

具体做法:每个polyline(环)添加计算平均距离的函数calAvgDis,添加平均距离成员变量avgDis,在构造函数中调用calAvgDis函数初始化avgDis。

2.设定判断两点的距离阈值和下标阈值。

即存在两个点下标差超过阈值,距离差小于阈值,若两点与其之间的点构成的环面积小于阈值,则说明“尾巴”存在;若大于阈值,则说明多边形应该分割。

此处下标阈值设定为10,距离阈值设定为3个avgDis,面积阈值设定为固定值,具体效果和参数的改变要根据实际效果改变。

3.遍历环上的没点,找到最符合条件的两点。

计算每点到其他点的距离,针对每个点来说,遍历的起点是本点阈值+下标阈值。

当出现距离小于阈值时,记录下标号,得到(本点下标,距离小于阈值点的下标)的下标对。

每个点可能有不同的下标对,每个环可能有不同的疑似点及其下标对。

如何找到最合理的两点,遍历这些下标对:1)首先找下标号差距最大;2)相同的情况下距离最小的;

4.找到两点后:1)针对“尾巴”(面积小于阈值),消除两个点之间的点,得到除去尾巴的多边形。2)针对面积大于阈值的,分割多边形。

5.循环操作,直至某一次操作前后环的点个数一致。

 

实际操作

1.设置 距离阈值 和 下标差阈值,实际数值根据要求进行设置

int firstNum = circles[i]->pts.size(); //操作前点数 int lastNum = 0; //操作后点数 初始为0 int t = circles[i]->pointDisThreshold; //下标差阈值 double length = circles[i]->calAvgDis(circles[i]->pts); //距离阈值

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypsjj.html