工具箱相关
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. import arcpy
  2. import math
  3. def SZpoly(zdpath1,zdpath2,tbpath1,tbpath2,tbpath3):
  4. tb1 = -1
  5. arcpy.MakeFeatureLayer_management(zdpath1, 'ZD')
  6. try:
  7. arcpy.MakeFeatureLayer_management(tbpath1, 'TB')
  8. tb1 = 1
  9. except:
  10. arcpy.AddMessage('无图斑1shp可加载')
  11. zd2 = -1
  12. try:
  13. arcpy.MakeFeatureLayer_management(zdpath2, 'ZD2')
  14. zd2 = 1
  15. except:
  16. arcpy.AddMessage('无宗地2shp可加载')
  17. tb2 = -1
  18. try:
  19. arcpy.MakeFeatureLayer_management(tbpath2, 'TB2')
  20. tb2 = 1
  21. except:
  22. arcpy.AddMessage('无图斑2shp可加载')
  23. tb3 = -1
  24. try:
  25. arcpy.MakeFeatureLayer_management(tbpath3, 'TB3')
  26. tb3 = 1
  27. except:
  28. arcpy.AddMessage('无图斑3shp可加载')
  29. #添加字段
  30. try:
  31. arcpy.AddField_management('ZD', '四至北', 'TEXT')
  32. except:
  33. arcpy.AddMessage('四至北字段已存在')
  34. print('四至北字段已存在')
  35. try:
  36. arcpy.AddField_management('ZD', '四至南', 'TEXT')
  37. except:
  38. arcpy.AddMessage('四至南字段已存在')
  39. print('四至南字段已存在')
  40. try:
  41. arcpy.AddField_management('ZD', '四至西', 'TEXT')
  42. except:
  43. arcpy.AddMessage('四至西字段已存在')
  44. print('四至西字段已存在')
  45. try:
  46. arcpy.AddField_management('ZD', '四至东', 'TEXT')
  47. except:
  48. arcpy.AddMessage('四至东字段已存在')
  49. print('四至东字段已存在')
  50. #一个一个来,先把临宗地搞出来
  51. with arcpy.da.UpdateCursor('ZD', ['SHAPE@', '四至北','四至东','四至南','四至西','宗地编号']) as cursorA:
  52. for curA in cursorA:
  53. #szlist1是邻宗的结果,szlist2是地物的结果
  54. szlist1 = []
  55. szlist2 = []
  56. poly1 = curA[0]
  57. #这个阈值可以调整
  58. buf1 = poly1.buffer(1)
  59. zddm0 = curA[5]
  60. list1 = []
  61. #首先是挑选出相交的几个图形(应该不会很巧的只是共线)
  62. arcpy.SelectLayerByLocation_management('ZD','INTERSECT',buf1)
  63. count0 = int(arcpy.GetCount_management('ZD').getOutput(0))
  64. if count0 == 0:
  65. #那就不关宗地什么事了
  66. pass
  67. else:
  68. #shape,宗地编号,权利人
  69. with arcpy.da.SearchCursor('ZD', ['SHAPE@', '宗地编号','权利人']) as cursorB:
  70. for curB in cursorB:
  71. #排除自己
  72. zddm1 = curB[1]
  73. if zddm1 == zddm0:
  74. pass
  75. else:
  76. #先把信息都装入list,方便提取
  77. slist1 = []
  78. slist1.append(curB[0])
  79. slist1.append(curB[1])
  80. slist1.append(curB[2])
  81. list1.append(slist1)
  82. #首先是挑选出相交的几个图形(应该不会很巧的只是共线)
  83. if zd2 == 1:
  84. arcpy.SelectLayerByLocation_management('ZD2','INTERSECT',buf1)
  85. count0 = int(arcpy.GetCount_management('ZD2').getOutput(0))
  86. if count0 == 0:
  87. pass
  88. else:
  89. #shape,宗地编号,权利人
  90. with arcpy.da.SearchCursor('ZD2', ['SHAPE@', '宗地编号','权利人']) as cursorC:
  91. for curC in cursorC:
  92. #排除自己
  93. zddm1 = curC[1]
  94. if zddm1 == zddm0:
  95. pass
  96. else:
  97. #先把信息都装入list,方便提取
  98. slist1 = []
  99. slist1.append(curC[0])
  100. slist1.append(curC[1])
  101. slist1.append(curC[2])
  102. list1.append(slist1)
  103. if list1 != []:
  104. #分别过四至内容
  105. szlist1 = szsf(list1,buf1,poly1)
  106. list2 = []
  107. if tb1 == 1:
  108. #首先相交
  109. arcpy.SelectLayerByLocation_management('TB','INTERSECT',buf1)
  110. count1 = int(arcpy.GetCount_management('TB').getOutput(0))
  111. if count1 == 0:
  112. #那就不关图斑什么事了
  113. pass
  114. else:
  115. with arcpy.da.SearchCursor('TB', ['SHAPE@', 'DLMC']) as cursorD:
  116. for curD in cursorD:
  117. slist2 = []
  118. slist2.append(curD[0])
  119. slist2.append(curD[1])
  120. list2.append(slist2)
  121. if tb2 == 1:
  122. #首先相交
  123. arcpy.SelectLayerByLocation_management('TB2','INTERSECT',buf1)
  124. count1 = int(arcpy.GetCount_management('TB2').getOutput(0))
  125. if count1 == 0:
  126. #那就不关图斑什么事了
  127. pass
  128. else:
  129. with arcpy.da.SearchCursor('TB2', ['SHAPE@', 'DLMC']) as cursorE:
  130. for curE in cursorE:
  131. slist2 = []
  132. slist2.append(curE[0])
  133. slist2.append(curE[1])
  134. list2.append(slist2)
  135. if tb3 == 1:
  136. #首先相交
  137. arcpy.SelectLayerByLocation_management('TB3','INTERSECT',buf1)
  138. count1 = int(arcpy.GetCount_management('TB3').getOutput(0))
  139. if count1 == 0:
  140. #那就不关图斑什么事了
  141. pass
  142. else:
  143. with arcpy.da.SearchCursor('TB3', ['SHAPE@', 'DLMC']) as cursorF:
  144. for curF in cursorF:
  145. #角度和地物名称
  146. slist2 = []
  147. slist2.append(curF[0])
  148. slist2.append(curF[1])
  149. list2.append(slist2)
  150. if list2 != [] and szlist1 !=[]:
  151. #分别过四至内容(图斑只需要补没有的)
  152. szlist2 = szsf1(list2,poly1,szlist1,poly1)
  153. else:
  154. szlist2 = szlist1
  155. try:
  156. #再四舍五入下,防止有空
  157. if szlist2[0] != '':
  158. curA[1] = szlist2[0]
  159. else:
  160. if szlist2[1] !='':
  161. curA[1] = szlist2[1]
  162. else:
  163. if szlist2[3] !='':
  164. curA[1] = szlist2[3]
  165. if szlist2[1] != '':
  166. curA[2] = szlist2[1]
  167. else:
  168. if szlist2[0] !='':
  169. curA[2] = szlist2[0]
  170. else:
  171. if szlist2[2] !='':
  172. curA[2] = szlist2[2]
  173. if szlist2[2] != '':
  174. curA[3] = szlist2[2]
  175. else:
  176. if szlist2[1] !='':
  177. curA[3] = szlist2[1]
  178. else:
  179. if szlist2[3] !='':
  180. curA[3] = szlist2[3]
  181. if szlist2[3] != '':
  182. curA[4] = szlist2[3]
  183. else:
  184. if szlist2[0] !='':
  185. curA[4] = szlist2[0]
  186. else:
  187. if szlist2[2] !='':
  188. curA[4] = szlist2[2]
  189. cursorA.updateRow(curA)
  190. except:
  191. pass
  192. arcpy.AddMessage(zddm0 + ' OK')
  193. def szsf(list1,poly1,opoly1):
  194. szb = []
  195. szd = []
  196. szn = []
  197. szx = []
  198. listsz = []
  199. ii = 0
  200. ceny = (opoly1.extent.YMax + opoly1.extent.YMin)/2
  201. cenx = (opoly1.extent.XMax + opoly1.extent.XMin)/2
  202. while ii < len(list1):
  203. shp1 = list1[ii][0]
  204. #获取焦点做垂线计算角度
  205. try:
  206. pts = poly1.intersect(shp1, 1)
  207. #不管有多少个点,直接求平均值
  208. sumx = 0
  209. sumy = 0
  210. kk = 0
  211. for pt in pts:
  212. ptx = pt.X
  213. pty = pt.Y
  214. sumx = sumx + ptx
  215. sumy = sumy + pty
  216. kk = kk + 1
  217. pjx = sumx / kk
  218. pjy = sumy / kk
  219. #计算角度
  220. ang1 = math.atan2((pjy-ceny), (pjx-cenx))
  221. angle1 = ang1/math.pi*180
  222. if angle1 >45 and angle1 < 135:
  223. slist = []
  224. #存角度、宗地代码
  225. slist.append(angle1)
  226. slist.append(list1[ii][1])
  227. slist.append(list1[ii][2])
  228. szb.append(slist)
  229. if angle1 < 45 and angle1 > -45:
  230. slist = []
  231. #存角度、宗地代码
  232. slist.append(angle1)
  233. slist.append(list1[ii][1])
  234. slist.append(list1[ii][2])
  235. szd.append(slist)
  236. if angle1 > -135 and angle1 < -45:
  237. slist = []
  238. #存角度、宗地代码
  239. slist.append(angle1)
  240. slist.append(list1[ii][1])
  241. slist.append(list1[ii][2])
  242. szn.append(slist)
  243. if angle1 < -135 or angle1 > 135:
  244. slist = []
  245. #存角度、宗地代码
  246. slist.append(angle1)
  247. slist.append(list1[ii][1])
  248. slist.append(list1[ii][2])
  249. szx.append(slist)
  250. except:
  251. pass
  252. ii = ii + 1
  253. #角度,宗地代码,权利人
  254. if len(szb) == 0:
  255. listsz.append('')
  256. elif len(szb) == 1:
  257. jestr = szb[0][2] + '(' + szb[0][1] + ')'
  258. listsz.append(jestr)
  259. else:
  260. #排序,找出最正的那个
  261. ii1 = 0
  262. list2 = []
  263. while ii1 < len(szb):
  264. ang2 = abs(szb[ii1][0])
  265. #宗地编号
  266. zdstr = szb[ii1][1]
  267. cz = abs(ang2 - 90)
  268. slist2 = []
  269. slist2.append(cz)
  270. slist2.append(zdstr)
  271. #权利人
  272. slist2.append(szb[ii1][2])
  273. list2.append(slist2)
  274. ii1 = ii1 + 1
  275. list2.sort(key=takefir,reverse=True)
  276. jestr = list2[0][2] + '(' + list2[0][1] + ')'
  277. listsz.append(jestr)
  278. if len(szd) == 0:
  279. listsz.append('')
  280. elif len(szd) == 1:
  281. jestr = szd[0][2] + '(' + szd[0][1] + ')'
  282. listsz.append(jestr)
  283. else:
  284. #排序,找出最正的那个
  285. ii1 = 0
  286. list2 = []
  287. while ii1 < len(szd):
  288. ang2 = abs(szd[ii1][0])
  289. #宗地编号
  290. zdstr = szd[ii1][1]
  291. cz = abs(ang2)
  292. slist2 = []
  293. slist2.append(cz)
  294. slist2.append(zdstr)
  295. #权利人
  296. slist2.append(szd[ii1][2])
  297. list2.append(slist2)
  298. ii1 = ii1 + 1
  299. list2.sort(key=takefir,reverse=True)
  300. jestr = list2[0][2] + '(' + list2[0][1] + ')'
  301. listsz.append(jestr)
  302. if len(szn) == 0:
  303. listsz.append('')
  304. elif len(szn) == 1:
  305. jestr = szn[0][2] + '(' + szn[0][1] + ')'
  306. listsz.append(jestr)
  307. else:
  308. #排序,找出最正的那个
  309. ii1 = 0
  310. list2 = []
  311. while ii1 < len(szn):
  312. ang2 = abs(szn[ii1][0])
  313. #宗地编号
  314. zdstr = szn[ii1][1]
  315. cz = abs(ang2 + 90)
  316. slist2 = []
  317. slist2.append(cz)
  318. slist2.append(zdstr)
  319. #权利人
  320. slist2.append(szn[ii1][2])
  321. list2.append(slist2)
  322. ii1 = ii1 + 1
  323. list2.sort(key=takefir,reverse=True)
  324. jestr = list2[0][2] + '(' + list2[0][1] + ')'
  325. listsz.append(jestr)
  326. if len(szx) == 0:
  327. listsz.append('')
  328. elif len(szx) == 1:
  329. jestr = szx[0][2] + '(' + szx[0][1] + ')'
  330. listsz.append(jestr)
  331. else:
  332. #排序,找出最正的那个
  333. ii1 = 0
  334. list2 = []
  335. while ii1 < len(szx):
  336. ang2 = abs(szx[ii1][0])
  337. #宗地编号
  338. zdstr = szx[ii1][1]
  339. cz = 180 - abs(ang2)
  340. slist2 = []
  341. slist2.append(cz)
  342. slist2.append(zdstr)
  343. #权利人
  344. slist2.append(szx[ii1][2])
  345. list2.append(slist2)
  346. ii1 = ii1 + 1
  347. list2.sort(key=takefir,reverse=True)
  348. jestr = list2[0][2] + '(' + list2[0][1] + ')'
  349. listsz.append(jestr)
  350. return listsz
  351. def szsf1(list1,poly1,list0,opoly1):
  352. szb = []
  353. szd = []
  354. szn = []
  355. szx = []
  356. listsz = []
  357. ii = 0
  358. ceny = (opoly1.extent.YMax + opoly1.extent.YMin)/2
  359. cenx = (opoly1.extent.XMax + opoly1.extent.XMin)/2
  360. while ii < len(list1):
  361. shp1 = list1[ii][0]
  362. #获取焦点做垂线计算角度
  363. try:
  364. pts = poly1.intersect(shp1, 1)
  365. #不管有多少个点,直接求平均值
  366. sumx = 0
  367. sumy = 0
  368. kk = 0
  369. for pt in pts:
  370. ptx = pt.X
  371. pty = pt.Y
  372. sumx = sumx + ptx
  373. sumy = sumy + pty
  374. kk = kk + 1
  375. pjx = sumx / kk
  376. pjy = sumy / kk
  377. #计算角度
  378. ang1 = math.atan2((pjy-ceny), (pjx-cenx))
  379. angle1 = ang1/math.pi*180
  380. if angle1 >30 and angle1 < 150:
  381. slist = []
  382. #存角度、类型
  383. slist.append(angle1)
  384. slist.append(list1[ii][1])
  385. szb.append(slist)
  386. if angle1 < 60 and angle1 > -60:
  387. slist = []
  388. #存角度、宗地代码
  389. slist.append(angle1)
  390. slist.append(list1[ii][1])
  391. szd.append(slist)
  392. if angle1 > -150 and angle1 < -30:
  393. slist = []
  394. #存角度、宗地代码
  395. slist.append(angle1)
  396. slist.append(list1[ii][1])
  397. szn.append(slist)
  398. if angle1 < -120 or angle1 > 120:
  399. slist = []
  400. #存角度、宗地代码
  401. slist.append(angle1)
  402. slist.append(list1[ii][1])
  403. szx.append(slist)
  404. except:
  405. pass
  406. ii = ii + 1
  407. #角度,地物类型
  408. if list0[0] == '':
  409. if len(szb) == 0:
  410. listsz.append('')
  411. elif len(szb) == 1:
  412. jestr = szb[0][1]
  413. listsz.append(jestr)
  414. else:
  415. #排序,找出最正的那个
  416. ii1 = 0
  417. list2 = []
  418. while ii1 < len(szb):
  419. ang2 = abs(szb[ii1][0])
  420. #地物类型
  421. zdstr = szb[ii1][1]
  422. cz = abs(ang2 - 90)
  423. slist2 = []
  424. slist2.append(cz)
  425. slist2.append(zdstr)
  426. list2.append(slist2)
  427. ii1 = ii1 + 1
  428. list2.sort(key=takefir,reverse=True)
  429. jestr = list2[0][1]
  430. listsz.append(jestr)
  431. else:
  432. listsz.append(list0[0])
  433. if list0[1] == '':
  434. if len(szd) == 0:
  435. listsz.append('')
  436. elif len(szd) == 1:
  437. jestr = szd[0][1]
  438. listsz.append(jestr)
  439. else:
  440. #排序,找出最正的那个
  441. ii1 = 0
  442. list2 = []
  443. while ii1 < len(szd):
  444. ang2 = abs(szd[ii1][0])
  445. #地物类型
  446. zdstr = szd[ii1][1]
  447. cz = abs(ang2)
  448. slist2 = []
  449. slist2.append(cz)
  450. slist2.append(zdstr)
  451. list2.append(slist2)
  452. ii1 = ii1 + 1
  453. list2.sort(key=takefir,reverse=True)
  454. jestr = list2[0][1]
  455. listsz.append(jestr)
  456. else:
  457. listsz.append(list0[1])
  458. if list0[2] == '':
  459. if len(szn) == 0:
  460. listsz.append('')
  461. elif len(szn) == 1:
  462. jestr = szn[0][1]
  463. listsz.append(jestr)
  464. else:
  465. #排序,找出最正的那个
  466. ii1 = 0
  467. list2 = []
  468. while ii1 < len(szn):
  469. ang2 = abs(szn[ii1][0])
  470. #地物类型
  471. zdstr = szn[ii1][1]
  472. cz = abs(ang2 + 90)
  473. slist2 = []
  474. slist2.append(cz)
  475. slist2.append(zdstr)
  476. list2.append(slist2)
  477. ii1 = ii1 + 1
  478. list2.sort(key=takefir,reverse=True)
  479. jestr = list2[0][1]
  480. listsz.append(jestr)
  481. else:
  482. listsz.append(list0[2])
  483. if list0[3] == '':
  484. if len(szx) == 0:
  485. listsz.append('')
  486. elif len(szx) == 1:
  487. jestr = szx[0][1]
  488. listsz.append(jestr)
  489. else:
  490. #排序,找出最正的那个
  491. ii1 = 0
  492. list2 = []
  493. while ii1 < len(szx):
  494. ang2 = abs(szx[ii1][0])
  495. #地物类型
  496. zdstr = szx[ii1][1]
  497. cz = 180 - abs(ang2)
  498. slist2 = []
  499. slist2.append(cz)
  500. slist2.append(zdstr)
  501. list2.append(slist2)
  502. ii1 = ii1 + 1
  503. list2.sort(key=takefir,reverse=True)
  504. jestr = list2[0][1]
  505. listsz.append(jestr)
  506. else:
  507. listsz.append(list0[3])
  508. return listsz
  509. def takefir(elem):
  510. return elem[0]
  511. if __name__ == '__main__':
  512. try:
  513. #根据需求设计4个选项,宗地1,宗地2,图斑,路,房(这个待定)
  514. # 输入宗地shp(记得复制),图斑shp(没有就不管)
  515. SZpoly(arcpy.GetParameterAsText(0),arcpy.GetParameterAsText(1),arcpy.GetParameterAsText(2),arcpy.GetParameterAsText(3),arcpy.GetParameterAsText(4))
  516. except arcpy.ExecuteError:
  517. arcpy.AddMessage(arcpy.GetMessages())