首页 > 范文大全 > 正文

基于ObjectARX的地形图自动接边方法

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于ObjectARX的地形图自动接边方法范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:该文介绍了一种地形图自动接边的方法,分析了地形图自动接边中的关键技术,并在VS2002平台下利用objectarx开发包进行二次开发,实现了同比例尺地形图自动接边。

关键词:地形图;自动接边;ObjectARX

中图分类号:TP311文献标识码:A文章编号: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

由于各种地形图采用分幅管理,造成各种地理要素被分割。在图形数字化过程中,地理要素有可能发生空间错位或者属性错填漏填。当导入多幅图幅时,就可看到在一些图幅边缘处产生明显的“断裂带”。而目前地形图接边工作大部分采用人工接边,工作量大且易出错。为提高接边效率,本文提出了一种地形图的接边方法,采用ObjectARX开发包进行二次开发,实现了同比例尺地形图的自动接边。

1 同比例尺地形图自动接边的流程

1.1 自动接边的原则

自动接边遵循如下原则:

1) 同一种类的地理实体;

2) 错位的距离在规定的容差范围内;

3) 指定的属性能够完全匹配。

1.2 自动接边的总体思路

1) 导入要进行合并的图幅;

2) 在图幅间绘制一条分界线;

3) 选中此分界线,构造缓冲区。利用acedSSGet("C",pt1,pt2,NULL,ssname)在指定范围内构造选择集。缓冲区一边的地理实体放入第一个选择集 ,缓冲区另一边的地理实体放入第二个选择集。

4) 遍历第一个选择集,得到的第一个实体与第二个选择集中的所有实体进行匹配,如果符合自动接边的原则,将两个地理实体自动拼接并实现属性数据的更新。

2 同比例尺地形图自动接边的关键技术

2.1 线状实体自动接边关键技术

2.1.1 线状实体自动接边的思路

线状实体的合并是利用一个实体的属性找到与其属性相互匹配的另一个实体,然后判断两个线状实体的合并点距离是否在容差范围内,如果这个距离在容差范围内就进行拼接,最后处理拼接处的重叠点。

2.1.2 线状实体自动接边的方法

1) 构造结构体

struct buf {

AcGePoint3d Point;//存放多段线节点的坐标值

struct buf*rbprevious;//存放上一个结点的地址

struct buf*rbnext;//存放下一个结点的地址}

2) 构造链表

对多段线进行链表的构造是从多段线的起始点开始遍历整条多段线从而构造链表,见图1。链表中的每个结点存放三个数据:上一个结点的地址,下一个结点的地址,本结点所对应的多段线节点的坐标值。

构造多段线链表的关键代码如下:

if(pEnt->isKindOf(AcDbPolyline::desc())){

AcDbPolyline *pPoly = AcDbPolyline::cast(pEnt);

linetype = pPoly->linetype();

layer = pPoly->layer();

pPoly->getConstantWidth(width);

for(int i = 0;inumVerts();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) 合并链表

从逻辑上讲,距离最近的两个点会合并在一起。因此首先要判断多段线的端点之间哪两个点距离最近,然后将距离最近的两个点合并起来。

要拼接两条多段线有以下四种情况(如图2):头尾-头尾合并,头尾-尾头合并,尾头-尾头合并,尾头-头尾合并。然而,如果只是将两条链表尾头拼接的话,会出现如图2所示的拼接情况。

如何解决呢?头尾-头尾这种情况可以直接将链表合并,头尾-尾头这种情况先将尾头反向为头尾然后再合并。尾头反向就是将每个结点中存放的上结点地址与下结点地址进行交换。尾头-尾头这种情况将两条链表都进行反向。尾头-头尾这种情况将第一条链表反向。头尾反向的关键代码如下:

for(pRbChange ; pRbChange != NULL;pRbChange = pRbChange->rbprevious){

pWap=pRbChange;

p = pWap->rbnext;

pWap->rbnext = pWap->rbprevious;

pWap->rbprevious = p;

pRbChange=pWap;}

合并链表的关键代码如下:

while(pRbTempFirst->rbnext!=NULL){

pRbTempFirst = pRbTempFirst->rbnext;}

pRbTempFirst->rbnext = pRbSecond;

pRbSecond->rbprevious = pRbTempFirst;

链表合并之后重新绘制多段线。在有些情况下,由于两条线合并处的点在同一位置,合并链表重绘多段线之后,该多段线会出现重叠点。因此,遍历这条重新绘制的多段线,读取每个节点的坐标,将其与上个节点的坐标比较,如果坐标值相同,删除该节点。

2.2 面状实体自动接边关键技术

其实面状实体就是闭合的线状实体。如下图,将面状实体进行合并,需要考虑面状实体中哪一边为公共合并边。从图3上看,公共合并边是p3p4与p7p8。从逻辑和经验上讲,距离最近点会合并在一起。而面状实体的合并还需考虑次近距离点。

因此,首先算出面状实体之间的最近距离点(p4、p8)和次近距离点(p3、p7),然后将p4与p8之间的连接断开,将p3与p7之间的连接断开,再将p4与p7设置为多段线的头,p3和p8设置为多段线的尾,这样就将面状实体变为线状实体。最后根据线状实体自动接边技术重新构造多段线,删除重叠点,将多段线闭合。

公共边两点之间断开并获取新的首节点和尾节点的关键代码如下:

if(pTemp1->rbnext == pTemp2 || pTemp1->rbnext == NULL){

pTemp1->rbnext = NULL;

pTemp2->rbprevious = NULL;

firststart = pTemp2;

firstnewS = firststart;

firstnewE = pTemp1;}

2.3 属性合并关键技术

在地形图中涉及到属性合并的地理实体包括等高线、建筑物、水系线等拓扑信息。对于对于这类信息的属性的合并,在拼接前将原实体上的属性数据记录在数据库中,然后在新的合并后的实体生成后,再从数据库中读取相应的数据,并加载于实体的扩展数据中,最后删除原先的实体及实体所带的个。

3 结论

本文所用的方法对于线状实体和面状实体的接边是切实可行的,保证了地形图在拼接过程中的准确性和高效率性。

参考文献:

[1] 华慧,童小华.数字化地图的自动接边及其精度[J].同济大学学报:自然科学版,2001(1).

[2] 秦洪现,崔惠岚,孙剑.Autodesk系列产品开发培训教程[M].北京:化学工业出版社,2008.

[3] Tickoo S.AutoCAD 2000 高级定制[M].北京:机械工业出版社,2001.

[4] Simon D.Visual C++6 编程宝典[M].北京:电子工业出版社,2006.

[5] 李长勋.AutoCAD ObjectARX 程序开发技术[M].北京:国防工业出版社,2005.