ArcPy脚本检查经纬度坐标是否在面中
功能需求:现有大量面数据(polygon),每个面要素有字段:X(经度)、Y(纬度),检查X、Y是否处于所在面中。
分析思路:一、传统处理办法,利用ArcGIS拓扑检查处理,使用拓扑规则:Contains One Point(包含一个点)

1.这种处理办法首先提取X、Y坐标值生成点数据,用ArcToolbox中Make XY Event Layer (Data Management)
工具箱中--数据管理工具--图层和表视图--创建XY事件图层

2.执行完创建XY事件图层,还要对改图层进行要素转点,用ArcToolbox中Feature To Point (Data Management),
工具箱中--数据管理工具--要素--要素转点

3.对面要素和点要素建立拓扑检查,如何建立拓扑检查这里就不赘述了:

二、第二种不用拓扑检查,要素转点后,用面与点建立空间连接,打开面属性表,筛查未连接到面的字段为空的要素:用ArcToolbox中Spatial Join (Analysis);
工具箱中--分析工具--叠加分析--空间连接

三、利用以上思路逻辑可以用ArcGIS模型构建器,创建模型工具处理:
大致模型草图构建

四、利用模型处理逻辑思路,转换为Python脚本,使用循环遍历要素类批量处理更为灵活高效:
1 # -*- coding: GBK -*- 2 import arcpy , os 3 from arcpy import env 4 5 input = arcpy.GetParameterAsText(0) 6 output = arcpy.GetParameterAsText(1) 7 8 def XYinPolygon(input,output): 9 10 env.workspace = input 11 12 fclist = arcpy.ListFeatureClasses() 13 print len(fclist) 14 15 for fcc in fclist: 16 x_coords = "X" # 字段X 17 y_coords = "Y" # 字段Y 18 out_Layer = "XY_layer_" + fcc 19 20 sav_lay = os.path.join(output, out_Layer) 21 saved_Layer = sav_lay + ".lyr" 22 23 zdf = os.path.join(output, "XY_topoint_") 24 zdf_url = zdf + fcc 25 26 outf = os.path.join(output, "joinfc_out_") 27 outfc = outf + fcc 28 29 outc = os.path.join(output, "XY_CheckOut_") 30 outck = outc + fcc 31 32 33 # arcpy.AddMessage(u"执行创建XY图层..." + fcc) 34 arcpy.MakeXYEventLayer_management(fcc, x_coords, y_coords, out_Layer) 35 36 37 arcpy.AddMessage(fcc + u"要素数量:") 38 arcpy.AddMessage(arcpy.GetCount_management(out_Layer)) 39 40 # arcpy.AddMessage(u"执行保存XY图层..." + fcc) 41 arcpy.SaveToLayerFile_management(out_Layer, saved_Layer) 42 43 44 # arcpy.AddMessage(u"执行XY图层转点..." + fcc) 45 arcpy.FeatureToPoint_management(out_Layer, zdf_url, "INSIDE") 46 47 48 # arcpy.AddMessage(u"执行空间链接..." + fcc) 49 arcpy.SpatialJoin_analysis(fcc, zdf_url, outfc) 50 51 52 # arcpy.AddMessage(u"检查中心点坐标不在面中的要素..." + fcc) 53 arcpy.Select_analysis(outfc, outck, """ "X_1" = 0 OR "Y_1" = 0 """) 54 # arcpy.AddMessage(u"检查完成,输出结果" + fcc)
55 arcpy.AddMessage("XY不在面内的要素数量:") 56 arcpy.AddMessage(arcpy.GetCount_management(outck)) 57 58 arcpy.Delete_management(saved_Layer) 59 arcpy.Delete_management(out_Layer) 60 arcpy.Delete_management(zdf_url) 61 arcpy.Delete_management(outfc) 62 63 arcpy.AddMessage(u"检查完成,输出XY不在面内的要素") 64 65 XYinPolygon(input,output) 66 67 print arcpy.GetMessages()

浙公网安备 33010602011771号