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