图形接边算法文档_第1页
图形接边算法文档_第2页
图形接边算法文档_第3页
图形接边算法文档_第4页
图形接边算法文档_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、图形接边算法文档1、图形接边概述实际地理数据使用中,需要接边的数据有两种情况:一种是多幅标准图幅数据入库后,需要在图幅边框处接边;另一种是更新数据库中的某个范围内的数据,需要在更新范围线处接边。接边的图形有线和面两种,对于点图形不存在接边。2、图形接边的算法理论图形存在接边与数据编辑方式、分幅等原因有关,接边的两个图形在实际地理环境中是属于同一图形。所以两个图形是否可以接边,需要满足的条件通常有:位置条件和属性条件。位置条件是指欲接边的两个图形空间位置是邻接关系,并且在一个微小距离范围内。理论上接边的两个图形的拓扑关系有:部分重合、有公共边、分离等。 属性条件是指欲接边的两个图形的属性信息完全

2、一样。因此,图形接边的一般步骤是:(1)搜索出接边参考线(图幅边框或者更新范围线)两侧有邻接关系的所有图形对象;(2)按照位置条件和属性条件对图形对象配对;(3)对配对后的图形对象接边,即要素合并。3、图形接边的算法分析在实际的数据入库中,通常的入库方式有:标准图幅数据入库、图块数据入库(即更新区域数据入库)。两者的区别在于标准图幅的接边参考线是规则的图幅边框,而后者接边参考线是图块的范围线(不规则的多边形)。自动接边是在数据入库过程中就需要接边,无需人工干预。本例以半自动接边为例,即接边参考线需要在入库后由人工指定,对于标准图幅,参考线就是图幅边框,对于图块,参考线就是更新范围线。如果是自动

3、接边,参考线直接从入库的数据中获取。(1)参考线的获取根据鼠标点击的位置,在图幅网格图层(按图幅大小划分)中查找当前点击的网格,或者在图块范围线图层(存放入库时的图块范围线)中查找当前点击的图块。查找网格的源码:见SearchLayerBlock(IPointPtr &ipPoint)函数/设置查询条件(包含关系)ISpatialFilterPtr ipSpatialFilter;HRESULT result = ipSpatialFilter.CreateInstance(CLSID_SpatialFilter);if (FAILED(result) return;result =

4、ipSpatialFilter->put_SpatialRel(esriSpatialRelWithin);if (FAILED(result) return; ipSpatialFilter->put_GeometryField(CComBSTR(L"Shape");ipSpatialFilter->putref_Geometry(ipPoint);IQueryFilterPtr ipFilter = ipSpatialFilter;/取网格图层IFeatureLayerPtr ipFtLayer = GetGridLayer(); if(ipFtLay

5、er = NULL) return;/取标识符属性字段BSTR bstr;CString str;IFeatureClassPtr ipFClass;ipFtLayer->get_FeatureClass(&ipFClass);ipFClass->get_OIDFieldName(&bstr);CString layerOID = bstr;/查找网格IFeatureCursorPtr ipFeatureCursor;result = ipFtLayer->Search(ipFilter, VARIANT_TRUE, &ipFeatureCursor)

6、;if (FAILED(result) | NULL = ipFeatureCursor) return;IFeaturePtr ipFeature;while (SUCCEEDED(ipFeatureCursor->NextFeature(&ipFeature) && ipFeature != NULL) if(!GetFeatureAttribute(ipFeature,SCALEFIELDNAME,str) return;if (str!=strScaleName) continue;IGeometryPtr ipGeometry;ipFeature->

7、;get_Shape(&ipGeometry);IPolygonPtr ipPoly(ipGeometry);/设置当前网格图形SetSearchBlockGeometry(ipGeometry);CString str=""if(!GetFeatureAttribute(ipFeature,layerOID,str) return;SetStrToLayerBlock(str);(2)接边图层的确定 如果是自动接边,需要查找出入库的数据在数据库中的图层,即确定数据库中可以和入库数据接边的图层。这里的半自动接边,数据已经入库到指定图层,而且需要接边的图层由人工指定。

8、(3)搜索范围的确定接边的图形位于接边参考线两侧,所以只需要搜索参考线两侧微小范围内的图形。搜索方法是以参考线作为基准,将其向外围扩展微小范围形成一个实心的外多边形,再将其缩小微小范围形成实心的内多边形。然后搜索出与外多边形相交的所有图形,组成欲接边的外图形组;再搜索出与内多边形相交的所有图形,组成欲接边的内图形组。可以通过建立半径为微小范围的参考线的缓冲区,以该缓冲区作为过滤条件搜索。例如:参考CalSearchEnvelope(IGeometryPtr &ipRGeometry, IGeometryPtr &ipLGeometry, double dis,IGeometry

9、Ptr ipGeometry)函数/将参考线(面图形)转换成线图形IPolygonPtr ipPoly(ipGeometry);if (NULL=ipPoly) return;IPointCollectionPtr ipPoints(ipPoly);if (NULL=ipPoly) return;IPolylinePtr ipPolyline(CLSID_Polyline);IPointCollectionPtr ipLinePoints(ipPolyline);ipLinePoints->AddPointCollection(ipPoints);/建线的缓冲区,封闭线的缓冲区有内外环组

10、成ITopologicalOperatorPtr ipTOperator(CLSID_Polyline);ipTOperator = ipPolyline;IGeometryPtr ipBuffer;HRESULT result = ipTOperator->Buffer(dis, &ipBuffer);if (FAILED(result) | NULL = ipBuffer) return;/将缓冲区拆分成两个部分,IRing类型IGeometryCollectionPtr ipGeoCollection(ipBuffer);long geomCount=0;result =

11、ipGeoCollection->get_GeometryCount(&geomCount);if (geomCount!=2) return;/外环的索引是0,未严格测试是否0都是外环ipGeoCollection->get_Geometry(0,&ipRGeometry); /圆角ringipGeoCollection->get_Geometry(1,&ipLGeometry); /方角ring/将环转换成面图形IRingPtr ipRRing(ipRGeometry);IRingPtr ipLRing(ipLGeometry);IPointCol

12、lectionPtr ipRRingPts(ipRRing);IPointCollectionPtr ipLRingPts(ipLRing);IPolygonPtr ipRPolygon(CLSID_Polygon);IPolygonPtr ipLPolygon(CLSID_Polygon);IPointCollectionPtr ipRPolygonPts(ipRPolygon);IPointCollectionPtr ipLPolygonPts(ipLPolygon);ipRPolygonPts->AddPointCollection(ipRRingPts);ipLPolygonPt

13、s->AddPointCollection(ipLRingPts);ipRGeometry = ipRPolygon;ipLGeometry = ipLPolygon;ipTOperator.Release();注意:上面代码中,之所以将面转换成线,然后建缓冲区,是因为实心的面的缓冲区是实心的ring,即只能作为接边参考线外侧图形的搜索条件。封闭线的缓冲区有内外环组成,外环转角为圆角,内环转角与参考线的转角一样。最后部分又将ring转成面,是因为在后面部分将ring作为搜索条件时报未知错误,所以将其转成面来解决。(4)搜索参考线左右两侧图形 实现方法与确定参考线一样,这里的过滤条件是上一

14、步建立的搜索范围。如:参考SchIntesectsCursor(IGeometryPtr ipGeo, IFeatureLayerPtr ipFtLayer, IFeatureCursorPtr &ipFtCursor)函数/设置查询条件ISpatialFilterPtr ipFilter(CLSID_SpatialFilter); HRESULT hr = ipFilter->putref_Geometry(ipGeo);if(FAILED(hr) return;/根据接边图层的几何类型设置不同拓扑关系条件esriGeometryType geometryType=GetGeo

15、metryType(ipFtLayer);if (geometryType=esriGeometryPolyline) hr = ipFilter->put_SpatialRel(esriSpatialRelCrosses);if(FAILED(hr) return;else if(geometryType = esriGeometryPolygon) /hr = ipFilter->put_SpatialRel(esriSpatialRelIntersects); /相交,包含有重合/hr = ipFilter->put_SpatialRel(esriSpatialRelE

16、nvelopeIntersects);/外界矩形相交hr = ipFilter->put_SpatialRel(esriSpatialRelOverlaps); /重叠,不包含完全重合/hr = ipFilter->put_SpatialRel(esriSpatialRelTouches); /重合/hr = ipFilter->put_SpatialRelDescription(CComBSTR("*TTT*"); /报错if(FAILED(hr) return;elsereturn;hr = ipFilter->put_GeometryField

17、(CComBSTR(L"shape");if(FAILED(hr) return;IQueryFilterPtr ipQueryFilter = ipFilter;if(ipQueryFilter=NULL) return;IFeatureClassPtr ipFtClass;hr = ipFtLayer ->get_FeatureClass(&ipFtClass);if(FAILED(hr) return;hr = ipFtClass ->Search(ipQueryFilter,VARIANT_TRUE,&ipFtCursor);if(FAI

18、LED(hr) return;注意: 需要注意的是线和面的相交条件是不一样的。(5)删除上一步中横跨参考线的图形 如果参考线两侧的某个图形已经接边,上一步中也会将其搜索出来,所以需要排除这些图形。排除的条件是两侧搜索的结果集中图形的标识符(OBJECTID)一样。(6)图形配对根据图层的几何类型不同,分别对线和面图形结果集配对。对于线图形:首先判断两图形的属性是否一样,然后再判断两线段的首末点的距离是否在微小范围内。参考LinePaired(IFeatureLayerPtr ipFtLayer,int mainSize,CArray<long,long> &mainArr,

19、int subSize,CArray<long,long> &subArr,double dis)函数HRESULT hr;CArray<CLinePairAttribute,CLinePairAttribute> mainAtt; /记录配对属性CArray<CLinePairAttribute,CLinePairAttribute> subAtt; /记录配对属性IFeatureClassPtr ipFtClass;double dis1_11,dis1_12,dis1_21,dis1_22;hr = ipFtLayer->get_Feat

20、ureClass(&ipFtClass);if(FAILED(hr) return;/将每个图形的属性,首末点坐标,标识符记录在结构体中if(!GetLinePairedAttribute(ipFtClass,COMMONFIELD,mainSize,mainArr,mainAtt) return;if(!GetLinePairedAttribute(ipFtClass,COMMONFIELD,subSize,subArr,subAtt) return;CLinePairAttribute iLineAttTmp1;CLinePairAttribute iLineAttTmp2;mai

21、nArr.RemoveAll(); subArr.RemoveAll();for (int i=0;i<mainAtt.GetSize();i+) iLineAttTmp1 =(CLinePairAttribute)mainAtt.GetAt(i); for(int k=0;k<subAtt.GetSize();k+)iLineAttTmp2 = (CLinePairAttribute)subAtt.GetAt(k);if (!(iLineAttTmp2.m_attValue.Compare(iLineAttTmp1.m_attValue)=0) continue;dis1_11

22、= GetDistanceInPts(iLineAttTmp1.m_ptStart,iLineAttTmp2.m_ptStart); /首首距离dis1_12 = GetDistanceInPts(iLineAttTmp1.m_ptStart,iLineAttTmp2.m_ptEnd); /首末距离dis1_21 = GetDistanceInPts(iLineAttTmp1.m_ptEnd,iLineAttTmp2.m_ptStart); /末首距离dis1_22 = GetDistanceInPts(iLineAttTmp1.m_ptEnd,iLineAttTmp2.m_ptEnd); /

23、末末距离if(dis1_11<=dis | dis1_12<=dis | dis1_21<=dis | dis1_22<=dis)if(dis1_11<=detDis|dis1_12<=detDis|dis1_21<=detDis|dis1_22<=detDis) continue; /小于给定的最小值,则认为已经接边if (iLineAttTmp1.m_fid=iLineAttTmp2.m_fid) continue; /排除跨图幅的图形mainArr.Add(iLineAttTmp1.m_fid); /记录配对的FID subArr.Add(

24、iLineAttTmp2.m_fid);/之前:凡已经配对过的图形,不再参与下一次配对。实际中有图形对应多个的情况/*subAtt.RemoveAt(k);break;/*/注意: 线图形可能横跨接边参考线,这样就存在多对一的关系,所以不能将已经查找过图形从结果集中删除。对于面图形: 面图形配对方法与线一样,先判断属性再判断距离。面的距离判断通过AE中的IProximityOperatator接口实现。参考:PolygonPaired(IFeatureLayerPtr ipFtLayer,int mainSize,CArray<long,long> &mainArr,int

25、 subSize,CArray<long,long> &subArr,double dis)函数HRESULT hr;CArray<CPolyPairAttribute,CPolyPairAttribute> mainAtt; /记录配对属性CArray<CPolyPairAttribute,CPolyPairAttribute> subAtt; /记录配对属性IFeatureClassPtr ipFtClass;hr = ipFtLayer->get_FeatureClass(&ipFtClass);if(FAILED(hr) return;if(!GetPolyPairedAttribute(ipFtClass,COMMONFIELD,mainSize,mainArr,mainAtt) return;if(!GetPolyPairedAttribute(ipFtClass,COMMONFIELD,subSize,subArr,subAtt) return;IProximityOperatorPtr ipGtOperator;CPolyPairAttribute iPolyAttTmp1;CPolyPairAttribute iPolyAttTmp2;double tmpDis=0;mainA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论