劉 雄,李 宇,陳 剛
(中國地質大學(武漢)信息工程學院,湖北 武漢 430074)
?
Arcpy支持下的線要素幾何自動接邊與屬性檢查
劉雄,李宇,陳剛
(中國地質大學(武漢)信息工程學院,湖北 武漢 430074)
由于客觀條件所限或為了提高工作效率,線狀矢量數據的采集通常采用分人員分區域方法進行采集,這導致后期數據接邊工作繁瑣且容易出錯。為提高線狀數據接邊效率和質量,本文基于Arcpy編寫了幾何自動接邊和屬性檢查Python腳本工具,實現了線狀矢量數據自動匹配功能并能提示對應不一致屬性,提高了接邊效率和成果質量,減輕了工作人員工作強度。在第一次全國地理國情普查中的應用驗證了方法的可靠性。
Arcpy;自動匹配;幾何接邊;屬性檢查;地理國情
線狀矢量數據的生產常采用分幅分區域生產,因此容易造成跨圖幅的線狀要素的斷裂[1],而且容易導致線狀數據很難在幾何上完全對應[2],屬性也可能存在差異。因此,生產的數據需要進行后期處理,常規數據處理辦法是通過人工手動對幾何位置進行調整,保證位置對應,然后逐屬性進行比對以確保屬性一致。對于一些數據接邊,不僅要求兩邊數據對應位置、屬性一致,而且還要求兩邊數據同時處于接邊邊界上,這就要求工作人員非常耐心,對數據進行反復調整、檢查,以保證接邊成果質量。針對接邊常見問題,本文基于ArcGIS中的Arcpy,進行Python腳本工具編寫,實現數據自動幾何接邊,而且生成屬性不一致定位矢量數據以便工作人員進行屬性檢查。由于腳本工具充分利用ArcGIS已有的分析工具,因此易于實現。工具在第一次全國地理國情普查中得到了實際應用。
Python作為一種通用的開源編程語言,易于學習和使用,在ArcGIS地理處理中用作腳本語言[3]。而ArcGIS中Arcpy站點包,是為以實用高效的方式通過Python執行地理數據分析、數據轉換、數據管理和地圖自動化創建基礎[4]。基于Arcpy編寫Python腳本工具可以充分利用ArcGIS已有的分析工具,大大減小程序編寫難度,同時也提高了運行效率[5]。
一般情況下數據接邊包括幾何位置對應一致和各字段屬性一致。幾何接邊要求包括:①待接邊數據在一定容差范圍內處于接邊界線上;②待接邊數據幾何位置差值不超過容差[6-9]。完成幾何接邊之后,進行屬性檢查,即對數據進行屬性一致性判斷。在獲取待接邊數據屬性后,逐一對各屬性進行比對,對屬性不一致要素生成定位文件,并記錄不一致屬性內容。
1. 幾何接邊
幾何接邊不僅要求接邊數據端點位于接邊界線上,而且對應數據端點位置小于容差。因此,在實現幾何接邊過程中,需要同時處理以上兩個問題。
(1) 接邊數據預處理
由于工作人員操作或其他原因,本該位于接邊界線上的數據可能不是嚴格位于邊界線上,出現如過伸線、未及線現象。因此在進行數據接邊前需要對數據進行預處理,使本應該在邊界線上的要素嚴格位于邊界上。利用ArcGIS中已有的“修剪線”和“延伸線”工具完成數據預處理。對應Python語句如下:
arcpy.TrimLine_edit(in_features,myDistance,"DELETE_SHORT")
arcpy.ExtendLine_edit(in_features,myDistance,"FEATURE")
其中,in_features為待預處理的接邊數據;myDistance為用戶給定的修剪、延伸范圍值。
(2) 獲取待接邊點列
通過上述操作完成了數據預處理。由于直接操作線要素會比較麻煩,因此本文采用操作點的方式實現對線要素進行操作[10]。
為了獲取邊界線上的點列,首先需要將線要素進行“要素折點轉點”操作,將獲取的點要素類與邊界線進行相交處理,獲取的點要素類即為接邊數據邊界點列,調用語句分別為:
arcpy.FeatureVerticesToPoints_management(in_features,point_features,"BOTH_ENDS")
arcpy.Intersect_analysis([point_features,Edge_features],Ipoint_features,"ALL")
其中,in_features為經過預處理后的待接邊數據;Edge_features為接邊邊界線。
(3) 自動匹配序對
由于待接邊數據都有實際的現實意義,因此,在對待接邊數據進行點列匹配時,按照距離最近進行匹配是可行的。通過調用“近鄰分析”對數據進行自動匹配并生成“空間校正”所需的鏈接文件,其具體調用語句如下:
arcpy.Near_analysis(Apoint_features,Bpoint_features,search_radius,"LOCATION","NO_ANGLE")
數據A和B為待接邊數據,其中Apoint_features為待接邊數據A在邊界線上的點列,Bpoint_features為待接邊數據B在邊界線上的點列,search_radius為指定用于搜索候選鄰近要素的半徑。
(4) 生成鏈接文件
利用已經經過“近鄰分析”處理的數據,生成鏈接文件。
DataRow=[]
for row in arcpy.da.SearchCursor(Apoint_features,["SHAPE@XY","NEAR_DIST","NEAR_X","NEAR_Y"]):
DataRow.append(row)
output=open('ListData.txt′,′w′)
i=1
for row in DataRow:
if row[1]>0:
gx,gy=row[0]
sx=row[2]
sy=row[3]
StrData=str(i)+′ ′+str(gx)+′ ′+str(gy)+′ ′+str(sx)+′ ′+str(sy)+′ ′
output.writelines(StrData)
i=i+1
output.close()
(5) 幾何接邊
對生成的鏈接文件,利用空間校正工具,完成幾何接邊。幾何接邊詳細步驟如圖1所示。
2. 屬性檢查
對于上述已經完成幾何接邊的數據,需要對各接邊屬性進行比對,保證屬性一致性。為了便于用戶能夠快速了解到各字段不一致屬性,本文在屬性判斷的同時生成定位點。創建點要素類語句如下:
arcpy.CreateFeatureclass_management(out_path,out_name,"POINT","","","",mySRef)其中,out_path為創建點要素類輸出位置;out_name為要素類名稱;mySRef為輸出要素數據集的空間參考。

圖1 幾何接邊流程
為了便于操作,本文采用端點代替線要素的方法進行檢查。與上述幾何接邊一樣,利用“要素折點轉點”獲取線要素端點,將獲取的端點與邊界線進行相交處理,獲取邊界線上的點列代替線要素。然后按照一定容差對兩邊點列進行匹配,并對屬性字段進行逐一比對,輸出屬性不一致字段。
由于部分數據不僅要求屬性字段一致,而且線條方向也要一致,如水系線,這就需要對接邊數據方向進行判斷,本文采用的方式是將獲取的線要素終點與上面獲取邊界線上的端點進行位置比對,以確定方向一致性。線要素方向存在4種可能,如圖2所示。

圖2 4種接邊方向情況
圖2中,箭頭和深灰點表示終點,淺灰點表示接邊線上的端點,豎向線條表示接邊界線。對圖2(b)(c)(d)中終點進行了位置挪動,以便繪制。上述4種情況中,(b)、(d)表示方向一致,(a)、(c)表示方向不一致。對應腳本語句如下:
def GetDirection(AEndP,BEndP,AID,BID,AXY,BXY,search_radius):
i=1
j=1
for row in AEndP:
if row[1]==AID:
ax,ay=row[0]
x,y=AXY
if (math.sqrt((ax-x)**2+(ay-y)**2)>search_radius):
i=-1
break
for row in BEndP:
if row[1]==BID:
bx,by=row[0]
x,y=BXY
if(math.sqrt((bx-x)**2+(by-y)**2)>search_radius):
j=-1
break
myDirection=True #方向一致
if i*j==1:
myDirection=False #方向不一致
return myDirection
其中,AXY、BXY分別表示A、B要素在邊界上的端點坐標;AID、BID表示A、B要素的ID;AEndP、BEndP表示終點要素幾何位置和屬性列;search_radius為給定的匹配容差。
屬性檢查的具體流程如圖3所示。
本文利用湖北省某相鄰兩縣第一次國情普查HYDL數據作測試。該兩縣數據由不同生產單位進行生產采集。HYDL層數據涉及屬性要素較多,而且需要保持水流流向一致,因此具有較好的試驗價值。

圖3 屬性檢查流程
圖4(a)為未經處理數據,其中粗線表示兩縣接邊邊界線即縣界,從圖中可知,數據除了對應位置錯位,部分數據還存在未及線和過伸線問題。圖4(b)數據經過幾何接邊處理,數據不僅都在邊界線上,而且也解決了錯位問題及幾何接邊問題。圖4(c)是進行屬性檢查處理,其中圓點為生成的屬性問題定位點,各點對應的屬性問題記錄如圖5屬性表所示。從圖5中可以很明確地得知問題類型和各字段屬性不一致內容,且可以便捷地輔助工作人員對屬性進行修改。

圖4 幾何接邊與屬性檢查成果

圖5 屬性檢查定位點屬性表
通過圖4、圖5可知,利用幾何接邊可以很便捷地處理接邊中存在的絕大部分問題,而屬性檢查則極大地幫助用戶進行數據修改、檢查,能夠較好地解決接邊中的問題。
本文針對傳統手動接邊的缺陷,利用ArcGIS中的Arcpy站點包進行幾何接邊和屬性檢查腳本工具編寫,較大程度上減輕了工作人員的工作量,同時也提高了工作效率和成果質量。在第一次地理國情普查中的應用則驗證了方法的可靠性,有較好的實際應用價值。另外,文中所涉及工具大部分以ArcGIS中自帶分析工具為主,容易實現,可以為其他單位提供參考。
[1]蔣勇,劉江,黃功文.基于ArcGIS Engine的IPointCollection接邊檢查法的研究[J].測繪與空間地理信息,2014,37(11):124-125.
[2]朱欣焰,張建超,李德仁.無縫空間數據庫的概念、實現與問題研究[J].武漢大學學報(信息科學版),2002,27(4):382-386.
[3]余詠勝,彭艷麗,尹言軍.基于Arcpy的影像地圖自動處理技術研究[J].測繪通報,2015(3):82-84.
[4]牟乃夏,劉文寶,王海銀,等.ArcGIS 10地理信息系統教程——從初學到精通[M].北京:測繪出版社,2012.
[5]辛兵廠,王來強,張朝坤.淺談Python在地理國情普查數據處理中的應用[J].測繪與空間地理信息,2014, 37(6):108-110.
[6]費小睿,陳玉娜.大比例尺地形圖自動接邊檢查的實現[J].城市勘測,2015(1):60-62.
[7]隋春光,范榮雙,尹連旺.數字海圖無縫拼接方法研究[J].武漢大學學報(信息科學版),2005,30(3):278-281.
[8]吳銘杰. 基于AutoCAD擴展實體數據的地形圖接邊功能的實現[J].測繪與空間地理信息, 2013,36(5):158-159.
[9]劉允,劉陽,楊釗.大比例尺地形圖數據接邊程序設計與實現[J].城市勘測, 2012(1): 65-67.
[10]周順平,張江東,左澤均.線要素任意范圍接邊算法的設計與實現[J].測繪科學,2012,37(5):20-22.
Automatic Edge Matching and Attribute Checking of Line Features Based on Arcpy
LIU Xiong,LI Yu,CHEN Gang
10.13474/j.cnki.11-2246.2016.0271.
2016-02-23
劉雄(1991—),男,碩士,主要研究方向為精密工程測量與變形監測。E-mail:cugliuxiong@163.com
P208
B
0494-0911(2016)08-0114-04
引文格式:劉雄,李宇,陳剛.Arcpy支持下的線要素幾何自動接邊與屬性檢查[J].測繪通報,2016(8):114-117.