關鍵詞:
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,重新計算得出符合要求的數值結果。