关键词:
Arcpy,ArcMap Toolbox, Coordinates of Polygon
需求分析:
Arcmap中添加有三个图层:图层“GY乡级河道”(面图层)是全县13个乡镇全部的乡级河道,共计249条;图层“乡级河道polygon”(面图层)是其中某一个乡镇的乡级河道,有10条乡级河道,现在以此乡镇的10条乡级河道为例,求取这10个面要素的起终点坐标;图层“乡级河道polyline”是已经求好的这10条乡级河道的中心线,求取面图层的中心线的过程这里不再赘述。
因为面图层计算坐标时只能计算中心点的XY,而线图层可以计算起点、终点和中心点的XY,,所以必须先获得面图层的中心线,然后再计算中心线的起终点坐标。在本例中,即先求取“乡级河道polygon”的中心线“乡级河道polyline”,再计算其起终点坐标,即为所求乡级河道的起终点坐标。
预期结果是输出一个表格,包含TYBH(统一编号)、NAME(名称)、Xs(起点经度)、Ys(起点纬度)、Xe(终点经度)和Ye(终点纬度)等字段。现在“GY乡级河道”图层中有TYBH、XZQBM(行政区编码)和NAME字段,“乡级河道polygon”图层中有“NAME”字段和“Id”字段,“乡级河道polyline”图层中有“Id”字段,准备将计算结果集中到“乡级河道polyline”图层中。“乡级河道polyline”图层和“乡级河道polygon”图层可以通过字段“Id”关联,“乡级河道polygon”图层和“GY乡级河道”图层通过字段“NAME”关联,因为不同乡镇可能会有河道重名情况,即关联时会有多个相同匹配的情况,所以要先通过“XZQBM”字段筛选出这个选定乡镇的乡级河道(此乡镇的行政区编码是“32108404”),然后再进行关联。
Arcmap中的三个图层 | |
“乡级河道polyline”图层属性表 | |
“乡级河道polygon”图层属性表 | |
“GY乡级河道”图层属性表 |
方法步骤:
1. 编写Arcpy脚本代码,保存为Python文件。
1 import arcpy 2 from arcpy import env 3 env.workspace="G:/GYcoor/GYCoor.gdb" 4 5 line_table=arcpy.GetParameterAsText(0) 6 polygon_table=arcpy.GetParameterAsText(1) 7 gy_table=arcpy.GetParameterAsText(2) 8 xzqbmVal=arcpy.GetParameterAsText(3) 9 10 arcpy.AddField_management(line_table,"NAME","TEXT") 11 arcpy.AddField_management(line_table,"TYBH","TEXT") 12 arcpy.AddField_management(line_table,"Xs","DOUBLE") 13 arcpy.AddField_management(line_table,"Ys","DOUBLE") 14 arcpy.AddField_management(line_table,"Xe","DOUBLE") 15 arcpy.AddField_management(line_table,"Ye","DOUBLE") 16 17 arcpy.SelectLayerByAttribute_management(gy_table,"NEW_SELECTION","XZQBM='"+xzqbmVal+"'") 18 19 arcpy.AddJoin_management(line_table,'id',polygon_table,'id',"KEEP_COMMON") 20 arcpy.CalculateField_management(line_table,'NAME',"!"+polygon_table+".NAME!","PYTHON") 21 arcpy.RemoveJoin_management(line_table) 22 23 arcpy.AddJoin_management(line_table,'NAME',gy_table,'NAME',"KEEP_COMMON") 24 arcpy.CalculateField_management(line_table,'TYBH',"!"+gy_table+".TYBH!","PYTHON") 25 arcpy.RemoveJoin_management(line_table) 26 27 arcpy.CalculateField_management(line_table,"Xs","!SHAPE.FIRSTPOINT.X!","PYTHON_9.3") 28 arcpy.CalculateField_management(line_table,"Ys","!SHAPE.FIRSTPOINT.Y!","PYTHON_9.3") 29 arcpy.CalculateField_management(line_table,"Xe","!SHAPE.LASTPOINT.X!","PYTHON_9.3") 30 arcpy.CalculateField_management(line_table,"Ye","!SHAPE.LASTPOINT.Y!","PYTHON_9.3")
2. 在ArcMap工具箱中添加脚本,并做好相关设置。
3. 打开工具,输入必要参数并运行脚本。
4. 工具执行成功,计算结果集中到“乡级河道polyline”图层中,该图层的属性表如下图所示,导出该属性表即可得到所需的表格。
遗留问题:
ArcMap计算经纬度时的单位默认是“米”,而不是常规的“度”,但是因为在编写Arcpy脚本过程中没有找到正确的方式来指定所需的经纬度单位,所以还是采用了默认的单位“米”。补救方法是在工具执行成功后,在“乡级河道polyline”图层的属性表中对4个经纬度字段再进行Calculate Geometry,重新计算得出符合要求的数值结果。