林養(yǎng)欽
(廣東省地質(zhì)局第七地質(zhì)大隊(duì),廣東惠州 516300)
作為一項(xiàng)對(duì)國(guó)情國(guó)力進(jìn)行準(zhǔn)確調(diào)查、把握國(guó)土資源利用情況的基礎(chǔ)性監(jiān)測(cè)工作,全國(guó)基礎(chǔ)性地理國(guó)情監(jiān)測(cè)項(xiàng)目對(duì)于促進(jìn)產(chǎn)業(yè)發(fā)展與科技創(chuàng)新、實(shí)現(xiàn)地理信息轉(zhuǎn)型發(fā)展具有重要意義。地理國(guó)情監(jiān)測(cè)項(xiàng)目的監(jiān)測(cè)周期為1 年,整個(gè)項(xiàng)目的數(shù)據(jù)生產(chǎn)時(shí)間主要集中在7 月到11 月,時(shí)間節(jié)點(diǎn)為每年的6 月底[1]。該項(xiàng)目主要包括4 大部分,分別為正射影像處理、監(jiān)測(cè)數(shù)據(jù)生產(chǎn)、監(jiān)測(cè)成果的檢查與驗(yàn)收以及監(jiān)測(cè)成果入庫(kù)。項(xiàng)目中的主要工作在于數(shù)據(jù)生產(chǎn),僅有一個(gè)月左右時(shí)間進(jìn)行項(xiàng)目質(zhì)檢,因此,增強(qiáng)項(xiàng)目成果質(zhì)量檢查更新錯(cuò)誤的針對(duì)性、加快檢查進(jìn)度、提高檢查正確率對(duì)于項(xiàng)目的高效、高質(zhì)量完成具有重要意義。
基礎(chǔ)性地理國(guó)情監(jiān)測(cè)數(shù)據(jù)生產(chǎn)主要使用ArcGIS 軟件,數(shù)據(jù)生產(chǎn)及質(zhì)量檢查過程中必然會(huì)涉及多種重復(fù)性工作,因此,研究基于ArcGIS 平臺(tái)的地理國(guó)情監(jiān)測(cè)數(shù)據(jù)批量化處理輔助工具對(duì)于提高數(shù)據(jù)生產(chǎn)質(zhì)量及效率、節(jié)約項(xiàng)目成本具有重要作用。作為一種高級(jí)程序設(shè)計(jì)語言,Python 語言憑借其擴(kuò)展性強(qiáng)、簡(jiǎn)潔明了等多種優(yōu)點(diǎn)成為備受青睞的程序語言?;赑ython 語言的ArcGIS 腳本可以大大提高地理國(guó)情監(jiān)測(cè)數(shù)據(jù)處理效率,實(shí)現(xiàn)數(shù)據(jù)處理高效自動(dòng)化。
作為基于ArcGIS 功能構(gòu)建的站點(diǎn)包,ArcPy 為用戶提供了地理數(shù)據(jù)處理工具的接口,該站點(diǎn)包封裝了強(qiáng)大的類及相關(guān)函數(shù),通過Python 語言調(diào)用該站點(diǎn)包的類與相關(guān)函數(shù)實(shí)現(xiàn)地理數(shù)據(jù)的自動(dòng)化處理,包括數(shù)據(jù)分析、數(shù)據(jù)轉(zhuǎn)換以及數(shù)據(jù)管理等[2-3]。目前基于ArcPy 的腳本工具與地理國(guó)情監(jiān)測(cè)數(shù)據(jù)的結(jié)合多用于數(shù)據(jù)提取批處理、數(shù)據(jù)裁切等,對(duì)于空間參考信息、拓?fù)潢P(guān)系、屬性結(jié)構(gòu)信息等方面的檢查功能較少?;诖?,本文通過最新ArcPy 站點(diǎn)包結(jié)合地理國(guó)情監(jiān)測(cè)數(shù)據(jù)進(jìn)行代碼編寫,實(shí)現(xiàn)地理國(guó)情監(jiān)測(cè)數(shù)據(jù)成果數(shù)據(jù)檢查效率的提升。
作為ArcGIS 地理信息系統(tǒng)平臺(tái)所用腳本語言,Python 語言的主要特點(diǎn)包括[4-5]:
1)Python 語言的開源與免費(fèi)功能可以為ArcGIS 軟件的進(jìn)一步開發(fā)提供便捷;
2)Python 語言具有的面向?qū)ο缶幊烫卣?,符合ArcGIS 的編程要求;
3)ArcGIS 所支持的各類操作系統(tǒng)均可使用Python 語言進(jìn)行改動(dòng);
4)Python 語言適合各專業(yè)人員學(xué)習(xí),專業(yè)要求性低,通過系統(tǒng)學(xué)習(xí)就可用于解決本行業(yè)實(shí)際問題;
5)作為一種解釋性語言,Python 語言具有較高的移植性,成為ArcGIS 腳本語言后,其功能得到了進(jìn)一步地升級(jí)與增強(qiáng)。
ArcPy 是ArcGIS 中的一個(gè)站點(diǎn)包,其封裝了ArcGIS 大部分的功能,Python 可以通過該站點(diǎn)包實(shí)現(xiàn)ArcGIS 地理處理功能的訪問,包括地理數(shù)據(jù)分析、數(shù)據(jù)管理以及自動(dòng)化創(chuàng)建地圖等功能[6]。ArcPy包括4 大模塊,如圖1 所示。1)ArcPy.da 模塊,用于提供數(shù)據(jù)訪問函數(shù)等;2)ArcPy.na 模塊,用于提供網(wǎng)絡(luò)分析函數(shù)等;3)ArcPy.sa 模塊,用于提供地理空間分析函數(shù)等;4)ArcPy.mapping 模塊,用于提供制圖等相關(guān)函數(shù)。
圖1 ArcPy 四大模塊
地理國(guó)情監(jiān)測(cè)主要包括3 種數(shù)據(jù)成果,分別為地理國(guó)情監(jiān)測(cè)生產(chǎn)元數(shù)據(jù)成果、地表覆蓋分類數(shù)據(jù)、地理國(guó)情要素?cái)?shù)據(jù)成果[7]。這3 種數(shù)據(jù)成果的檢查內(nèi)容均包括數(shù)據(jù)完整性、表征質(zhì)量、要素類型、空間參考系統(tǒng)、拓?fù)潢P(guān)系、屬性結(jié)構(gòu)等[8]。為了最大限度減少人工工作量,同時(shí)保證數(shù)據(jù)檢查的正確性,可以使用ArcGIS 結(jié)合Python 語言實(shí)現(xiàn)如要素類型、空間參考系、拓?fù)潢P(guān)系、屬性結(jié)構(gòu)這幾類檢查內(nèi)容的檢查。使用Python 語言完成檢查后,輔以必要的人工檢查發(fā)現(xiàn)數(shù)據(jù)內(nèi)在錯(cuò)誤,提高問題的檢查效率以及發(fā)現(xiàn)率。
通過ArcPy.da 函數(shù)可以獲取多種文件的路徑、數(shù)據(jù)類型等屬性,同時(shí)能夠獲取數(shù)據(jù)的要素類型以及空間參考系等,實(shí)現(xiàn)對(duì)要素類型以及空間參考系的檢查。
要素拓?fù)潢P(guān)系檢查主要包括閉合、連續(xù)、連接、重復(fù)等關(guān)系檢查,也就是對(duì)線線、線面、面面之間的聯(lián)系加以檢查[9]。地理國(guó)情監(jiān)測(cè)數(shù)據(jù)中對(duì)于要素共線誤差的要求是小于0.5 m,對(duì)于要素面重疊、面裂隙誤差的要求同樣是小于0.5 m[10]。
對(duì)于水系要素而言,拓?fù)潢P(guān)系錯(cuò)誤主要集中在2 個(gè)方面,1)數(shù)條河道流入同一河流時(shí),上下游結(jié)構(gòu)線沒有在同一點(diǎn)相交;2)沒有打斷結(jié)構(gòu)線連通位置。對(duì)于道路要素而言,拓?fù)潢P(guān)系錯(cuò)誤主要集中在4 個(gè)方面:1)沒有共線處理市政道路與普通道路的重復(fù)路段;2)錯(cuò)誤打斷市政道路與普通公路的重復(fù)采集位置;3)錯(cuò)誤打斷立體交接位置;4)沒有打斷路面交接連通位置。在地理單元方面,拓?fù)潢P(guān)系錯(cuò)誤主要表現(xiàn)在面的縫隙與交叉。同時(shí)在進(jìn)行接邊時(shí),作業(yè)人員往往只關(guān)注水系、道路要素接邊,對(duì)于地理單元的接邊檢查較容易忽略。
針對(duì)地理國(guó)情監(jiān)測(cè)數(shù)據(jù)制定特有的拓?fù)錂z查數(shù)據(jù)集,監(jiān)測(cè)數(shù)據(jù)要素拓?fù)潢P(guān)系檢查包括7 個(gè)步驟:1)數(shù)據(jù)集創(chuàng)建;2)數(shù)據(jù)導(dǎo)入;3)拓?fù)鋭?chuàng)建;4)要素類添加;5)拓?fù)湟?guī)則添加;6)拓?fù)潋?yàn)證;7)導(dǎo)出檢查結(jié)果。
上述代碼實(shí)現(xiàn)要素拓?fù)錂z查的主要思路為首先創(chuàng)建拓?fù)湟?guī)則,然后根據(jù)對(duì)添加的監(jiān)測(cè)數(shù)據(jù)進(jìn)行壓蓋、重疊、閉合、打斷等檢查。
在進(jìn)行內(nèi)業(yè)數(shù)據(jù)編繪時(shí)進(jìn)行屬性的修改與賦值,通常在進(jìn)行屬性賦值時(shí)由于人為或者軟件漏洞會(huì)造成屬性賦值錯(cuò)誤,并且該類錯(cuò)誤的范圍較大、普遍性較高。一般的要素屬性錯(cuò)誤主要有枚舉賦值錯(cuò)誤、圖斑類型錯(cuò)誤以及對(duì)象屬性與實(shí)際情況偏差。
2.3.1 枚舉賦值錯(cuò)誤
地理國(guó)情監(jiān)測(cè)數(shù)據(jù)中的部分枚舉字段可通過軟件或人工賦值,如地理國(guó)情監(jiān)測(cè)中“變化類型”字段通常會(huì)隨著年度監(jiān)測(cè)發(fā)生變化,根據(jù)不同的變化類型對(duì)該字段進(jìn)行賦值,如“0”表示“伸縮”、“1”表示“新生”、“2”表示“糾錯(cuò)”。在生產(chǎn)過程中,由于理解偏差、軟件沒有經(jīng)過測(cè)試就使用會(huì)造成“要素唯一標(biāo)識(shí)碼”“變化類型”等枚舉值錯(cuò)誤。
2.3.2 圖斑類型錯(cuò)誤
如果地理國(guó)情監(jiān)測(cè)數(shù)據(jù)出現(xiàn)大面積圖斑更新錯(cuò)誤,就會(huì)造成數(shù)據(jù)成果不合格,重新進(jìn)行數(shù)據(jù)查改以及上交會(huì)造成項(xiàng)目成本增加。圖斑的大面積錯(cuò)誤主要由以下3 個(gè)原因?qū)е拢?)沒有按照外業(yè)調(diào)查成果進(jìn)行內(nèi)業(yè)圖斑分類代碼更新;2)兩期影像對(duì)比不明顯,沒有通過外業(yè)調(diào)查的方式對(duì)內(nèi)業(yè)不能明確圖斑分類的情況進(jìn)行核實(shí);3)錯(cuò)誤進(jìn)行的圖斑合并或切割造成的變化圖斑的錯(cuò)誤更新[11]。
利用Python 語言以及地理國(guó)情監(jiān)測(cè)數(shù)據(jù)之間的相互關(guān)系對(duì)數(shù)據(jù)更新錯(cuò)誤進(jìn)行檢查與核實(shí),通過對(duì)錯(cuò)誤信息進(jìn)行定位實(shí)現(xiàn)錯(cuò)誤信息自動(dòng)提取,形成錯(cuò)誤定位文件。本文以地理國(guó)情監(jiān)測(cè)數(shù)據(jù)中道路中心線與地表覆蓋數(shù)據(jù)中建筑物面之間的錯(cuò)誤拓?fù)潢P(guān)系為例進(jìn)行說明。
本案例是實(shí)現(xiàn)線要素與面要素相切、相交區(qū)域的提取,實(shí)現(xiàn)流程如圖2 所示。
圖2 線要素與面要素相切、相交區(qū)域提取
具體實(shí)現(xiàn)步驟為:
1)確定腳本執(zhí)行的工作空間,在此空間內(nèi)可進(jìn)行讀取、查詢以及處理數(shù)據(jù)等工作;
2)線要素?cái)?shù)據(jù)合并,將線狀橋梁要素、線狀河流要素以及線狀道路數(shù)據(jù)等進(jìn)行合并,并丟棄不必要屬性字段,使用的是ArcGIS 自帶合并要素功能;
3)通過按位置要素選取工具將與線要素相切、相交的地表覆蓋圖斑確定為一個(gè)臨時(shí)面要素層;
4)通過按要素屬性選擇工具將臨時(shí)面狀要素圖層中分類為非房屋的要素圖層丟棄,保留房屋類面狀要素選擇集;
5)使用“Intersect”工具對(duì)合并后的線狀要素與房屋類面狀要素進(jìn)行相交處理,將錯(cuò)誤區(qū)域線狀要素以預(yù)定格式進(jìn)行儲(chǔ)存與輸出。
ArcGIS 工具箱中的大多數(shù)功能均可通過ArcPy相應(yīng)的功能函數(shù)實(shí)現(xiàn),利用Python 語言對(duì)ArcPy 相應(yīng)功能函數(shù)進(jìn)行調(diào)用以及組合,可以滿足大部分地理國(guó)情監(jiān)測(cè)成果質(zhì)量的自動(dòng)檢查[12-13]。上文設(shè)計(jì)思路的主要實(shí)現(xiàn)步驟如下:
1)通過調(diào)用ArcPy 站點(diǎn)包實(shí)現(xiàn)工作間的設(shè)置,在此空間內(nèi)可實(shí)現(xiàn)數(shù)據(jù)的查詢、增減等操作,如增加線狀道路要素?cái)?shù)據(jù)。實(shí)現(xiàn)代碼為:
import arcpy
from arcpy import imp
imp.workspace="D:/ceshiData"
UV_LRRL="JIAN_256100.gdb/ceshiData/
UV_LRRL"
……
UV_LCRA="JIAN_256314.gdb/ceshiData/
UV_LCRA"
2)選擇ArcPy 站點(diǎn)包中的FieldMappings 類及其方法對(duì)線狀要素所需屬性表進(jìn)行組織并刪除合并后線狀要素不需要的屬性。實(shí)現(xiàn)代碼為:
fieldMappings_output=arcpy.FiledMappings()
fieldMappings_output.addTabke(UV_LRRL)
……
fieldMappings_output.addTabke(UV_HYDL)
#刪除無用的屬性字段
If field.name not in["CC","GB","NAME"]:
fieldMappings_output.removeFieldMap(fieldMappings_output.fileFieldMapIndex(field.name))
3)對(duì)線狀要素進(jìn)行檢查,在合并函數(shù)中加入fieldMappings_output 作為字段參數(shù)對(duì)線狀要素進(jìn)行合并處理。
4)通過屬性選擇、空間選擇操作選擇與線狀要素相切、相交的房屋面要素并得到線面相交的線要素?cái)?shù)據(jù)。實(shí)現(xiàn)代碼為:
Arcpy.MakeFeatureLayer_management
(UV_LCRA,”LCA_lyr”)
Arcpy.Intersect_analysis
(["LCA_lyr","lineTemp_lyr"],"lineTemp_lyrl","ALL",".001 Meters","INPUT")
Arcpy.MakeFeatureLayer_management
("lineTemp.shp","lineTemp_lyr")
5)整理輸出結(jié)果,添加錯(cuò)誤說明字段,將無用屬性字段刪除。實(shí)現(xiàn)代碼為:
For field in filedList:
fieldList=Arcpy.ListFields("lineTemp_lyrl.shp","*","*")
If(fied.name!="FID")and(field.name!="CC"):
Arcpy.AddField_management(fc,"錯(cuò)誤類型","TEXT", "", ""50, "", "NON_REQUIRED","NULLABLE","")
6)填寫錯(cuò)誤說明字段內(nèi)容。實(shí)現(xiàn)代碼為[13]:
arrpy.CalculatedField_manegement("錯(cuò)誤類型","lineTemp_lyrl","PYTHON_9.3",expression)
Expression="str(!CC?。?str(!CC_1!)"
通過上述步驟以及代碼即可實(shí)現(xiàn)地理國(guó)情矢量數(shù)據(jù)的空間定位與錯(cuò)誤說明,輔以人工瀏覽與檢查,形成檢查成果并交給作業(yè)人員修改與完善,可提高數(shù)據(jù)的檢查效率、大大降低人工工作量。
地理國(guó)情監(jiān)測(cè)項(xiàng)目具有周期長(zhǎng)、時(shí)間緊、任務(wù)重的特征,因此研究對(duì)地理國(guó)情監(jiān)測(cè)項(xiàng)目成果數(shù)據(jù)質(zhì)量進(jìn)行有效控制、保障年度國(guó)情監(jiān)測(cè)項(xiàng)目按期按質(zhì)完成具有重要意義。本文詳細(xì)介紹了地理國(guó)情監(jiān)測(cè)數(shù)據(jù)檢查的主要內(nèi)容,包括空間參考系檢查、拓?fù)潢P(guān)系檢查、屬性結(jié)構(gòu)檢查等。同時(shí)對(duì)Python 語言以及ArcPy 站點(diǎn)包進(jìn)行了介紹,為了最大限度提高作業(yè)效率、保障成果質(zhì)量,通過利用Python 語言結(jié)合ArcPy 站點(diǎn)包編寫地理國(guó)情監(jiān)測(cè)數(shù)據(jù)成果質(zhì)量檢查工具,實(shí)現(xiàn)錯(cuò)誤位置的快速定位。通過實(shí)際應(yīng)用設(shè)計(jì)并實(shí)現(xiàn)了拓?fù)潢P(guān)系錯(cuò)誤定位。本文編寫代碼并不完善,僅僅實(shí)現(xiàn)了設(shè)計(jì)功能,同時(shí)應(yīng)加入解鎖數(shù)據(jù)、許可檢查、異常處理等功能,進(jìn)一步完善與豐富程序。根據(jù)地理國(guó)情監(jiān)測(cè)數(shù)據(jù)的特征,利用Python 語言輔助相關(guān)質(zhì)檢工作是一種高效科學(xué)的處理辦法,同時(shí)可將本文開發(fā)思路進(jìn)一步應(yīng)用于基礎(chǔ)測(cè)繪與國(guó)土調(diào)查等項(xiàng)目數(shù)據(jù)處理中,提高Python語言的應(yīng)用價(jià)值。