于中偉
(1.沈陽市勘察測繪研究院,遼寧 沈陽 110014)
農(nóng)村土地承包經(jīng)營權(quán)確權(quán)登記的主要目的是解決承包地塊面積不準、空間位置不明、四至關系不清等問題,最終形成權(quán)屬合法、界址清楚、面積準確、圖數(shù)實地一致的農(nóng)村土地承包經(jīng)營權(quán)調(diào)查成果。農(nóng)村土地確權(quán)登記數(shù)據(jù)庫是開展農(nóng)村土地承包經(jīng)營權(quán)確權(quán)登記最重要的成果之一。確權(quán)登記數(shù)據(jù)庫主要包括用于農(nóng)村土地承包經(jīng)營權(quán)調(diào)查、確權(quán)登記的地理信息數(shù)據(jù)和權(quán)屬數(shù)據(jù),權(quán)屬數(shù)據(jù)又包括業(yè)務數(shù)據(jù)和權(quán)屬資料數(shù)據(jù)。NY/T 2539-2016《農(nóng)村土地承包經(jīng)營權(quán)確權(quán)登記數(shù)據(jù)庫規(guī)范》對數(shù)據(jù)庫的分層、圖層名稱、字段名稱以及約束信息等進行了嚴格定義,實現(xiàn)了數(shù)據(jù)庫成果的規(guī)范化和標準化。
農(nóng)村土地承包經(jīng)營權(quán)數(shù)據(jù)庫建設是先將入庫后的實地測量圖形數(shù)據(jù)與權(quán)屬調(diào)查信息進行掛接,形成公示結(jié)果和待解決記錄表;再根據(jù)公示反饋的信息修改數(shù)據(jù)庫,整理完善承包地塊屬性,形成界址信息;然后利用質(zhì)量檢查功能對數(shù)據(jù)庫進行檢查;最終形成無質(zhì)量問題的國家標準格式數(shù)據(jù)。
根據(jù)NY/T 2539-2016《農(nóng)村土地承包經(jīng)營權(quán)確權(quán)登記數(shù)據(jù)庫規(guī)范》,農(nóng)村土地確權(quán)登記標準數(shù)據(jù)庫包括地理信息數(shù)據(jù)和權(quán)屬數(shù)據(jù)共26個圖層。實際作業(yè)中,圖形地理信息成果主要包括地塊(DK)、界址點(JZD)、界址線(JZX)等圖層,權(quán)屬數(shù)據(jù)主要包括發(fā)包方(FBF)、承包方(CBF)、承包地塊信息(CBDKXX)、承包合同(CBHT)、家庭成員(CBF_JTCY)、承包經(jīng)營權(quán)證登記簿(CBJYQZDJB)等表格。本文著重討論如何在程序中實現(xiàn)數(shù)據(jù)庫圖形地理信息成果與權(quán)屬數(shù)據(jù)的自動掛接,并形成符合國家規(guī)范的數(shù)據(jù)庫。
1)為標準數(shù)據(jù)庫添加DKYBM過渡字段。為了方便地塊與村組填寫的CBDKXX表進行對應,地塊預編碼采用01001的編碼方式,而不是規(guī)范中要求的順序碼,其中01為承包方在村組中的順序碼,001為承包方所有的地塊順序碼。
2)將利用CASS或ArcGIS等繪圖軟件繪制的地塊圖層導入標準數(shù)據(jù)庫的DK圖層中,并將預編碼放入DK預編碼中,以實現(xiàn)圖形數(shù)據(jù)與屬性數(shù)據(jù)的掛接。針對DK圖層,根據(jù)地塊編碼規(guī)則按村組對所有地塊進行編碼,此時DK圖層中的每個要素均對應一個預編碼DKYBM和一個規(guī)范編碼DKBM。
3)順序讀入村組填寫的FBF表,CBF表和CBDKXX表,并將相關屬性信息入庫。發(fā)包方入庫時,僅涉及FBF表;承包方入庫時,共涉及CBF、CBF_JTCY、CBHT和CBJYQZDJB四個屬性表;執(zhí)行承包地塊入庫時,涉及DK圖層和CBDKXX表。承包地塊信息入庫后,可將DKYBM字段刪除。
4)生成JZD、JZX圖層,實現(xiàn)四至等屬性的自動識別錄入,并對數(shù)據(jù)庫進行檢查,形成國家標準格式的數(shù)據(jù)庫。
1)為了避免在讀取和保存Excel時不區(qū)別版本,本文引用了NetOffice控件,在程序中添加NetOffice.dll、ExcelApi.dll和VBIDEApi.dll引用,相關代碼為:
‘添加引用
using NetOffice.ExcelApi;
using NetOffice.ExcelApi.Enums;
‘初始化Excel實例,并打開工作簿
NetOffice.ExcelApi.Application application= new NetOffice.ExcelApi.Application();
Workbook workbook= application.Workbooks.Add(excelPath);
Worksheet worksheet= workbook.Worksheets[1] as Worksheet;
‘讀取普通文本單元格
string FBFMC=worksheet.Range("C8").Text.ToString();
‘針對數(shù)據(jù)序列,驗證單元格
char[] ch= new char[] { ',' };
string[] validation= worksheet.Range("D11").Validation.Formula1.Split(ch);
‘退出并釋放
application.Quit();
application.Dispose();
2)由于需將調(diào)查表格信息寫入或更新到mdb數(shù)據(jù)庫中,會多次執(zhí)行SQL語句,可將常用操作封裝成類,予以調(diào)用。例如,在Access Tools類中,包括以下字段和方法:
public OleDbConnection Conn;
public string ConnString; ‘鏈接字符串
DataTable SelectToDataTable(string SQL); ‘根據(jù)SQL返回DataTable數(shù)據(jù)表
OleDbDataAdapter SelectToOleDbDataAdapter(string SQL); ‘根據(jù)SQL返回OleDbDataAdapter
int ExecuteSQLNonquery(string SQL); ‘執(zhí)行SQL,適用于刪除、更新
AccessTools(string Dbpath); ‘構(gòu)造函數(shù),鏈接數(shù)據(jù)庫
void Close(); ‘關閉數(shù)據(jù)鏈接
3)在對DK圖層進行統(tǒng)一編碼時,首先需獲得DK圖層的幾何重心,可通過程序依次調(diào)用GP工具的FeatureToPoint和AddXY工具,將DK轉(zhuǎn)為點,并添加X、Y坐標。執(zhí)行后的DK_FeatureToPoint圖層即為DK圖層對應的幾何重心圖層,具有嚴格對應的ObjectID。采用GP調(diào)用FeatureToPoint工具的代碼為:
ESRI.ArcGIS.Geoprocessor.Geoprocessor gp= new Geoprocessor();
FeatureToPoint featureToPoint= new FeatureToPoint();
featureToPoint.in_features= mdbPath + "\DK";
featureToPoint.out_feature_class= mdbPath + "\DK_FeatureToPoint";
IGeoProcessorResult result=gp.Execute(featureToPoint,null) as IGeoProcessorResult;
然后獲取DK圖層的包絡線,即圖層的最小外接矩形。根據(jù)該包絡線構(gòu)建一定步長的正方形框,自左上角遍歷正方形框,同一個正方形框中的地塊僅比較幾何重心的橫向(東西)關系,從而可按自北向南、自西向東的順序?qū)λ械貕K進行編碼。執(zhí)行編碼賦值時,可直接采用SQL語句的方式,根據(jù)添加的POINT_X和POINT_Y字段設立條件關系,提高執(zhí)行效率。JZD圖層的編碼方法與之類似。部分關鍵代碼為:
IFeatureClass featureClass= featureWorkspace.OpenFeatureClass("DK");
IGeoDataset geoDataset= featureClass as IGeoDataset;
IEnvelope envelope= geoDataset.Extent; ‘獲得DK圖層的包絡線
double buchang= 50.0; ‘設置一定步長的正方形框
int xCount= Math.Ceiling((envelope.XMax-envelope.XMin) / buchang);
int yCount= Math.Ceiling((envelope.YMax-envelope.YMin) / buchang);
for (int i= 0; i < yCount; i++)
{
for (int j= 0; j < xCount; j++)
{
‘求出正方形框四角的坐標
xmin= envelope.XMin + j * buchang);
ymin= envelope.YMax-(i + 1) * buchang;
xmax= envelope.XMin + (j + 1) * buchang;
ymax= envelope.YMax-i * buchang;
sql= "select * from DK_FeatureToPoint WHERE POINT_X>=" + xmin.ToString() + " and POINT_X<" + xmax.ToString() + " and POINT_Y <=" + ymax.ToString() + " and POINT_Y >" + ymin.ToString();
dt= accessTools.SelectToDataTable(sql); ‘選中正方形框內(nèi)的所有點
foreach (DataRow row in dt.Rows)
{
list.Add(Convert.ToInt16(row["ORIG_FID"].ToString()),Convert.ToDouble(row["POINT_X"].ToString()));
}
‘按照X坐標進行排序,key值即為ObjectID
List<KeyValuePair<int, double>> lstorder= list.OrderBy(c=> c.Value).ToList();
}
} ‘再根據(jù)lstorder,采用SQL語句的update進行ZD的編碼更新操作
4)將圖形導入標準數(shù)據(jù)庫,并進行相關拓撲錯誤處理后,可進一步實現(xiàn)地塊四至的自動讀取。算法通過遍歷DK圖層中的要素,利用空間關系找出當前地塊的相鄰地塊,并根據(jù)相鄰地塊與當前地塊的幾何重心連線計算方位角;再根據(jù)方位角的大小判斷四至關系,并更新到地塊記錄的四至字段中。實踐證明,該方法自動讀取的成功率在90%以上。其部分代碼為:
‘遍歷DK圖層
IPoint gravityDK= new PointClass(); ‘用于存放DK要素的幾何重心
ISpatialFilter spatialFilter= new SpatialFilterClass(); ‘用于空間位置查詢
string dongzhi=””,xizhi=””,nanzhi=””,beizhi=””; ‘用于存放四至
foreach (DataRow rowDK in dtDK.Rows){
‘獲得當前DK要素
featureDK= featureClassDK.GetFeature(int.Parse(rowDK["OBJECTID"].ToString()));
‘利用SQL查詢方式從DK_FeatureToPoint表中獲得DK的幾何重心,比使用ArcEngine游標效率高
sql="select * from DK_FeatureToPoint where ORIG_FID="+rowDK["OBJECTID"].ToString();
dt= accessTools.SelectToDataTable(sql);
rowDK_FeatureToPoint=dt.Rows[0];
gravityDK.PutCoords(Convert.ToDouble(rowDK_FeatureToPoint["POINT_X"].ToString()),Convert.ToDouble(rowDK_FeatureToPoint["POINT_Y"].ToString()));
‘查找當前DK要素的相鄰地塊
spatialFilter.Geometry= featureDK.ShapeCopy;
spatialFilter.SpatialRel= esriSpatialRelEnum.esriSpatialRelIntersects;
featureCursor= featureClassDK.Search(spatialFilter, false);
feature= featureCursor.NextFeature();
while(feature!=null)
{
…
‘獲取相鄰要素的幾何中心并計算方位角,根據(jù)方位角判定四至并存入對應的字符串
feature= featureCursor.NextFeature();
}
featureDK.set_Value(feature.Fields.FindField("DKDZ"),dongzhi); ‘設置東至
…
‘釋放查詢游標featureCursor
System.Runtime.InteropServices.Marshal.ReleaseComObje ct(featureCursor);
}
1)由于FBF表、CBF表和CBDKXX表均由村組填寫,水平參差不齊,為了避免Excel在讀取或?qū)懭霐?shù)據(jù)庫時的異常報錯(或錯誤信息較多),在根據(jù)NY/T 2537-2014《農(nóng)村土地承包經(jīng)營權(quán)調(diào)查規(guī)程》設計數(shù)據(jù)庫模板時,可將某些字段的強制性要求設計為弱強制性,如相關必填字段可設計為空,限制長度的字段可先不做檢查,而在完成數(shù)據(jù)庫建設后統(tǒng)一執(zhí)行數(shù)據(jù)庫檢查程序。
2)在向村組下發(fā)FBF表、CBF表和CBDKXX表時,不應直接采取NY/T 2537-2014《農(nóng)村土地承包經(jīng)營權(quán)調(diào)查規(guī)程》中定義的相關表格樣式,如CBF表中的家庭成員列未包含是否共有人等字段,但數(shù)據(jù)庫中卻包含該字段。因此,應該根據(jù)NY/T 2539-2016《農(nóng)村土地承包經(jīng)營權(quán)確權(quán)登記數(shù)據(jù)庫規(guī)范》中的數(shù)據(jù)庫字段設計完整的表格,并在完成數(shù)據(jù)庫建設后根據(jù)NY/T 2537-2014《農(nóng)村土地承包經(jīng)營權(quán)調(diào)查規(guī)程》執(zhí)行相應表格規(guī)范和統(tǒng)一輸出。
3)在批量讀取執(zhí)行表格信息時,應具有一定的容錯能力。在某個Excel讀取或?qū)懭胧『?,應自動跳過,并在批量執(zhí)行結(jié)束后,進行錯誤信息提示。在對數(shù)據(jù)庫表執(zhí)行增加、更新、刪除等遍歷操作時,考慮到執(zhí)行效率,應盡量使用SQL語句的方式,并在操作完成后,及時對表進行關閉,以避免出現(xiàn)“無法打開表格”等異常。在利用ArcEngine執(zhí)行遍歷操作時,應及時釋放游標。
在沈陽市開展農(nóng)村土地承包經(jīng)營權(quán)確權(quán)登記試點的過程中,由作業(yè)單位實際負責承包地塊的測繪工作,并出具具體的CBF、FBF、CBDKXX等表格樣式;由村組負責完成表格填寫和權(quán)屬資料整理。結(jié)合該工作模式,本文利用Esri公司提供的ArcEngine二次開發(fā)技術,實現(xiàn)了表格權(quán)屬信息與測繪圖形信息的自動關聯(lián),有效調(diào)動了村組在信息調(diào)查方面的優(yōu)勢和動力,不僅提高了工作效率,而且節(jié)約了作業(yè)成本,在實際作業(yè)中取得了較好的效果。