问题描述
因前一段时间一个做地籍小伙伴联系我,说他们的一个软件出的界址点签章表不符合甲方要求,具体情况在这样的:
因为在界址点签章表中牵涉到四邻签字的问题,其中宗地情况如图所示,红色的线是宗地线,001号宗地的四个邻宗的情况就是:周围除了和南面的002接壤之外全是集体的,集体的我们这里按000表示。
其他三条边相当于每条边都只要集体这一个权利人,每条边签一个人的就行了,而南面这条边它就牵涉到两个宗地的情况,四邻签字就需要多加一行了,把每条边的起点、终点和中间点给填上,具体表格模板情况如下:
然而他们的软件导出的表格是这样的,每两个点直接就就是一行,并没要将四邻的整条边体现出来;
解决办法
已有数据
小伙伴给我提供的数据有这个村的界址点shp图层、已经导出的界址点签章表,以及其他的一些信息,由于他们之前用的软件已经导出过一次表格,我只需把其修改一些就行了,并没有涉及到图形之间的拓扑问题,这点还是很好的。
大致思路
1首先找出东西南北4个角的界址点号;
2看起点和终点之间如果是否存在不同的邻宗,若有,则将这条边分开,没有,就把中间点号给补齐
具体流程
首先获取4个角点的界址点号,我用arcpy遍历界址点图层的数据,获取到每个界址点的坐标信息(当然后来我放弃了arcpy,选则了dbfread,因为这些坐标信息已经写到了表里面了),根据所选宗地做一个最小外接矩形,离这个矩形顶点近的那四个点就被选出来了。根据坐标信息求出xmin,ymin,xmax,ymax(竖轴为x轴),下图最外面的一个即是求出来的外接矩形,算出每个界址点到外接矩形顶点的距离,距离小的就是宗地是顶点了O(∩_∩)O哈哈~
1号界址点是他们已经确定好的了,于是任务就缩小到了3个,岂不是美滋滋,然而此时我发现3号点好像离右下角更近,但它做顶点的话显然是不符合现实情况。这时候用到了求多边形的内角,根据多边形内角设立一个阈值,小于这个阈值的才进行距离的比较,于是就踏上了求多边形内角的救赎之路。这里用到了坐标反算,让我们来温习一下数字测图的功课吧。
坐标反算公式是有两个的,一个是可以求角度的,一个是可以求距离的,求距离的我们在前面已经用到了
这时求出来的α并不是方位角,而是一个象限角,象限角的概念是由基本方向线北端或南端顺时针或逆时针方向量到直线的角度,其取值范围为0°~90°,根据方位角与象限角之间的关系进行换算,这个是出自于李长春、何荣编写的数字测图与方法(煤炭工业出版社)上第23页的截图和描述。
期间可能会出现大于360°的角或小于0°的角,加上或减去360°即可,再根据导线测量里的方位角计算公式,算出右角,这个插入公式我还不是很会用,就用“前,后,右”的拼音代替吧,由于界址点都是按顺时针排序的,所以求出右角就是多边形的内角了。将角度小于某个阈值的界址点与外接矩形的顶点距离进行比较,返回宗地的四个角点,多边形小于180°的角是否在四个以上我也没有去考证过。
拿到宗地的四个角点之后呢,就可以在表格里进行重新编辑了,这里我用到了一个python-docx的包,一开始我看网上说这个包不能打开doc格式的文档,我还用win32com进行了格式转换,因为要另存和删除比较麻烦,后来我大胆地尝试了一下,python-docx还是可以打开doc的。后面就是一些枯燥无味的循环和排序了,这周末追花园宝宝睡得晚,有点困了,后面的事情呢就给忘记了。
封装好的程序我已经放到了我的资源里面,可以趁机多蹭小伙伴几个币(*^▽^*)