摘要:該文介紹了一種地形圖自動(dòng)接邊的方法,分析了地形圖自動(dòng)接邊中的關(guān)鍵技術(shù),并在VS2002平臺(tái)下利用ObjectARX開(kāi)發(fā)包進(jìn)行二次開(kāi)發(fā),實(shí)現(xiàn)了同比例尺地形圖的自動(dòng)接邊。
關(guān)鍵詞:地形圖;自動(dòng)接邊;ObjectARX
中圖分類(lèi)號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2009)36-10318-03
An Automatic Edge-matching Method for Topographic Maps Based on ObjectARX
ZHOU Zui1,2
(1.Tongji University College of Civil Engineering, Shanghai 200092, China; 2.Suzhou Surveying and Mapping Institute CO.LTD, Suzhou 215006, China)
Abstract: This paper introduces an automatic topographic map edge-matching method, analyzes the key technology of automatic edge matching of topographic map, works on secondary development in VS2002 platform by using ObjectARX, and achieves automatic edge matching of same scale topographic map.
Key words: topographic map; automatic edge matching; ObjectARX
由于各種地形圖采用分幅管理,造成各種地理要素被分割。在圖形數(shù)字化過(guò)程中,地理要素有可能發(fā)生空間錯(cuò)位或者屬性錯(cuò)填漏填。當(dāng)導(dǎo)入多幅圖幅時(shí),就可看到在一些圖幅邊緣處產(chǎn)生明顯的“斷裂帶”。而目前地形圖接邊工作大部分采用人工接邊,工作量大且易出錯(cuò)。為提高接邊效率,本文提出了一種地形圖的接邊方法,采用ObjectARX開(kāi)發(fā)包進(jìn)行二次開(kāi)發(fā),實(shí)現(xiàn)了同比例尺地形圖的自動(dòng)接邊。
1 同比例尺地形圖自動(dòng)接邊的流程
1.1 自動(dòng)接邊的原則
自動(dòng)接邊遵循如下原則:
1) 同一種類(lèi)的地理實(shí)體;
2) 錯(cuò)位的距離在規(guī)定的容差范圍內(nèi);
3) 指定的屬性能夠完全匹配。
1.2 自動(dòng)接邊的總體思路
1) 導(dǎo)入要進(jìn)行合并的圖幅;
2) 在圖幅間繪制一條分界線;
3) 選中此分界線,構(gòu)造緩沖區(qū)。利用acedSSGet(\"C\",pt1,pt2,NULL,ssname)在指定范圍內(nèi)構(gòu)造選擇集。緩沖區(qū)一邊的地理實(shí)體放入第一個(gè)選擇集 ,緩沖區(qū)另一邊的地理實(shí)體放入第二個(gè)選擇集。
4) 遍歷第一個(gè)選擇集,得到的第一個(gè)實(shí)體與第二個(gè)選擇集中的所有實(shí)體進(jìn)行匹配,如果符合自動(dòng)接邊的原則,將兩個(gè)地理實(shí)體自動(dòng)拼接并實(shí)現(xiàn)屬性數(shù)據(jù)的更新。
2 同比例尺地形圖自動(dòng)接邊的關(guān)鍵技術(shù)
2.1 線狀實(shí)體自動(dòng)接邊關(guān)鍵技術(shù)
2.1.1 線狀實(shí)體自動(dòng)接邊的思路
線狀實(shí)體的合并是利用一個(gè)實(shí)體的屬性找到與其屬性相互匹配的另一個(gè)實(shí)體,然后判斷兩個(gè)線狀實(shí)體的合并點(diǎn)距離是否在容差范圍內(nèi),如果這個(gè)距離在容差范圍內(nèi)就進(jìn)行拼接,最后處理拼接處的重疊點(diǎn)。
2.1.2 線狀實(shí)體自動(dòng)接邊的方法
1) 構(gòu)造結(jié)構(gòu)體
struct buf {
AcGePoint3d Point;//存放多段線節(jié)點(diǎn)的坐標(biāo)值
struct buf*rbprevious;//存放上一個(gè)結(jié)點(diǎn)的地址
struct buf*rbnext;//存放下一個(gè)結(jié)點(diǎn)的地址}
2) 構(gòu)造鏈表
對(duì)多段線進(jìn)行鏈表的構(gòu)造是從多段線的起始點(diǎn)開(kāi)始遍歷整條多段線從而構(gòu)造鏈表,見(jiàn)圖1。鏈表中的每個(gè)結(jié)點(diǎn)存放三個(gè)數(shù)據(jù):上一個(gè)結(jié)點(diǎn)的地址,下一個(gè)結(jié)點(diǎn)的地址,本結(jié)點(diǎn)所對(duì)應(yīng)的多段線節(jié)點(diǎn)的坐標(biāo)值。
構(gòu)造多段線鏈表的關(guān)鍵代碼如下:
if(pEnt->isKindOf(AcDbPolyline::desc())){
AcDbPolyline *pPoly = AcDbPolyline::cast(pEnt);
linetype = pPoly->linetype();
layer = pPoly->layer();
pPoly->getConstantWidth(width);
for(int i = 0;i
pPoly->getPointAt(i,pt);
pWalk->Point = pt;
p2 = pWalk;
if(i==0){
pRblianbiao = pWalk;
pWalk->rbprevious = NULL;
p1 = new buf;
pWalk->rbnext =p1;
pWalk = p1;
pWalk->rbprevious =p2;}
else{
p1 = new buf;
pWalk->rbnext =p1;
pWalk = p1;
pWalk->rbprevious =p2;}}}
p2->rbnext = NULL;
pWalk = p2;
3) 合并鏈表
從邏輯上講,距離最近的兩個(gè)點(diǎn)會(huì)合并在一起。因此首先要判斷多段線的端點(diǎn)之間哪兩個(gè)點(diǎn)距離最近,然后將距離最近的兩個(gè)點(diǎn)合并起來(lái)。
要拼接兩條多段線有以下四種情況(如圖2):頭尾-頭尾合并,頭尾-尾頭合并,尾頭-尾頭合并,尾頭-頭尾合并。然而,如果只是將兩條鏈表尾頭拼接的話,會(huì)出現(xiàn)如圖2所示的拼接情況。
如何解決呢?頭尾-頭尾這種情況可以直接將鏈表合并,頭尾-尾頭這種情況先將尾頭反向?yàn)轭^尾然后再合并。尾頭反向就是將每個(gè)結(jié)點(diǎn)中存放的上結(jié)點(diǎn)地址與下結(jié)點(diǎn)地址進(jìn)行交換。尾頭-尾頭這種情況將兩條鏈表都進(jìn)行反向。尾頭-頭尾這種情況將第一條鏈表反向。頭尾反向的關(guān)鍵代碼如下:
for(pRbChange ; pRbChange != NULL;pRbChange = pRbChange->rbprevious){
pWap=pRbChange;
p = pWap->rbnext;
pWap->rbnext = pWap->rbprevious;
pWap->rbprevious = p;
pRbChange=pWap;}
合并鏈表的關(guān)鍵代碼如下:
while(pRbTempFirst->rbnext!=NULL){
pRbTempFirst = pRbTempFirst->rbnext;}
pRbTempFirst->rbnext = pRbSecond;
pRbSecond->rbprevious = pRbTempFirst;
鏈表合并之后重新繪制多段線。在有些情況下,由于兩條線合并處的點(diǎn)在同一位置,合并鏈表重繪多段線之后,該多段線會(huì)出現(xiàn)重疊點(diǎn)。因此,遍歷這條重新繪制的多段線,讀取每個(gè)節(jié)點(diǎn)的坐標(biāo),將其與上個(gè)節(jié)點(diǎn)的坐標(biāo)比較,如果坐標(biāo)值相同,刪除該節(jié)點(diǎn)。
2.2 面狀實(shí)體自動(dòng)接邊關(guān)鍵技術(shù)
其實(shí)面狀實(shí)體就是閉合的線狀實(shí)體。如下圖,將面狀實(shí)體進(jìn)行合并,需要考慮面狀實(shí)體中哪一邊為公共合并邊。從圖3上看,公共合并邊是p3p4與p7p8。從邏輯和經(jīng)驗(yàn)上講,距離最近點(diǎn)會(huì)合并在一起。而面狀實(shí)體的合并還需考慮次近距離點(diǎn)。
因此,首先算出面狀實(shí)體之間的最近距離點(diǎn)(p4、p8)和次近距離點(diǎn)(p3、p7),然后將p4與p8之間的連接斷開(kāi),將p3與p7之間的連接斷開(kāi),再將p4與p7設(shè)置為多段線的頭,p3和p8設(shè)置為多段線的尾,這樣就將面狀實(shí)體變?yōu)榫€狀實(shí)體。最后根據(jù)線狀實(shí)體自動(dòng)接邊技術(shù)重新構(gòu)造多段線,刪除重疊點(diǎn),將多段線閉合。
公共邊兩點(diǎn)之間斷開(kāi)并獲取新的首節(jié)點(diǎn)和尾節(jié)點(diǎn)的關(guān)鍵代碼如下:
if(pTemp1->rbnext == pTemp2 || pTemp1->rbnext == NULL){
pTemp1->rbnext = NULL;
pTemp2->rbprevious = NULL;
firststart = pTemp2;
firstnewS = firststart;
firstnewE = pTemp1;}
2.3 屬性合并關(guān)鍵技術(shù)
在地形圖中涉及到屬性合并的地理實(shí)體包括等高線、建筑物、水系線等拓?fù)湫畔?。?duì)于對(duì)于這類(lèi)信息的屬性的合并,在拼接前將原實(shí)體上的屬性數(shù)據(jù)記錄在數(shù)據(jù)庫(kù)中,然后在新的合并后的實(shí)體生成后,再?gòu)臄?shù)據(jù)庫(kù)中讀取相應(yīng)的數(shù)據(jù),并加載于實(shí)體的擴(kuò)展數(shù)據(jù)中,最后刪除原先的實(shí)體及實(shí)體所帶的個(gè)。
3 結(jié)論
本文所用的方法對(duì)于線狀實(shí)體和面狀實(shí)體的接邊是切實(shí)可行的,保證了地形圖在拼接過(guò)程中的準(zhǔn)確性和高效率性。
參考文獻(xiàn):
[1] 華慧,童小華.數(shù)字化地圖的自動(dòng)接邊及其精度[J].同濟(jì)大學(xué)學(xué)報(bào):自然科學(xué)版,2001(1).
[2] 秦洪現(xiàn),崔惠嵐,孫劍.Autodesk系列產(chǎn)品開(kāi)發(fā)培訓(xùn)教程[M].北京:化學(xué)工業(yè)出版社,2008.
[3] Tickoo S.AutoCAD 2000 高級(jí)定制[M].北京:機(jī)械工業(yè)出版社,2001.
[4] Simon D.Visual C++6 編程寶典[M].北京:電子工業(yè)出版社,2006.
[5] 李長(zhǎng)勛.AutoCAD ObjectARX 程序開(kāi)發(fā)技術(shù)[M].北京:國(guó)防工業(yè)出版社,2005.