劉 雄,李 宇,陳 剛
(中國(guó)地質(zhì)大學(xué)(武漢)信息工程學(xué)院,湖北 武漢 430074)
?
Arcpy支持下的線要素幾何自動(dòng)接邊與屬性檢查
劉雄,李宇,陳剛
(中國(guó)地質(zhì)大學(xué)(武漢)信息工程學(xué)院,湖北 武漢 430074)
由于客觀條件所限或?yàn)榱颂岣吖ぷ餍剩€狀矢量數(shù)據(jù)的采集通常采用分人員分區(qū)域方法進(jìn)行采集,這導(dǎo)致后期數(shù)據(jù)接邊工作繁瑣且容易出錯(cuò)。為提高線狀數(shù)據(jù)接邊效率和質(zhì)量,本文基于Arcpy編寫(xiě)了幾何自動(dòng)接邊和屬性檢查Python腳本工具,實(shí)現(xiàn)了線狀矢量數(shù)據(jù)自動(dòng)匹配功能并能提示對(duì)應(yīng)不一致屬性,提高了接邊效率和成果質(zhì)量,減輕了工作人員工作強(qiáng)度。在第一次全國(guó)地理國(guó)情普查中的應(yīng)用驗(yàn)證了方法的可靠性。
Arcpy;自動(dòng)匹配;幾何接邊;屬性檢查;地理國(guó)情
線狀矢量數(shù)據(jù)的生產(chǎn)常采用分幅分區(qū)域生產(chǎn),因此容易造成跨圖幅的線狀要素的斷裂[1],而且容易導(dǎo)致線狀數(shù)據(jù)很難在幾何上完全對(duì)應(yīng)[2],屬性也可能存在差異。因此,生產(chǎn)的數(shù)據(jù)需要進(jìn)行后期處理,常規(guī)數(shù)據(jù)處理辦法是通過(guò)人工手動(dòng)對(duì)幾何位置進(jìn)行調(diào)整,保證位置對(duì)應(yīng),然后逐屬性進(jìn)行比對(duì)以確保屬性一致。對(duì)于一些數(shù)據(jù)接邊,不僅要求兩邊數(shù)據(jù)對(duì)應(yīng)位置、屬性一致,而且還要求兩邊數(shù)據(jù)同時(shí)處于接邊邊界上,這就要求工作人員非常耐心,對(duì)數(shù)據(jù)進(jìn)行反復(fù)調(diào)整、檢查,以保證接邊成果質(zhì)量。針對(duì)接邊常見(jiàn)問(wèn)題,本文基于ArcGIS中的Arcpy,進(jìn)行Python腳本工具編寫(xiě),實(shí)現(xiàn)數(shù)據(jù)自動(dòng)幾何接邊,而且生成屬性不一致定位矢量數(shù)據(jù)以便工作人員進(jìn)行屬性檢查。由于腳本工具充分利用ArcGIS已有的分析工具,因此易于實(shí)現(xiàn)。工具在第一次全國(guó)地理國(guó)情普查中得到了實(shí)際應(yīng)用。
Python作為一種通用的開(kāi)源編程語(yǔ)言,易于學(xué)習(xí)和使用,在ArcGIS地理處理中用作腳本語(yǔ)言[3]。而ArcGIS中Arcpy站點(diǎn)包,是為以實(shí)用高效的方式通過(guò)Python執(zhí)行地理數(shù)據(jù)分析、數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)管理和地圖自動(dòng)化創(chuàng)建基礎(chǔ)[4]?;贏rcpy編寫(xiě)Python腳本工具可以充分利用ArcGIS已有的分析工具,大大減小程序編寫(xiě)難度,同時(shí)也提高了運(yùn)行效率[5]。
一般情況下數(shù)據(jù)接邊包括幾何位置對(duì)應(yīng)一致和各字段屬性一致。幾何接邊要求包括:①待接邊數(shù)據(jù)在一定容差范圍內(nèi)處于接邊界線上;②待接邊數(shù)據(jù)幾何位置差值不超過(guò)容差[6-9]。完成幾何接邊之后,進(jìn)行屬性檢查,即對(duì)數(shù)據(jù)進(jìn)行屬性一致性判斷。在獲取待接邊數(shù)據(jù)屬性后,逐一對(duì)各屬性進(jìn)行比對(duì),對(duì)屬性不一致要素生成定位文件,并記錄不一致屬性內(nèi)容。
1. 幾何接邊
幾何接邊不僅要求接邊數(shù)據(jù)端點(diǎn)位于接邊界線上,而且對(duì)應(yīng)數(shù)據(jù)端點(diǎn)位置小于容差。因此,在實(shí)現(xiàn)幾何接邊過(guò)程中,需要同時(shí)處理以上兩個(gè)問(wèn)題。
(1) 接邊數(shù)據(jù)預(yù)處理
由于工作人員操作或其他原因,本該位于接邊界線上的數(shù)據(jù)可能不是嚴(yán)格位于邊界線上,出現(xiàn)如過(guò)伸線、未及線現(xiàn)象。因此在進(jìn)行數(shù)據(jù)接邊前需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,使本應(yīng)該在邊界線上的要素嚴(yán)格位于邊界上。利用ArcGIS中已有的“修剪線”和“延伸線”工具完成數(shù)據(jù)預(yù)處理。對(duì)應(yīng)Python語(yǔ)句如下:
arcpy.TrimLine_edit(in_features,myDistance,"DELETE_SHORT")
arcpy.ExtendLine_edit(in_features,myDistance,"FEATURE")
其中,in_features為待預(yù)處理的接邊數(shù)據(jù);myDistance為用戶給定的修剪、延伸范圍值。
(2) 獲取待接邊點(diǎn)列
通過(guò)上述操作完成了數(shù)據(jù)預(yù)處理。由于直接操作線要素會(huì)比較麻煩,因此本文采用操作點(diǎn)的方式實(shí)現(xiàn)對(duì)線要素進(jìn)行操作[10]。
為了獲取邊界線上的點(diǎn)列,首先需要將線要素進(jìn)行“要素折點(diǎn)轉(zhuǎn)點(diǎn)”操作,將獲取的點(diǎn)要素類與邊界線進(jìn)行相交處理,獲取的點(diǎn)要素類即為接邊數(shù)據(jù)邊界點(diǎn)列,調(diào)用語(yǔ)句分別為:
arcpy.FeatureVerticesToPoints_management(in_features,point_features,"BOTH_ENDS")
arcpy.Intersect_analysis([point_features,Edge_features],Ipoint_features,"ALL")
其中,in_features為經(jīng)過(guò)預(yù)處理后的待接邊數(shù)據(jù);Edge_features為接邊邊界線。
(3) 自動(dòng)匹配序?qū)?/p>
由于待接邊數(shù)據(jù)都有實(shí)際的現(xiàn)實(shí)意義,因此,在對(duì)待接邊數(shù)據(jù)進(jìn)行點(diǎn)列匹配時(shí),按照距離最近進(jìn)行匹配是可行的。通過(guò)調(diào)用“近鄰分析”對(duì)數(shù)據(jù)進(jìn)行自動(dòng)匹配并生成“空間校正”所需的鏈接文件,其具體調(diào)用語(yǔ)句如下:
arcpy.Near_analysis(Apoint_features,Bpoint_features,search_radius,"LOCATION","NO_ANGLE")
數(shù)據(jù)A和B為待接邊數(shù)據(jù),其中Apoint_features為待接邊數(shù)據(jù)A在邊界線上的點(diǎn)列,Bpoint_features為待接邊數(shù)據(jù)B在邊界線上的點(diǎn)列,search_radius為指定用于搜索候選鄰近要素的半徑。
(4) 生成鏈接文件
利用已經(jīng)經(jīng)過(guò)“近鄰分析”處理的數(shù)據(jù),生成鏈接文件。
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) 幾何接邊
對(duì)生成的鏈接文件,利用空間校正工具,完成幾何接邊。幾何接邊詳細(xì)步驟如圖1所示。
2. 屬性檢查
對(duì)于上述已經(jīng)完成幾何接邊的數(shù)據(jù),需要對(duì)各接邊屬性進(jìn)行比對(duì),保證屬性一致性。為了便于用戶能夠快速了解到各字段不一致屬性,本文在屬性判斷的同時(shí)生成定位點(diǎn)。創(chuàng)建點(diǎn)要素類語(yǔ)句如下:
arcpy.CreateFeatureclass_management(out_path,out_name,"POINT","","","",mySRef)其中,out_path為創(chuàng)建點(diǎn)要素類輸出位置;out_name為要素類名稱;mySRef為輸出要素?cái)?shù)據(jù)集的空間參考。
圖1 幾何接邊流程
為了便于操作,本文采用端點(diǎn)代替線要素的方法進(jìn)行檢查。與上述幾何接邊一樣,利用“要素折點(diǎn)轉(zhuǎn)點(diǎn)”獲取線要素端點(diǎn),將獲取的端點(diǎn)與邊界線進(jìn)行相交處理,獲取邊界線上的點(diǎn)列代替線要素。然后按照一定容差對(duì)兩邊點(diǎn)列進(jìn)行匹配,并對(duì)屬性字段進(jìn)行逐一比對(duì),輸出屬性不一致字段。
由于部分?jǐn)?shù)據(jù)不僅要求屬性字段一致,而且線條方向也要一致,如水系線,這就需要對(duì)接邊數(shù)據(jù)方向進(jìn)行判斷,本文采用的方式是將獲取的線要素終點(diǎn)與上面獲取邊界線上的端點(diǎn)進(jìn)行位置比對(duì),以確定方向一致性。線要素方向存在4種可能,如圖2所示。
圖2 4種接邊方向情況
圖2中,箭頭和深灰點(diǎn)表示終點(diǎn),淺灰點(diǎn)表示接邊線上的端點(diǎn),豎向線條表示接邊界線。對(duì)圖2(b)(c)(d)中終點(diǎn)進(jìn)行了位置挪動(dòng),以便繪制。上述4種情況中,(b)、(d)表示方向一致,(a)、(c)表示方向不一致。對(duì)應(yīng)腳本語(yǔ)句如下:
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要素在邊界上的端點(diǎn)坐標(biāo);AID、BID表示A、B要素的ID;AEndP、BEndP表示終點(diǎn)要素幾何位置和屬性列;search_radius為給定的匹配容差。
屬性檢查的具體流程如圖3所示。
本文利用湖北省某相鄰兩縣第一次國(guó)情普查HYDL數(shù)據(jù)作測(cè)試。該兩縣數(shù)據(jù)由不同生產(chǎn)單位進(jìn)行生產(chǎn)采集。HYDL層數(shù)據(jù)涉及屬性要素較多,而且需要保持水流流向一致,因此具有較好的試驗(yàn)價(jià)值。
圖3 屬性檢查流程
圖4(a)為未經(jīng)處理數(shù)據(jù),其中粗線表示兩縣接邊邊界線即縣界,從圖中可知,數(shù)據(jù)除了對(duì)應(yīng)位置錯(cuò)位,部分?jǐn)?shù)據(jù)還存在未及線和過(guò)伸線問(wèn)題。圖4(b)數(shù)據(jù)經(jīng)過(guò)幾何接邊處理,數(shù)據(jù)不僅都在邊界線上,而且也解決了錯(cuò)位問(wèn)題及幾何接邊問(wèn)題。圖4(c)是進(jìn)行屬性檢查處理,其中圓點(diǎn)為生成的屬性問(wèn)題定位點(diǎn),各點(diǎn)對(duì)應(yīng)的屬性問(wèn)題記錄如圖5屬性表所示。從圖5中可以很明確地得知問(wèn)題類型和各字段屬性不一致內(nèi)容,且可以便捷地輔助工作人員對(duì)屬性進(jìn)行修改。
圖4 幾何接邊與屬性檢查成果
圖5 屬性檢查定位點(diǎn)屬性表
通過(guò)圖4、圖5可知,利用幾何接邊可以很便捷地處理接邊中存在的絕大部分問(wèn)題,而屬性檢查則極大地幫助用戶進(jìn)行數(shù)據(jù)修改、檢查,能夠較好地解決接邊中的問(wèn)題。
本文針對(duì)傳統(tǒng)手動(dòng)接邊的缺陷,利用ArcGIS中的Arcpy站點(diǎn)包進(jìn)行幾何接邊和屬性檢查腳本工具編寫(xiě),較大程度上減輕了工作人員的工作量,同時(shí)也提高了工作效率和成果質(zhì)量。在第一次地理國(guó)情普查中的應(yīng)用則驗(yàn)證了方法的可靠性,有較好的實(shí)際應(yīng)用價(jià)值。另外,文中所涉及工具大部分以ArcGIS中自帶分析工具為主,容易實(shí)現(xiàn),可以為其他單位提供參考。
[1]蔣勇,劉江,黃功文.基于ArcGIS Engine的IPointCollection接邊檢查法的研究[J].測(cè)繪與空間地理信息,2014,37(11):124-125.
[2]朱欣焰,張建超,李德仁.無(wú)縫空間數(shù)據(jù)庫(kù)的概念、實(shí)現(xiàn)與問(wèn)題研究[J].武漢大學(xué)學(xué)報(bào)(信息科學(xué)版),2002,27(4):382-386.
[3]余詠勝,彭艷麗,尹言軍.基于Arcpy的影像地圖自動(dòng)處理技術(shù)研究[J].測(cè)繪通報(bào),2015(3):82-84.
[4]牟乃夏,劉文寶,王海銀,等.ArcGIS 10地理信息系統(tǒng)教程——從初學(xué)到精通[M].北京:測(cè)繪出版社,2012.
[5]辛兵廠,王來(lái)強(qiáng),張朝坤.淺談Python在地理國(guó)情普查數(shù)據(jù)處理中的應(yīng)用[J].測(cè)繪與空間地理信息,2014, 37(6):108-110.
[6]費(fèi)小睿,陳玉娜.大比例尺地形圖自動(dòng)接邊檢查的實(shí)現(xiàn)[J].城市勘測(cè),2015(1):60-62.
[7]隋春光,范榮雙,尹連旺.數(shù)字海圖無(wú)縫拼接方法研究[J].武漢大學(xué)學(xué)報(bào)(信息科學(xué)版),2005,30(3):278-281.
[8]吳銘杰. 基于AutoCAD擴(kuò)展實(shí)體數(shù)據(jù)的地形圖接邊功能的實(shí)現(xiàn)[J].測(cè)繪與空間地理信息, 2013,36(5):158-159.
[9]劉允,劉陽(yáng),楊釗.大比例尺地形圖數(shù)據(jù)接邊程序設(shè)計(jì)與實(shí)現(xiàn)[J].城市勘測(cè), 2012(1): 65-67.
[10]周順平,張江東,左澤均.線要素任意范圍接邊算法的設(shè)計(jì)與實(shí)現(xiàn)[J].測(cè)繪科學(xué),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—),男,碩士,主要研究方向?yàn)榫芄こ虦y(cè)量與變形監(jiān)測(cè)。E-mail:cugliuxiong@163.com
P208
B
0494-0911(2016)08-0114-04
引文格式:劉雄,李宇,陳剛.Arcpy支持下的線要素幾何自動(dòng)接邊與屬性檢查[J].測(cè)繪通報(bào),2016(8):114-117.