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