123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527 |
- 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())
|