陳麗金
(福建東辰綜合勘察院,福建 福州 350001)
地籍調(diào)查是依照國(guó)家相關(guān)法律法規(guī),通過(guò)地籍測(cè)繪和權(quán)屬調(diào)查,確定宗地的權(quán)屬狀態(tài)、位置坐落、界址分布、宗地面積、宗地用途等信息,并形成一系列調(diào)查表格、圖件、數(shù)據(jù)庫(kù)等信息成果,為土地登記和發(fā)證提供依據(jù)的一項(xiàng)重要基礎(chǔ)工作[1]。宗地是地籍調(diào)查的基本單元,是指由封閉的權(quán)屬線所包圍的地塊或空間,構(gòu)成宗地的邊界線稱為界址線,而界址線的轉(zhuǎn)折點(diǎn)稱為界址點(diǎn),因此可以說(shuō),界址點(diǎn)、界址線唯一確定了宗地的空間位置[2]。
在地籍調(diào)查中,地籍圖和地籍調(diào)查表是兩類非常重要的成果,地籍圖是以特定的投影、比例、符號(hào)系統(tǒng)將地籍要素表示在地圖中,反映各宗地的位置分布和空間關(guān)系的圖件,CASS是地籍調(diào)查中應(yīng)用非常廣泛的制圖軟件[3]。地籍調(diào)查表是以表格的形式記錄宗地相關(guān)屬性信息的載體,由封面、宗地基本信息表、界址信息表等部分構(gòu)成,其中,界址信息表中記錄界址點(diǎn)號(hào)、界址間距等界址描述信息[4]。由于地籍圖中已經(jīng)記錄了宗地各界址點(diǎn)的坐標(biāo),因此可以利用地籍圖中的相關(guān)信息自動(dòng)生成界址信息表。本文將討論CASS軟件繪制的地籍圖中批量轉(zhuǎn)出界址信息的方法。
CASS地籍圖中宗地、界址線、界址點(diǎn)通過(guò)宗地代碼進(jìn)行關(guān)聯(lián),對(duì)于同一宗地,其界址點(diǎn)編號(hào)自宗地西北角從1開始順時(shí)針進(jìn)行編號(hào),如圖1所示。
圖1 地籍圖中的界址點(diǎn)編號(hào)
CASS提供了兩種方式批量轉(zhuǎn)出界址信息,一種是通過(guò)“輸出宗地屬性”工具將所有宗地的權(quán)屬信息轉(zhuǎn)出到mdb數(shù)據(jù)庫(kù)中,該數(shù)據(jù)庫(kù)包含zdinfo、jzdinfo、jzxinfo三個(gè)表,分別存儲(chǔ)宗地、界址點(diǎn)、界址線屬性信息。在jzxinfo表中QDH和ZDH分別記錄界址線的起止界址點(diǎn)點(diǎn)號(hào),然而該編號(hào)是以地籍子區(qū)為單位而不是以宗地為單位進(jìn)行順序編號(hào),與圖面表達(dá)不一致,如圖2所示。
圖2 CASS中批量轉(zhuǎn)出的jzxinfo表的界址點(diǎn)號(hào)
另一種方式是通過(guò)“繪制地籍表格”菜單組中的“界址點(diǎn)成果表(excel)”導(dǎo)出界址信息,以excel方式存儲(chǔ),每宗地的界址信息存儲(chǔ)在一個(gè)表單(sheet)中,如圖3所示。該種方式中的界址點(diǎn)號(hào)仍以地籍子區(qū)為單位進(jìn)行順序編號(hào)。此外,如果宗地?cái)?shù)量較多,該種方式導(dǎo)出界址信息時(shí)軟件容易崩潰,無(wú)法將所有宗地的界址信息導(dǎo)出。
圖3 CASS中批量轉(zhuǎn)出的界址點(diǎn)成果表
上述兩種方式轉(zhuǎn)出的界址信息的共同點(diǎn)是界址點(diǎn)無(wú)法按宗地進(jìn)行從1開始編號(hào),本文探索一種基于CASS中權(quán)屬文件的界址信息批量轉(zhuǎn)出方式。
首先,利用CASS軟件中的“權(quán)屬文件生成”菜單組中的“由界址線生成”,指定一條閉合線,可將內(nèi)部所有宗地的界址信息導(dǎo)出到外部后綴格式為.qs的文本文件中,用記事本打開該文件,內(nèi)容格式如圖4所示。文件中,每宗地包含一組信息,第一行為宗地代碼,第二行為權(quán)利人名稱,第三行為地類代碼,第四行開始每三行為一個(gè)界址點(diǎn)信息,包含點(diǎn)號(hào)和橫縱坐標(biāo)值,宗地信息以“E,宗地面積”作為最后一行,然后繼續(xù)下一宗地的信息組,直到最后一宗地,再以“E”結(jié)束權(quán)屬文件。
圖4 權(quán)屬文件格式
權(quán)屬文件中,界址點(diǎn)以地籍子區(qū)為單位從小到大編號(hào),對(duì)于單宗地,從西北角開始按順時(shí)針?lè)较蚓幪?hào)。例如,某地籍子區(qū)第一宗地的界址點(diǎn)編號(hào)為J1-J5,第二宗地的界址點(diǎn)號(hào)為J6-J12,以此類推。在地籍調(diào)查表中,每一宗地的界址點(diǎn)編號(hào)一般從西北角開始順時(shí)針從1開始編號(hào),因此,需要對(duì)上述權(quán)屬文件(.qs)進(jìn)行解析處理,對(duì)每宗地的界址點(diǎn)重新進(jìn)行編號(hào)即可。算法步驟如下:
(1)讀取權(quán)屬文件,將所有行的內(nèi)容存儲(chǔ)在行信息數(shù)組中。
(2)創(chuàng)建宗地信息動(dòng)態(tài)數(shù)組,數(shù)組元素為宗地信息,宗地信息元素包含宗地代碼屬性和界址點(diǎn)動(dòng)態(tài)數(shù)組,界址點(diǎn)數(shù)組元素包含界址點(diǎn)x,y坐標(biāo)值。
(3)遍歷行信息數(shù)組,讀取并記錄第一行宗地代碼,存入當(dāng)前宗地元素的宗地代碼屬性。
(4)跳3行讀取原始界址點(diǎn)號(hào),如果不是以“E,”開頭,則記錄下面2行的坐標(biāo)值,存入當(dāng)前宗地元素界址點(diǎn)數(shù)組。
(5)重復(fù)執(zhí)行步驟(4),直到遇到“E,”,說(shuō)明本宗地信息組結(jié)束。轉(zhuǎn)入步驟(3),繼續(xù)讀取下一宗地信息。
(6)重復(fù)執(zhí)行步驟(3)到步驟(5),直到所有行信息讀取結(jié)束。
(7)創(chuàng)建一個(gè)csv文件用于存儲(chǔ)界址信息,每行用于存儲(chǔ)一條界址線信息,包括宗地代碼、起始界址點(diǎn)號(hào)、終止界址點(diǎn)號(hào)、界址線長(zhǎng)度四個(gè)字段信息。
(8)遍歷上述宗地信息動(dòng)態(tài)數(shù)組,讀取每一宗地的宗地代碼屬性和界址點(diǎn)動(dòng)態(tài)數(shù)組,界址點(diǎn)編號(hào)從1開始續(xù)編,相鄰兩個(gè)界址點(diǎn)構(gòu)成一條界址線(最后一個(gè)點(diǎn)與第一個(gè)點(diǎn)閉合),計(jì)算其直線距離即為界址線長(zhǎng)度,存入界址信息文件。
(9)直到宗地信息動(dòng)態(tài)數(shù)組遍歷結(jié)束,關(guān)閉界址信息文件,轉(zhuǎn)換結(jié)束。
用C#語(yǔ)言對(duì)上述算法進(jìn)行編程實(shí)現(xiàn),核心代碼如下所示:
private void ConvertQS(string qsFile,string result)
{
string zddm = "";
string[]lines = File.ReadAllLines(qsFile, Encoding.Default);//行信息數(shù)組
lines = lines.Take(lines.Length-1).ToArray();//去掉最后一行結(jié)束標(biāo)記(E)
int line_count = lines.Length;//行數(shù)
int lineIndex = 0;//行序號(hào)
List
while(lineIndex < line_count)//遍歷行信息數(shù)組
{
zddm = lines[lineIndex];//第一行為宗地代碼
ZDInfo zdInfo = new ZDInfo(zddm);
lineIndex += 3;//轉(zhuǎn)到界址點(diǎn)記錄處
string jzp_no = lines[lineIndex];//原始界址點(diǎn)點(diǎn)號(hào)
//未遇到E,表示本宗地界址點(diǎn)未遍歷結(jié)束,記錄本界址點(diǎn)信息
while(!jzp_no.StartsWith("E,"))
{
string x = lines[lineIndex + 1];
string y = lines[lineIndex + 2];
zdInfo.jzs.Add(new JZInfo(x, y));//當(dāng)前界址點(diǎn)存入宗地信息
lineIndex += 3;//每個(gè)點(diǎn)有3行信息
jzp_no = lines[lineIndex];//繼續(xù)遍歷本宗地界址點(diǎn)
}
zdInfos.Add(zdInfo)//本宗地遍歷結(jié)束,存入宗地信息數(shù)組
lineIndex++;//轉(zhuǎn)入下一宗地
}
//遍歷宗地信息動(dòng)態(tài)數(shù)組進(jìn)行界址點(diǎn)重編號(hào)
string[]contents = zdInfos.OrderBy(item => item.zddm).ToList().Select(zdInfo =>
{
StringBuilder sb = new StringBuilder();
//遍歷當(dāng)前宗地界址點(diǎn)動(dòng)態(tài)數(shù)組,相鄰兩點(diǎn)構(gòu)成一條界址線(最后一點(diǎn)與起點(diǎn)閉合)
for(int i = 1, len = zdInfo.jzs.Count; i <= len; i++)//對(duì)每一宗地的界址點(diǎn)從1開始序編
{
string start = string.Format("J{0}", i);
string end = i != len ? string.Format("J{0}", i + 1): "J1";
//計(jì)算兩點(diǎn)之間的直線距離
JZInfo startP = zdInfo.jzs[i-1];
JZInfo endP = zdInfo.jzs[i != len ? i : 0];
string dis = Math.Sqrt(Math.Pow(startP.x-endP.x, 2)+ Math.Pow(startP.y-endP.y, 2)).ToString("F3");
sb.AppendLine(string.Format("{0},{1},{2},{3}", zdInfo.zddm, start, end, dis));
}
return sb.ToString().TrimEnd(new char[]{ ‘ ’, ‘ ’ });
}).ToArray();
//寫入結(jié)果文件
File.WriteAllText(result, "宗地代碼,起始點(diǎn)號(hào),終止點(diǎn)號(hào),界址線長(zhǎng)度 " + string.Join(" ", contents), Encoding.Default);
}
運(yùn)行上述代碼對(duì)原始權(quán)屬文件進(jìn)行處理,得到如圖5所示結(jié)果,可以看出,每一宗地的界址點(diǎn)號(hào)已從1開始編碼,并自動(dòng)計(jì)算得到每條界址線的長(zhǎng)度。在地籍圖中對(duì)宗地原始的界址點(diǎn)號(hào)和界址線的長(zhǎng)度
圖5 轉(zhuǎn)換結(jié)果
進(jìn)行了比對(duì),轉(zhuǎn)換結(jié)果中相鄰界址點(diǎn)的編號(hào)保持了原有的相對(duì)關(guān)系,且界址線長(zhǎng)度也與地籍圖上一致,驗(yàn)證了該方法的可行性。在該結(jié)果的基礎(chǔ)上可以很容易地進(jìn)行地籍調(diào)查表中界址信息的格式化輸出以及數(shù)據(jù)入庫(kù)等其他轉(zhuǎn)化,本文不做深入闡述。