(四)建筑物多边形化简系统——“去尾巴”和分割复杂多边形
发布日期:2022-02-10 11:37:02 浏览次数:47 分类:技术文章

本文共 1854 字,大约阅读时间需要 6 分钟。

问题说明

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

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

   

 

算法思想

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

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;   //操作后点数  初始为0int t = circles[i]->pointDisThreshold; //下标差阈值double length = circles[i]->calAvgDis(circles[i]->pts);  //距离阈值

2.针对环的每一个点,求与之距离超出阈值,下标差超过阈值且差值最大的点,形成一个点与另一个点的关系对(J和K),遍历所有的关系对,找到最合适的一个关系对(因为每次只删除一个尾巴)

while(firstNum!=lastNum )		{			firstNum = circles[i]->pts.size();			int num = circles[i]->pts.size()-1;  //环的点数(去除尾点)			int finalJ = 0, finalK = 0, FinalDis = 0, finalType = 0;  //最后J,K,类型			if(num > t) { //环的总点数大于点数差阈值时				//找到所有环中下标差最大的两点				for(int j = 0 ; j < (num - t); j++){ //遍历环的每个点,					int tempDis = 0, tempk = 0, temptype = 0;					for(int k = (j + t) ; k
=t ; k++) { //针对每一个点,计算该点与符合要求的点的距离,找到下标差最大的另一个点, int dis = (j+num-k)>=(k-j)?(k-j):(j+num-k); //取小的 int type = (j+num-k)>=(k-j)?1:2; // 1代表顺序,2代表非顺序 if( (calDis(circles[i]->pts[j],circles[i]->pts[k])<(length*3)) && (tempDis

3.删除尾巴或者分割多边形

实验效果

可以发现,经过一次去尾巴操作,“尾巴”明显变短了。

总结

由于本算法自己原创,实际问题又非常复杂,所以效果并没有很理想,后期还有优化。实际操作中,部分尾巴去不掉,算法也耗时,这表明这种方法并不是一个很成熟的算法。而且由于数据的复杂性,考虑的问题很多。比如有的最理想的点对中,一个在环首附近的位置,另一个在环尾附近位置,需要考虑不同的取舍办法,等等。

该算法以后需要进一步考虑和优化。

转载地址:https://blog.csdn.net/Fan_z_0802/article/details/82954037 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:操作系统原理学习_第三周(下)_进程
下一篇:shp系列(二)——利用C++进行shp文件的读(打开)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年03月09日 10时54分20秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

去掉数组最后一个元素_【一天一大 lee】在排序数组中查找元素的第一个和最后一个位置 (难度:中等) Day20201201... 2019-04-21
秦九韶算法递推公式_算法讲解之复杂度分析 2019-04-21
添加绝对路径_网站中如何添加绝对路径 2019-04-21
python房价数据分析波士顿代码数据_python数据分析-波士顿房价预测-Go语言中文社区... 2019-04-21
redis线程阻塞原因排插_Redis阻塞原因详解 2019-04-21
labview自动保存报表_基于LabVIEW的Excel报表的自动生成功能 2019-04-21
geotool 导出shp_Java 读取shape文件 2019-04-21
mysql 关联更新_MySQL UPDATE多表关联更新 2019-04-21
mysql call_mysql的call用法 call调用函数的例子 2019-04-21
python参数验证_参数验证,Python中的最佳实践 2019-04-21
python画多层网络_在pymn中修改多层网络图 2019-04-21
java net 安卓_android -------- java.net.UnknownServiceException 2019-04-21
java 密钥 aes 解密_Java中AES加密解密以及签名校验 2019-04-21
java树转化成图_Java 转换一组数据为树型数据 2019-04-21
java 底层ppt_Java 如何设置 PPT 中的形状排列方式 具体内容 2019-04-21
mysql更新第5条记录_MYSQL中添加、更新、删除数据 2019-04-21
mysql service5.7_Mysql5.7服务下载安装 2019-04-21
mysql查看线程完整执行命令_MySQL-查看运行的线程-SHOW PROCESSLIST 2019-04-21
mysql 更新数据 字符串_批量替换 MySQL 指定字段中的字符串 2019-04-21
web开发 mysql安装_mysqlinstallerwebcommunity5.7.21.0.msi安装图文教程 2019-04-21