import arcpy import math def SZpoly(zdpath1,zdpath2,tbpath1,tbpath2,tbpath3): tb1 = -1 arcpy.MakeFeatureLayer_management(zdpath1, 'ZD') try: arcpy.MakeFeatureLayer_management(tbpath1, 'TB') tb1 = 1 except: arcpy.AddMessage('无图斑1shp可加载') zd2 = -1 try: arcpy.MakeFeatureLayer_management(zdpath2, 'ZD2') zd2 = 1 except: arcpy.AddMessage('无宗地2shp可加载') tb2 = -1 try: arcpy.MakeFeatureLayer_management(tbpath2, 'TB2') tb2 = 1 except: arcpy.AddMessage('无图斑2shp可加载') tb3 = -1 try: arcpy.MakeFeatureLayer_management(tbpath3, 'TB3') tb3 = 1 except: arcpy.AddMessage('无图斑3shp可加载') #添加字段 try: arcpy.AddField_management('ZD', '四至北', 'TEXT') except: arcpy.AddMessage('四至北字段已存在') print('四至北字段已存在') try: arcpy.AddField_management('ZD', '四至南', 'TEXT') except: arcpy.AddMessage('四至南字段已存在') print('四至南字段已存在') try: arcpy.AddField_management('ZD', '四至西', 'TEXT') except: arcpy.AddMessage('四至西字段已存在') print('四至西字段已存在') try: arcpy.AddField_management('ZD', '四至东', 'TEXT') except: arcpy.AddMessage('四至东字段已存在') print('四至东字段已存在') #一个一个来,先把临宗地搞出来 with arcpy.da.UpdateCursor('ZD', ['SHAPE@', '四至北','四至东','四至南','四至西','宗地编号']) as cursorA: for curA in cursorA: #szlist1是邻宗的结果,szlist2是地物的结果 szlist1 = [] szlist2 = [] poly1 = curA[0] #这个阈值可以调整 buf1 = poly1.buffer(1) zddm0 = curA[5] list1 = [] #首先是挑选出相交的几个图形(应该不会很巧的只是共线) arcpy.SelectLayerByLocation_management('ZD','INTERSECT',buf1) count0 = int(arcpy.GetCount_management('ZD').getOutput(0)) if count0 == 0: #那就不关宗地什么事了 pass else: #shape,宗地编号,权利人 with arcpy.da.SearchCursor('ZD', ['SHAPE@', '宗地编号','权利人']) as cursorB: for curB in cursorB: #排除自己 zddm1 = curB[1] if zddm1 == zddm0: pass else: #先把信息都装入list,方便提取 slist1 = [] slist1.append(curB[0]) slist1.append(curB[1]) slist1.append(curB[2]) list1.append(slist1) #首先是挑选出相交的几个图形(应该不会很巧的只是共线) if zd2 == 1: arcpy.SelectLayerByLocation_management('ZD2','INTERSECT',buf1) count0 = int(arcpy.GetCount_management('ZD2').getOutput(0)) if count0 == 0: pass else: #shape,宗地编号,权利人 with arcpy.da.SearchCursor('ZD2', ['SHAPE@', '宗地编号','权利人']) as cursorC: for curC in cursorC: #排除自己 zddm1 = curC[1] if zddm1 == zddm0: pass else: #先把信息都装入list,方便提取 slist1 = [] slist1.append(curC[0]) slist1.append(curC[1]) slist1.append(curC[2]) list1.append(slist1) if list1 != []: #分别过四至内容 szlist1 = szsf(list1,buf1,poly1) list2 = [] if tb1 == 1: #首先相交 arcpy.SelectLayerByLocation_management('TB','INTERSECT',buf1) count1 = int(arcpy.GetCount_management('TB').getOutput(0)) if count1 == 0: #那就不关图斑什么事了 pass else: with arcpy.da.SearchCursor('TB', ['SHAPE@', 'DLMC']) as cursorD: for curD in cursorD: slist2 = [] slist2.append(curD[0]) slist2.append(curD[1]) list2.append(slist2) if tb2 == 1: #首先相交 arcpy.SelectLayerByLocation_management('TB2','INTERSECT',buf1) count1 = int(arcpy.GetCount_management('TB2').getOutput(0)) if count1 == 0: #那就不关图斑什么事了 pass else: with arcpy.da.SearchCursor('TB2', ['SHAPE@', 'DLMC']) as cursorE: for curE in cursorE: slist2 = [] slist2.append(curE[0]) slist2.append(curE[1]) list2.append(slist2) if tb3 == 1: #首先相交 arcpy.SelectLayerByLocation_management('TB3','INTERSECT',buf1) count1 = int(arcpy.GetCount_management('TB3').getOutput(0)) if count1 == 0: #那就不关图斑什么事了 pass else: with arcpy.da.SearchCursor('TB3', ['SHAPE@', 'DLMC']) as cursorF: for curF in cursorF: #角度和地物名称 slist2 = [] slist2.append(curF[0]) slist2.append(curF[1]) list2.append(slist2) if list2 != [] and szlist1 !=[]: #分别过四至内容(图斑只需要补没有的) szlist2 = szsf1(list2,poly1,szlist1,poly1) else: szlist2 = szlist1 try: #再四舍五入下,防止有空 if szlist2[0] != '': curA[1] = szlist2[0] else: if szlist2[1] !='': curA[1] = szlist2[1] else: if szlist2[3] !='': curA[1] = szlist2[3] if szlist2[1] != '': curA[2] = szlist2[1] else: if szlist2[0] !='': curA[2] = szlist2[0] else: if szlist2[2] !='': curA[2] = szlist2[2] if szlist2[2] != '': curA[3] = szlist2[2] else: if szlist2[1] !='': curA[3] = szlist2[1] else: if szlist2[3] !='': curA[3] = szlist2[3] if szlist2[3] != '': curA[4] = szlist2[3] else: if szlist2[0] !='': curA[4] = szlist2[0] else: if szlist2[2] !='': curA[4] = szlist2[2] cursorA.updateRow(curA) except: pass arcpy.AddMessage(zddm0 + ' OK') def szsf(list1,poly1,opoly1): szb = [] szd = [] szn = [] szx = [] listsz = [] ii = 0 ceny = (opoly1.extent.YMax + opoly1.extent.YMin)/2 cenx = (opoly1.extent.XMax + opoly1.extent.XMin)/2 while ii < len(list1): shp1 = list1[ii][0] #获取焦点做垂线计算角度 try: pts = poly1.intersect(shp1, 1) #不管有多少个点,直接求平均值 sumx = 0 sumy = 0 kk = 0 for pt in pts: ptx = pt.X pty = pt.Y sumx = sumx + ptx sumy = sumy + pty kk = kk + 1 pjx = sumx / kk pjy = sumy / kk #计算角度 ang1 = math.atan2((pjy-ceny), (pjx-cenx)) angle1 = ang1/math.pi*180 if angle1 >45 and angle1 < 135: slist = [] #存角度、宗地代码 slist.append(angle1) slist.append(list1[ii][1]) slist.append(list1[ii][2]) szb.append(slist) if angle1 < 45 and angle1 > -45: slist = [] #存角度、宗地代码 slist.append(angle1) slist.append(list1[ii][1]) slist.append(list1[ii][2]) szd.append(slist) if angle1 > -135 and angle1 < -45: slist = [] #存角度、宗地代码 slist.append(angle1) slist.append(list1[ii][1]) slist.append(list1[ii][2]) szn.append(slist) if angle1 < -135 or angle1 > 135: slist = [] #存角度、宗地代码 slist.append(angle1) slist.append(list1[ii][1]) slist.append(list1[ii][2]) szx.append(slist) except: pass ii = ii + 1 #角度,宗地代码,权利人 if len(szb) == 0: listsz.append('') elif len(szb) == 1: jestr = szb[0][2] + '(' + szb[0][1] + ')' listsz.append(jestr) else: #排序,找出最正的那个 ii1 = 0 list2 = [] while ii1 < len(szb): ang2 = abs(szb[ii1][0]) #宗地编号 zdstr = szb[ii1][1] cz = abs(ang2 - 90) slist2 = [] slist2.append(cz) slist2.append(zdstr) #权利人 slist2.append(szb[ii1][2]) list2.append(slist2) ii1 = ii1 + 1 list2.sort(key=takefir,reverse=True) jestr = list2[0][2] + '(' + list2[0][1] + ')' listsz.append(jestr) if len(szd) == 0: listsz.append('') elif len(szd) == 1: jestr = szd[0][2] + '(' + szd[0][1] + ')' listsz.append(jestr) else: #排序,找出最正的那个 ii1 = 0 list2 = [] while ii1 < len(szd): ang2 = abs(szd[ii1][0]) #宗地编号 zdstr = szd[ii1][1] cz = abs(ang2) slist2 = [] slist2.append(cz) slist2.append(zdstr) #权利人 slist2.append(szd[ii1][2]) list2.append(slist2) ii1 = ii1 + 1 list2.sort(key=takefir,reverse=True) jestr = list2[0][2] + '(' + list2[0][1] + ')' listsz.append(jestr) if len(szn) == 0: listsz.append('') elif len(szn) == 1: jestr = szn[0][2] + '(' + szn[0][1] + ')' listsz.append(jestr) else: #排序,找出最正的那个 ii1 = 0 list2 = [] while ii1 < len(szn): ang2 = abs(szn[ii1][0]) #宗地编号 zdstr = szn[ii1][1] cz = abs(ang2 + 90) slist2 = [] slist2.append(cz) slist2.append(zdstr) #权利人 slist2.append(szn[ii1][2]) list2.append(slist2) ii1 = ii1 + 1 list2.sort(key=takefir,reverse=True) jestr = list2[0][2] + '(' + list2[0][1] + ')' listsz.append(jestr) if len(szx) == 0: listsz.append('') elif len(szx) == 1: jestr = szx[0][2] + '(' + szx[0][1] + ')' listsz.append(jestr) else: #排序,找出最正的那个 ii1 = 0 list2 = [] while ii1 < len(szx): ang2 = abs(szx[ii1][0]) #宗地编号 zdstr = szx[ii1][1] cz = 180 - abs(ang2) slist2 = [] slist2.append(cz) slist2.append(zdstr) #权利人 slist2.append(szx[ii1][2]) list2.append(slist2) ii1 = ii1 + 1 list2.sort(key=takefir,reverse=True) jestr = list2[0][2] + '(' + list2[0][1] + ')' listsz.append(jestr) return listsz def szsf1(list1,poly1,list0,opoly1): szb = [] szd = [] szn = [] szx = [] listsz = [] ii = 0 ceny = (opoly1.extent.YMax + opoly1.extent.YMin)/2 cenx = (opoly1.extent.XMax + opoly1.extent.XMin)/2 while ii < len(list1): shp1 = list1[ii][0] #获取焦点做垂线计算角度 try: pts = poly1.intersect(shp1, 1) #不管有多少个点,直接求平均值 sumx = 0 sumy = 0 kk = 0 for pt in pts: ptx = pt.X pty = pt.Y sumx = sumx + ptx sumy = sumy + pty kk = kk + 1 pjx = sumx / kk pjy = sumy / kk #计算角度 ang1 = math.atan2((pjy-ceny), (pjx-cenx)) angle1 = ang1/math.pi*180 if angle1 >30 and angle1 < 150: slist = [] #存角度、类型 slist.append(angle1) slist.append(list1[ii][1]) szb.append(slist) if angle1 < 60 and angle1 > -60: slist = [] #存角度、宗地代码 slist.append(angle1) slist.append(list1[ii][1]) szd.append(slist) if angle1 > -150 and angle1 < -30: slist = [] #存角度、宗地代码 slist.append(angle1) slist.append(list1[ii][1]) szn.append(slist) if angle1 < -120 or angle1 > 120: slist = [] #存角度、宗地代码 slist.append(angle1) slist.append(list1[ii][1]) szx.append(slist) except: pass ii = ii + 1 #角度,地物类型 if list0[0] == '': if len(szb) == 0: listsz.append('') elif len(szb) == 1: jestr = szb[0][1] listsz.append(jestr) else: #排序,找出最正的那个 ii1 = 0 list2 = [] while ii1 < len(szb): ang2 = abs(szb[ii1][0]) #地物类型 zdstr = szb[ii1][1] cz = abs(ang2 - 90) slist2 = [] slist2.append(cz) slist2.append(zdstr) list2.append(slist2) ii1 = ii1 + 1 list2.sort(key=takefir,reverse=True) jestr = list2[0][1] listsz.append(jestr) else: listsz.append(list0[0]) if list0[1] == '': if len(szd) == 0: listsz.append('') elif len(szd) == 1: jestr = szd[0][1] listsz.append(jestr) else: #排序,找出最正的那个 ii1 = 0 list2 = [] while ii1 < len(szd): ang2 = abs(szd[ii1][0]) #地物类型 zdstr = szd[ii1][1] cz = abs(ang2) slist2 = [] slist2.append(cz) slist2.append(zdstr) list2.append(slist2) ii1 = ii1 + 1 list2.sort(key=takefir,reverse=True) jestr = list2[0][1] listsz.append(jestr) else: listsz.append(list0[1]) if list0[2] == '': if len(szn) == 0: listsz.append('') elif len(szn) == 1: jestr = szn[0][1] listsz.append(jestr) else: #排序,找出最正的那个 ii1 = 0 list2 = [] while ii1 < len(szn): ang2 = abs(szn[ii1][0]) #地物类型 zdstr = szn[ii1][1] cz = abs(ang2 + 90) slist2 = [] slist2.append(cz) slist2.append(zdstr) list2.append(slist2) ii1 = ii1 + 1 list2.sort(key=takefir,reverse=True) jestr = list2[0][1] listsz.append(jestr) else: listsz.append(list0[2]) if list0[3] == '': if len(szx) == 0: listsz.append('') elif len(szx) == 1: jestr = szx[0][1] listsz.append(jestr) else: #排序,找出最正的那个 ii1 = 0 list2 = [] while ii1 < len(szx): ang2 = abs(szx[ii1][0]) #地物类型 zdstr = szx[ii1][1] cz = 180 - abs(ang2) slist2 = [] slist2.append(cz) slist2.append(zdstr) list2.append(slist2) ii1 = ii1 + 1 list2.sort(key=takefir,reverse=True) jestr = list2[0][1] listsz.append(jestr) else: listsz.append(list0[3]) return listsz def takefir(elem): return elem[0] if __name__ == '__main__': try: #根据需求设计4个选项,宗地1,宗地2,图斑,路,房(这个待定) # 输入宗地shp(记得复制),图斑shp(没有就不管) SZpoly(arcpy.GetParameterAsText(0),arcpy.GetParameterAsText(1),arcpy.GetParameterAsText(2),arcpy.GetParameterAsText(3),arcpy.GetParameterAsText(4)) except arcpy.ExecuteError: arcpy.AddMessage(arcpy.GetMessages())