李朝奎,駱文芳,張 強(qiáng),嚴(yán)雯英
(1. 湖南科技大學(xué) 地理空間信息湖南省工程實(shí)驗(yàn)室,湖南 湘潭 411201;2. 湖南科技大學(xué) 地球空間信息科學(xué)研究中心,湖南 湘潭 411201)
對(duì)于大部分GIS軟件而言,數(shù)據(jù)多以矢量形式存在,矢量曲線(xiàn)的綜合是地圖制圖綜合非常重要的內(nèi)容之一[1]。曲線(xiàn)綜合的關(guān)鍵是在保持原曲線(xiàn)基本形態(tài)特征的情況下,刪除那些次要的小彎曲,并同時(shí)保持彎曲特征轉(zhuǎn)折點(diǎn)的精確性和不同地段彎曲程度的對(duì)比[2]。隨著制圖綜合技術(shù)的不斷發(fā)展,已經(jīng)出現(xiàn)了各種各樣的曲線(xiàn)化簡(jiǎn)算法[3-5],如D-P算法、Li-Openshaw算法和James算法等,這些算法都是通過(guò)保留某些相對(duì)重要的特征點(diǎn)而刪除矢量曲線(xiàn)上的某些坐標(biāo)點(diǎn)來(lái)進(jìn)行化簡(jiǎn)的。然而矢量曲線(xiàn)并不僅僅是點(diǎn)的集合,它更是一種具有幾何形態(tài)的地理要素的表達(dá)。因此,矢量曲線(xiàn)的化簡(jiǎn)綜合不是簡(jiǎn)單的點(diǎn)的取舍操作,而應(yīng)充分考慮曲線(xiàn)的彎曲特征,顧及曲線(xiàn)表達(dá)的地理語(yǔ)義。
曲線(xiàn)形態(tài)的基本結(jié)構(gòu)單元?jiǎng)澐址椒ê芏?,相?duì)其他曲線(xiàn)結(jié)構(gòu)單元,彎曲更易于被人們理解和接受,按彎曲單元進(jìn)行曲線(xiàn)劃分符合認(rèn)知規(guī)律[6]。只要矢量曲線(xiàn)的彎曲結(jié)構(gòu)描述清楚,線(xiàn)狀要素綜合則表現(xiàn)為由低層小彎曲到上層大彎曲的化簡(jiǎn)、合并、刪除過(guò)程,從而能夠保證曲線(xiàn)整體結(jié)構(gòu)特征不被破壞,同時(shí)曲線(xiàn)低層細(xì)節(jié)又得到簡(jiǎn)化。本文對(duì)矢量曲線(xiàn)彎曲識(shí)別的幾種常用算法進(jìn)行介紹,并在Visual Studio 2008和ArcEngine 9.3基礎(chǔ)上編程對(duì)各種識(shí)別算法進(jìn)行實(shí)例驗(yàn)證。
通視性是指在一個(gè)簡(jiǎn)單彎曲內(nèi),第一個(gè)點(diǎn)到該彎曲上其他點(diǎn)的任一直線(xiàn)都與彎曲曲線(xiàn)不相割?;谕ㄒ曅缘膹澢惴枋鰹椋涸O(shè)點(diǎn)i、j是曲線(xiàn)中任意點(diǎn),存在i+1≤j≤n,其中點(diǎn)i為某段彎曲的起點(diǎn),Li,j是點(diǎn)i與點(diǎn)j連接的線(xiàn)段,為對(duì)應(yīng)的向量。在同一彎曲中,存在所有的,即它們的向量叉乘存在相同的方向性,即在同一彎曲中向量總會(huì)在向量和向量中間。當(dāng)與具有不同的正負(fù)性時(shí),表示點(diǎn)j 為當(dāng)前彎曲的結(jié)束點(diǎn)和第二個(gè)彎曲的起始點(diǎn),見(jiàn)圖1。
基于凹凸性的彎曲識(shí)別方法分為以下幾個(gè)步驟:①探查拐點(diǎn);②將曲線(xiàn)起始點(diǎn)和所有拐點(diǎn)按其在曲線(xiàn)中的先后順序依次放進(jìn)分界點(diǎn)序列中;③根據(jù)分界點(diǎn)序列劃分彎曲。其中,拐點(diǎn)的查找方法有以下兩種:①通過(guò)邊線(xiàn)上任一點(diǎn)向兩邊相鄰的點(diǎn)作線(xiàn)段,兩線(xiàn)段的張角小于180°,該點(diǎn)可認(rèn)為是凸部點(diǎn);大于180°,則是凹部點(diǎn),等于180°,則該點(diǎn)處于平部。②曲線(xiàn)上點(diǎn)的切向繞行方向在拐點(diǎn)處發(fā)生變化。在拐點(diǎn)一側(cè)為順時(shí)針旋轉(zhuǎn),在另一側(cè)則順時(shí)針轉(zhuǎn),因而可以采用向量叉乘的方法來(lái)判斷。其核心代碼如下:
//構(gòu)建向量
fv = new Vector(pnts[i–1], pnts[i]);
tv = new Vector(pnts[i], pnts[i+1]);
//向量叉乘結(jié)果是否大于0
flag = Vector.CrossProduct(fv, tv) > 0 ? true : false;
//如果當(dāng)前向量叉乘結(jié)果與之前向量叉乘結(jié)果相異,則取當(dāng)前點(diǎn)為特征點(diǎn)
if (curFlag != flag)
{
if (pntCol.PointCount> 2)
{
(bend as IriverLine).Polyline = pntCol as Ipolyline;
bends.Add(bend);
featPnts.Add(pnts[i]); //添加特征點(diǎn)
bend = new Bend();
pntCol = new PolylineClass();
pntCol.AddPoint(pnts[i].ToEsriPoint(),ref missing, ref missing);
}
curFlag = flag;
}
基于曲率極大值的彎曲劃分方法如下:首先,計(jì)算點(diǎn)pi-1和點(diǎn)pi的切線(xiàn)角αi-1和αi;其次,計(jì)算由點(diǎn)pi-1和點(diǎn)pi組成的直線(xiàn)段li-1,i的長(zhǎng)度;再次,求取點(diǎn)pi-1和pi的平均曲率ki-1,將ki-1作為點(diǎn)pi-1的曲率;最后,按照上面的方法依次計(jì)算每個(gè)點(diǎn)的曲率,算出所有曲率極大值(絕對(duì)值),如圖2所示。其核心代碼如下:
//求當(dāng)前點(diǎn)與前一點(diǎn)的平均曲率
Cur = Math.Round(Math.Abs(pnts[i].Tangent -pnts[i - 1].Tangent) / PointUtil.GetDistance(pnts[i], pnts[i- 1]),5);
flag = forCur> Cur ? false : true;//與之前的平均曲率的大小對(duì)比
forCur = Cur;
//如果當(dāng)前曲率對(duì)比為否,之前曲率對(duì)比為真,也就是曲率極大值所在
if (curFlag&& !flag)
{
//第i-1個(gè)是極大值,添加特征點(diǎn)
featPnts.Add(pnts[i -1]);
//生成彎曲
IPointCollection polyline = new PolylineClass();
for (int j = startIndex; j < i; j++)
{
polyline.AddPoint(pnts[j].ToEsriPoint(), ref missing,ref missing);
}
(bend as IRiverLine).Polyline = polyline as IPolyline;
bends.Add(bend);
//重新初始化
bend = new Bend();
startIndex = i - 2;
}
curFlag = flag;
實(shí)例設(shè)計(jì)的目的是通過(guò)實(shí)踐來(lái)查找彎曲特征并檢驗(yàn)各種彎曲識(shí)別方法的可行性,從而分析各種識(shí)別方法的優(yōu)缺點(diǎn)。該實(shí)驗(yàn)以矢量曲線(xiàn)為例,在Visual Studio 2008和ArcEngine 9.3基礎(chǔ)上編程實(shí)現(xiàn)。
根據(jù)前文算法,得到如圖3所示的結(jié)果??梢钥闯觯@種彎曲識(shí)別方法存在著一個(gè)極大的優(yōu)點(diǎn),就是能在彎曲劃分之后,較為輕松地判斷彎曲的類(lèi)型是U型還是V型。但在彎曲分布不勻稱(chēng)或不理想的情況下,它也存在某些缺點(diǎn),如彎曲劃分不勻稱(chēng)、效果不好。具體表現(xiàn)在,在視覺(jué)上應(yīng)為V型或者U型的彎曲,沒(méi)有全部劃分出來(lái)。在彎曲分布不均勻的曲線(xiàn)上,劃分出的復(fù)雜彎曲和簡(jiǎn)單彎曲在長(zhǎng)度上差距較大。
根據(jù)拐點(diǎn)劃分彎曲是運(yùn)用最廣的方法。通過(guò)圖4可以看出,此方法的優(yōu)點(diǎn)是十分明確地區(qū)分了曲線(xiàn)的凹部和凸部,即凹凸的彎曲按順序均勻地分布在拐點(diǎn)連線(xiàn)的左右。但也存在著許多缺點(diǎn),如小彎曲(長(zhǎng)度?。?、微彎曲(彎曲度?。┮脖粍澐譃閺澢?。
通過(guò)此方法得到的彎曲大多數(shù)情況下是簡(jiǎn)單彎曲,如圖5所示。
從上述實(shí)驗(yàn)中可以看出,基于通視性的彎曲識(shí)別其結(jié)果不是很均勻,其中既包括復(fù)雜彎曲,又包括簡(jiǎn)單彎曲。彎曲的弧底點(diǎn)在曲折系數(shù)較大的彎曲上較為突出,在曲折系數(shù)小的彎曲上表現(xiàn)不突出。基于凹凸性的彎曲識(shí)別其結(jié)果比較均勻,視覺(jué)效果比較理想。基于曲率極大值點(diǎn)的彎曲識(shí)別方法所探查到的曲率極大值點(diǎn)很多,超出了我們視覺(jué)上所認(rèn)為的曲率極大值點(diǎn)數(shù),比基于凹凸性彎曲識(shí)別方法的結(jié)果更加細(xì)膩。此外,其劃分的彎曲都是簡(jiǎn)單彎曲。
線(xiàn)要素化簡(jiǎn)的基本要求是整體輪廓形態(tài)的保持,尤其是每段大彎曲的特征點(diǎn)和形狀的保持,而根據(jù)不同的需要利用以上識(shí)別方法之一對(duì)矢量曲線(xiàn)進(jìn)行彎曲識(shí)別后再對(duì)曲線(xiàn)進(jìn)行化簡(jiǎn),有利于線(xiàn)要素整體形狀的自然保持,也可使化簡(jiǎn)綜合的結(jié)果更合理。本文從理論和實(shí)踐的角度對(duì)比了幾種彎曲識(shí)別方法的合理性和優(yōu)缺點(diǎn),為地圖綜合中矢量曲線(xiàn)的化簡(jiǎn)提供了質(zhì)量保障。
[1]王結(jié)臣,閭國(guó)年.曲線(xiàn)矢量數(shù)據(jù)綜合的微凹凸消除算法[J].測(cè)繪通報(bào),2002(1) : 17-18
[2]Wang Jiayao. The Principle of Cartographic Generalization for General Map[M].Beijing: Publishing House of Surveying and Mapping, 1993
[3]Douglas D H, Pecuker T K. Algorithms for the Reduction of the Number of Points Required to Represent a Digitized Line or Its Caricature[J]. The Canadian Cartographer, 1973,10(2):112-122
[4]Mamaster.Automated Line Generalization[J].Cartographica,1987,24(2):74-111
[5]Li Zhilin, Openshaw S. Algorithms for Line Generalization Based on Natural Objective Principles[J]. International Journal of Geographic Information Systems, 1992,6(5):373-389
[6]Wang Z, Muller J C. Line Generalization Based on Analysis of Shape Characteristics [J].Cartography and Geographic information Systems.1998, 25 (1):3-15
[7]錢(qián)海忠,伍芳.采用斜拉式彎曲劃分的曲線(xiàn)化簡(jiǎn)方法[J].測(cè)繪學(xué)報(bào),2007,36(4):443-449