ArcPy脚本检查矢量数据XY变更记录

功能需求:每次矢量数据迭代会有X、Y(经度、纬度)信息变更,把这些变更的信息检查并提取出来。

分析思路:一、传统处理办法:利用要素属性表关联,新数据ID连接旧数据ID,比较新旧XY是否一致,添加字段用来记录新旧XY的比较结果,筛选出不一致的记录。

1.新旧表连接字段,用Join Field (Data Management),工具箱中--数据管理工具--连接--连接字段

 

2.对连接后的表添加字段,用Add Field (Data Management),工具箱中--数据管理工具--字段--添加字段

 

3.对添加的字段进行计算,用Calculate Field (Data Management),工具箱中--数据管理工具--字段--计算字段

 

4.对计算后的XY进行筛选,用Select (Analysis),工具箱中--分析工具--提取分析--筛选

 

 二、利用以上思路逻辑可以用ArcGIS模型构建器,创建模型工具处理:

大致构建模型草图

 

 三、利用模型处理逻辑思路,转换为Python脚本,把变更记录写入csv中

 1 # -*- coding: GBK -*-
 2 import arcpy , os , csv
 3 
 4 in_new = arcpy.GetParameterAsText(0)
 5 in_old = arcpy.GetParameterAsText(1)
 6 output = arcpy.GetParameterAsText(2)
 7 
 8 def XYChangeCheck(in_new,in_old,output):
 9     fcnew = os.path.join(output,"copy.shp")
10     filename = os.path.basename(in_new)
11     print str(filename[0:-4])
12 
13     xycheck = "xychange_" + filename
14     ckjg = os.path.join(output,xycheck)
15     print arcpy.AddMessage("1- 复制要素...")
16     arcpy.CopyFeatures_management(in_new, fcnew, "", "0", "0", "0")
17     arcpy.JoinField_management(fcnew, "admincode", in_old, "admincode", "")
18 print arcpy.AddMessage("2- 添加字段cx...") 19 arcpy.AddField_management(fcnew, "cx", "SHORT", "", "", "", "", "NULLABLE", "NON_REQUIRED", "")
20 print arcpy.AddMessage("3- 添加字段cy...") 21 arcpy.AddField_management(fcnew, "cy", "SHORT", "", "", "", "", "NULLABLE", "NON_REQUIRED", "")
22 print arcpy.AddMessage("4- 计算字段cx...") 23 arcpy.CalculateField_management(fcnew, "cx", "js( !X! , !X_1! )", "PYTHON_9.3", "def js(a,b):\\n if(a==b):return 1\\n else: return 0")
24 print arcpy.AddMessage("5- 计算字段cy...") 25 arcpy.CalculateField_management(fcnew, "cy", "js( !Y! , !Y_1! )", "PYTHON_9.3", "def js(a,b):\\n if(a==b):return 1\\n else: return 0")
26 print arcpy.AddMessage("6- 字段筛选...") 27 arcpy.Select_analysis(fcnew, ckjg, "cx = 0 OR cy = 0")
28 print arcpy.AddMessage("7- 删除要素...") 29 arcpy.Delete_management(fcnew) 30 print arcpy.AddMessage("8- 处理完成...\n以下是变更记录:") 31 32 # 读取错误要素游标,写入csv文件 33 cursor = arcpy.da.SearchCursor(ckjg, ["admin_code", "name", "X", "Y"]) 34 i = 1 35 for row in cursor: 36 37 ck = str(i) +"- "+ str(row[0])+","+str(row[1])+","+str(row[2])+","+str(row[3]) 38 arcpy.AddMessage(ck) 39 flist = str(i)+","+ str(row[0])+","+str(row[1])+","+str(row[2])+","+str(row[3]) 40 # print flist 41 42 name = str(filename[0:-4]) + "_XY.csv" 43 csvpath = os.path.join(output, name) 44 path = csvpath 45 with open(path, 'ab') as f: 46 csv_write = csv.writer(f) 47 csv_write.writerow([flist.decode("utf-8")]) 48 i += 1 49 53 54 XYChangeCheck(in_new,in_old,output) 55 56 print arcpy.GetMessages()

 

posted @ 2021-02-03 21:11  Eric_Koh  阅读(218)  评论(0)    收藏  举报