梁志強,叢喜東
(1.黑龍江省自然資源權(quán)益調(diào)查監(jiān)測院,黑龍江 哈爾濱 150080;2.黑龍江省生態(tài)研究所,黑龍江 哈爾濱 150080)
1)2021年5月國家林業(yè)和草原局發(fā)布《林草濕數(shù)據(jù)與第三次全國國土調(diào)查數(shù)據(jù)對接融合技術(shù)指南》(以下簡稱“指南”)中指出,充分發(fā)揮第三次全國國土調(diào)查(以下簡稱“三調(diào)”)成果在國土空間管理中的“統(tǒng)一底版”作用,依據(jù)“三調(diào)”成果,理清林地、草地、濕地的現(xiàn)狀范圍界線,解決地類交叉重疊問題,融合林地、草地、濕地等資源信息,優(yōu)化國家級公益林范圍,將國家級公益林落到山頭地塊,形成與“三調(diào)”無縫銜接的林草資源圖(含濕地),支撐森林生態(tài)效益補償制度,為林草生態(tài)網(wǎng)絡(luò)感知系統(tǒng)建設(shè),開展林草資源及生態(tài)狀況監(jiān)測,加強林草資源科學(xué)保護、系統(tǒng)修復(fù)和合理利用,推進林草治理體系和治理能力現(xiàn)代化提供支撐[1]。
2)指南中明確了目的、任務(wù)、原則要求、技術(shù)流程、工作成果、質(zhì)量管理等內(nèi)容,并對落界經(jīng)營界線和小班細化做了具體說明。指南中指出經(jīng)營界線存在誤差性質(zhì)偏移,無實質(zhì)改變的情況下,應(yīng)保持與三調(diào)界線重合;小班進行分割及碎班合并,對于區(qū)劃尺度不同或區(qū)劃誤差,引起小班界線相互間里出外進等情況,可根據(jù)影像特征和現(xiàn)地情況,對小班邊界進行修正或合并小班,原則上應(yīng)以較高區(qū)劃精度結(jié)果為準。
3)在具體的對接融合過程中由于林草濕數(shù)據(jù)與三調(diào)數(shù)據(jù)在區(qū)劃精度上存在一定的差異,常規(guī)GIS軟件,對容差范圍內(nèi)的現(xiàn)象不視為錯誤,故存在邊線或折點無法重疊情況,現(xiàn)將具體問題進行分析,并針對問題提出解決思路與方法,最終形成滿足對接融合要求的修正數(shù)據(jù)。
1)采用GIS軟件,將林草濕圖層分別以縣為單位,進行關(guān)鍵字賦值,用于圖斑融合后掛接屬性數(shù)據(jù)[2],為加快圖形融合數(shù)據(jù)處理速度,可保留適量相應(yīng)圖層的影響圖斑邊界處理的重要屬性因子,其他屬性因子則在對接融合后進行掛接,如三調(diào)圖斑保留標識碼、地類、權(quán)屬單位名稱、坐落單位名稱、圖斑面積等,林地保留單位名稱、林班、小班、地類等,濕地保留斑塊號、斑塊名稱、濕地類型等,草地保留斑塊編號、草地類型等;
2)將統(tǒng)一空間參考的三調(diào)數(shù)據(jù)圖斑與林地、濕地、草地圖斑分別進行聯(lián)合操作,形成相應(yīng)的對接融合圖層;對不滿足最小區(qū)劃面積條件的細碎圖斑進行合并,合并后圖斑不可跨三調(diào)圖斑,這部分可通過技術(shù)手段自動合并;對大于最小區(qū)劃面積的圖斑,需要采用人工方式根據(jù)實際情況進行合并、切割、保留等處理;圖斑融合完畢后進行空間拓撲、質(zhì)檢、修正,掛接重要屬性因子,進行數(shù)據(jù)統(tǒng)計分析,形成空間數(shù)據(jù)、專題圖、統(tǒng)計分析表、分析報告等驗收成果。
在空間數(shù)據(jù)對接融合過程中,由于第三次全國國土調(diào)查數(shù)據(jù)矢量圖在GIS軟件中XY容差為0.0001m,通過分析三調(diào)數(shù)據(jù)圖斑折點坐標發(fā)現(xiàn),所有折點坐標均進行了處理,采用了4舍6入的方式,保留5位小數(shù)。而以往林草濕數(shù)據(jù)圖斑的生產(chǎn)過程中采用GIS軟件默認XY容差為0.001m,折點坐標采用默認保留小數(shù)位,二者在容差及坐標精度方面存在一定差異。在圖斑對接融合過程中,在容差范圍內(nèi)二者邊界雖然是一致的,但在放大比例尺到一定范圍時,二者將出現(xiàn)不完全重合的現(xiàn)象,即邊線或折點存在位置偏移,且該偏移值在GIS軟件的容差范圍內(nèi),圖斑進行編輯操作時無法實現(xiàn)國土圖斑的折點捕捉,從而修改操作難度大,且修改量大。如圖1對接融合圖斑與三調(diào)數(shù)據(jù)圖斑邊界及折點不重合現(xiàn)象示例所示。
圖1 對接融合圖斑與三調(diào)圖斑邊界及折點不重合示例Fig.1 Example of the Mismatch between the Boundaries and Vertices of the Butt Fusion Patch and Tritone Patch
針對上述對接融合數(shù)據(jù)所產(chǎn)生的情況,可以通過遍歷對接融合數(shù)據(jù)圖斑折點獲取距離三調(diào)圖斑的最近折點或最近邊線的垂點的方式實現(xiàn)對接融合數(shù)據(jù)圖斑折點坐標的修改,使對接融合數(shù)據(jù)圖斑邊線及折點與國土數(shù)據(jù)圖斑邊線及折點保持完全一致。具體方法步驟如下:
1)獲取對接融合數(shù)據(jù)圖斑邊線的所有折點。將對接融合數(shù)據(jù)增加一個唯一值字段并賦值,用于圖斑修正后數(shù)據(jù)驗證及屬性數(shù)據(jù)掛接。
2)獲取該對接融合數(shù)據(jù)圖斑對應(yīng)的國土圖斑邊線折點。對接融合數(shù)據(jù)圖斑的標識碼(BSM)與三調(diào)數(shù)據(jù)圖斑標識碼應(yīng)一致,可通過BSM篩選三調(diào)數(shù)據(jù)圖斑。如標識碼不一致會導(dǎo)致修正折點坐標值計算有誤。
3)獲取對接融合數(shù)據(jù)圖斑折點與對應(yīng)三調(diào)數(shù)據(jù)圖斑距離最近的折點。逐點遍歷對接融合數(shù)據(jù)圖斑折點,查找與該折點距離最近的對應(yīng)的三調(diào)數(shù)據(jù)圖斑折點,且該距離小于0.0005m,即視為該對接融合數(shù)據(jù)圖斑折點應(yīng)與三調(diào)數(shù)據(jù)圖斑折點為同一點,對接融合數(shù)據(jù)圖斑折點的坐標用該查找到的三調(diào)數(shù)據(jù)圖斑折點坐標進行替換。
4)獲取距離對接融合數(shù)據(jù)圖斑折點最近的國土數(shù)據(jù)圖斑邊線上的線段,取點到線段的垂點作為折點。當未找到滿足具體誤差范圍(<0.0005m)的最近折點,說明該對接融合數(shù)據(jù)圖斑折點誤差限范圍內(nèi)無三調(diào)圖斑折點,此時需查找與該折點最近的三調(diào)圖斑邊線上的線段,且該點與線段兩個端點的距離與線段長度的誤差也在0.0005m范圍內(nèi),即該點位于線段的兩個端點之間。獲取該對接融合數(shù)據(jù)圖斑折點到三調(diào)圖斑線段的垂足點,且垂足點與折點距離在誤差限范圍內(nèi),將垂點坐標替換對接融合數(shù)據(jù)圖斑的折點坐標,也可以獲取對接融合數(shù)據(jù)折點處線段與三調(diào)圖斑最近線段的交點作為替換坐標值,通過分析垂點與交點誤差很小,故取垂點坐標即可。
5)創(chuàng)建新的矢量圖層,將對接融合數(shù)據(jù)的每個圖斑折點按照重新計算的折點坐標值重新生成圖斑要素。
通過圖斑的折點修正方法實現(xiàn)對接融合數(shù)據(jù)與三調(diào)圖斑邊界的重合操作,圖斑的折點遍歷、點間距、點線距、垂點等計算采用Visual Studio開發(fā)環(huán)境、C#語言、GDAL開源技術(shù)進行實現(xiàn)。
1)GDAL開源技術(shù)。GDAL(Geospatial Data Abstraction Library,地理空間數(shù)據(jù)抽象庫)是一個在X/MIT許可協(xié)議下的開源空間數(shù)據(jù)(柵格數(shù)據(jù)和矢量數(shù)據(jù))轉(zhuǎn)換庫,包括讀取、寫入、轉(zhuǎn)換、處理各種柵格和矢量數(shù)據(jù)格式[3],可通過GDAL讀取矢量圖斑要素屬性及幾何圖形坐標節(jié)點等空間及屬性信息。在Visual Studio開發(fā)環(huán)境中,可加載GDAL的DLL類庫文件實現(xiàn)對矢量圖層及圖斑的具體操作。
2)通過C#編碼的方式實現(xiàn)軟件功能的開發(fā)。軟件工具的主要功能是加載對接融合和三調(diào)成果矢量數(shù)據(jù),自動讀取對接融合數(shù)據(jù)圖斑的邊線折點及對應(yīng)三調(diào)圖斑的邊線或折點,通過計算獲取對接融合數(shù)據(jù)圖斑的每個折點的修正值,并自動創(chuàng)建新的圖斑要素,要素包含對接融合數(shù)據(jù)圖斑的關(guān)鍵字及三調(diào)圖斑標識碼字段。對接融合數(shù)據(jù)修正后結(jié)果可通過關(guān)鍵字及BSM進行相應(yīng)林草濕數(shù)據(jù)與三調(diào)數(shù)據(jù)的屬性連接。
軟件實現(xiàn)的部分關(guān)鍵代碼如下:
//計算點與點距離
private double GetMinDistanceP2P(double p1x, double p1y, double p2x, double p2y)
{
return Math.Pow((Math.Pow((p1x - p2x), 2) + Math.Pow((p1y - p2y), 2)), 0.5);
}
//計算點到線段的距離
private double GetMinDistanceP2L(double pX, double pY, double segAX, double segAY, double segBX, double segBY)
{
double product_ap_ab = (pX - segAX) * (segBX - segAX) + (pY - segAY) * (segBY - segAY);
double product_ab_ab = (segBX - segAX) * (segBX - segAX) + (segBY - segAY) * (segBY - segAY);
double r = product_ap_ab / product_ab_ab;
if (r >=1)
{
return Math.Sqrt((pX-segBX)*(pX-segBX) + (pY - segBY) * (pY - segBY));
}
else if (r <=0)
{
return Math.Sqrt((pX-segAX)*(pX-segAX) + (pY - segAY) * (pY - segAY));
}
else
{
double vector_ac_X = r * (segBX - segAX);
double vector_ac_Y = r * (segBY - segAY);
double vector_cp_X = pX - segAX - vector_ac_X;
double vector_cp_Y = pY - segAY - vector_ac_Y;
return Math.Sqrt(vector_cp_X * vector_cp_X + vector_cp_Y * vector_cp_Y);
}
}
//獲取點到線段的垂足坐標,x1、y1、x2、y2為線段的端點坐標
private double[] GetVerticalAixP2L (double x0, double y0, double x1, double y1, double x2, double y2)
{
double[] ret = new double[] { 0, 0 };
if (x2 - x1 == 0)
{
ret[0] = x2;
ret[1] = y0;
}
else
{
//計算斜率
double k1 = (y2 - y1) / (x2 - x1);
// 垂足x坐標
double x = (Math.Pow(k1, 2) * x1 + (k1 * (y0 - y1)) + (x0)) / (Math.Pow(k1, 2) + 1);
ouble y = (k1) * (x - (x1)) + (y1);
ret[0] = x;
ret[1] = y;
}
return ret;
}
(3)通過修正前后數(shù)據(jù)比對分析。如圖3對接融合圖斑邊界及折點修正前后對比圖所示,紅色邊線為對接融合數(shù)據(jù)的修正前圖斑邊線,紫色邊線為修正后邊線,黑色邊線為三調(diào)圖斑邊線,通過對比圖可以看出修正后邊線與三調(diào)數(shù)據(jù)圖斑邊線及折點完全一致,并通過對某鄉(xiāng)鎮(zhèn)16000多個圖斑進行驗證,修正前后對接融合數(shù)據(jù)的面積、周長等均與對接融合數(shù)據(jù)圖斑未修正前保持基本一致,其修正后結(jié)果滿足數(shù)據(jù)生產(chǎn)和成果質(zhì)量要求。
圖3 對接融合圖斑邊界及折點修正前后對比Fig.3 Contrast before and after the Patch Boundary and Vertex Correction of the Butt Fusion Pattern