王志平
(上海瑞納信息技術有限公司,上海200433)
為推進以土地為基礎的不動產統一登記工作,推動城鄉一體化地籍管理進程,逐步實現國土資源信息化、標準化,國土資源部印發了《全國宗地統一代碼編制工作實施方案》的通知(國土資發〔2012〕4號)。不僅最近幾年開展的集體土地所有權調查、村莊地籍調查要求以新的編碼規則進行宗地編號,老的城鎮地籍系統升級時,所有宗地也要按照新規則進行統一編號。面對數量巨大的宗地和界址點,如何快速高效的進行重新編號是一個值得研究的問題。
全國宗地統一編碼采用“地籍區和地籍子區”兩個級別的編碼分區概念,遵循宗地統一編碼的原則。地籍區、地籍子區的劃分有三種模式:一是按照現行鄉鎮、街道劃分;二是以現行鄉鎮街道為基礎,結合典型線狀地物劃分;三是完成按照典型線狀地物劃分。
《地籍調查規程》要求[1],在地籍子區范圍內,從西到東,從北到南,統一預編宗地號。宗地代碼采用五層19位層次碼結構,按層次分別表示縣級行政區劃、地籍區、地籍子區、土地所有權類型、宗地號。第一層次為縣級行政區劃,代碼為6位,采用《中華人民共和國行政區劃代碼》(GB/T 2260)。第二層次為地籍區,代碼為3位,用01~999表示。第三層次為地籍子區,代碼為3位,用01~999表示。第四層次為土地權屬類型,代碼為2位,其中第一位表示土地所有權類型,用G、J、Z表示,第二位表示宗地特征碼,用 A、B、S、X、C、W、Y表示。第五層次為宗地順序號,代碼為5位,宗地順序碼用00001~99999表示,在相應的宗地特征碼后順序編碼。
過去,開展城鎮地籍調查,一般在調查階段采用人工的方式進行編號,系統地對宗地自動進行編號的研究較少。目前,常見的商品軟件一般采用帶狀法實現自動編號[2],用定位點位置代替宗地位置,并通過設定間距來劃分條帶,然后在條帶內依據橫坐標實現從左到右的排序。這種編號法清晰簡單,容易實現,但是對地塊形狀敏感性較差,會出現編號跳躍,但跳躍范圍不大,總體效果比較好。
改進的編號方法如改進錐形編號法、遞歸分解編號法[3],優先考慮了編號地塊的連續性,方向關系定位比較準確,解決了一些復雜形狀地塊的空間關系,編號更合理,但是涉及到地塊空間關系的判斷,不可避免的要進行復雜繁瑣的圖形運算,在處理大量地塊的編號時,其編號效率就難以令人滿意了。
對于城鎮地籍數據庫升級來說,宗地往往都以數萬或數十萬計,界址點以數十萬或數百萬級。以縣為單位開展的村莊地籍調查往往有數十萬個宗地和數百萬個界址點。面對海量地塊,如果在編號運算時要進行大量的空間關系的運算,編號效率是不能接受的。常規的帶狀編號法由于涉及到圖形運算,其編號效率仍然不夠理想,在處理大量宗地和界址點上常常需要花費很長時間。例如,我們使用某采用帶狀編號法的商品軟件對約10萬個宗地進行編號時,用時達數小時。
本文在遵循基本編號原則的基礎上,主要把重點放在提高編號效率上,在帶狀法編號思路的基礎上,將空間排序巧妙的轉換為利用SQL的排序查詢來實現,編號效率實現了數量級的提高。
由于涉及到對圖形的讀寫,為了實現更快的讀取速度,我們將ArcSDEGeodatabase數據庫中的圖形數據全部導出為本地Personal Geodatabase數據庫,所有的處理和轉換直接針對本地數據庫操作[4]。圖形數據處理程序編寫全部在Arc Map環境中以VBA+Arc Objects的本地開發模式進行[5][6]。
宗地統一編號不僅涉及到圖形運算,還要修改圖形及調查表的宗地編號等屬性信息。通過分析,我們發現影響宗地編碼速度的主要瓶頸在宗地圖形的空間排序和宗地號賦值,因此,需要在這兩個方面進行突破才能實現編號速度的大幅提升。
為了實現宗地的快速空間排序,我們讀取地籍子區內每個宗地面要素的FeatureID值和中心點或者外界矩形左上角點的縱、橫坐標寫入本地數據庫臨時表中,并采用合適的間距對縱坐標進行分行,然后直接用Select語句對臨時表中的記錄進行行號倒序、橫坐標正序的查詢就可以實現宗地從上之下、從左到右的快速排序。
對宗地圖形要素的宗地號賦值,使用ADO連接本地數據庫,依據FeatureID值用Update語句逐個更新Personal Geodatabase中宗地層要素表記錄即可,試驗證明其比調用IFeature對象來修改宗地要素地籍號要快數十倍。
以“之”字形編號為例,核心算法主要包括以下三個步驟。
(1)第一步:遍歷地籍子區內的所有宗地,將宗地要素OID值、中心點坐標和所屬行號寫入臨時表Tempfor TB中。
Set p Query Filter=New Query Filter
p Query Filter.WhereClause= ″SSQY=″″&Trim(DjzqBh)
Set p FeatureCursor = p Featureclass.Search(p QueryFilter,False)
Set p Feature=pFeatureCursor.NextFeature
Do While Not p FeatureIs Nothing
Set p Area=p Feature.Shape
OID=p Feature.OID
X=p Area.Centroid.X
Hanghao=Int(p Area.Centroid.Y/30)‘行號,30為行距
sql= ″insert into Tempfor TB(OID,X,Hanghao)values(?&OID&?,? &X&?,?&Hanghao&?)″
Set rs=datacn.Execute(sql,1,adCmd T-ext)
Set rs=Nothing
Set pFeature=pFeatureCursor.NextFeature
Loop
(2)第二步:對臨時表Tempfor TB中的記錄根據行號倒序和橫坐標值正序進行SELECT查詢,實現對宗地從上到下、從左到右的編號方式。
sql=″SELECT OID,X,HanghaoFROM Tempfor TB order by Hanghaodesc,X″
rs.Opensql,datacn,adOpenForwardOnly,ad Lock ReadOnly
(3)第三步:根據查詢結果逐個更新宗地編號。
TBBH=1
'根據OID值對宗地逐個更新地籍號
Do While rs.EOF=False
sql2= ″update″&pZDFeatureclass.Alias Name&″set DJH=?&Trim(DjzqBh)&″GB″ &TBBH& ? where OBJECTID=″&rs!OID
Set rs2=datacn2.Execute(sql2,1,adCmd Text)
Set rs2=Nothing
rs.MoveNext
TBBH=TBBH+1
Loop
上述算法,稍加改動就可以實現“弓”字形順序流水編號。界址點、圖斑的編號規則和宗地類似,因此同樣可以采用上述算法實現快速統一編號。
由于盡量避免了圖形運算和讀寫,將編號中最耗時的空間排序和宗地號賦值過程都通過SQL語句操作本地數據庫來實現,故編號效率較高。在一臺較高配置的PC機上對約10萬個宗地全部進行重新統一編號用時不到3分鐘,對約54萬個界址點重新編號費時約11分鐘。雖然本算法不能做到像智能化編號方法那樣做到編號更加合理化,但是在遵循基本編號規則的前提下,在編號速度上做到了完勝,在批量處理大量宗地、圖斑的編號上具有一定的效率優勢。