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

 

posted @ 2021-02-02 22:03  Eric_Koh  阅读(981)  评论(0)    收藏  举报