欢迎您来到GIS动力

加入收藏 免费注册 用户登陆 帮助中心
首页 新闻动态 技术专栏 银杏树下 学习考研 软件下载 求职招聘 许愿瓶 节日祝福 用户中心 精彩推荐 资源搜索 地图
专栏导航: AO开发 | SO开发 | ArcGIS桌面 | 超图桌面 | 开发语言 | 数据库 | WebGIS | 银杏文学 | 研究生考题 | FreeMap FreeTalk
   您现在位于: 首页技术专栏ArcGIS应用与开发AO开发 → 正文
地图裁减
07-12-28 00:00:00 作者:浩淼的天空 出处:浩淼的天空

地图的裁减,主要功能是通过一个任意形状的裁减多边形,可以将目标要素类,无论是点、线、多边形还是标注图层,都可以进行裁减。裁减后的要素类形状与多边形一致。在这个过程中,需要裁减所有在多边形内部的要素,还要处理在多边形边界的polyline或polygon。


1.使用ESRI自己提供的IBasicGeoprocessor:Clip命令
2.遍历一个要素类所有的要素,并与多边形进行拓扑关系判断,按照其在内部,在边界等不同位置产生新要素
3.使用多边形先做包含的包含关系空间过滤,将符合的要素进行处理;然后再对多边形做相交空间过滤,将获得的元素进行处理

我将三种方式都试验了一下,1的缺点很明显,效率低,占用CPU和内存,裁减要素数目大的图层迅速死机;2在处理包含少数要素的要素类(少于5K条)的时候效率比3高;3在处理大量要素时的性能良好。我的试验机器是双核CPU,1G内存,试验数据包括33个要素图层,要素总量为30W条,从中间裁减3W条,结果:1,死机;2,15m左右;3,8m左右。

花了好几天的时间来试验不同的方法,进行测试,设计UI,终于弄出了一个功能比较完整的小程序。

        Select Case pInFeatCls.ShapeType
        Case 1 'point
            '如果点包含在多边形中

            If (pRealOper.Contains(pInFeat.ShapeCopy)) Then
                nFeatCur = nFeatCur + 1
                Set pSaveFeat = pSaveFeatCls.CreateFeature
                '如果是Annotation要素类,则复制Annotation
                If bAnno = True Then
                    Dim pAF As IAnnotationFeature
                    Set pAF = pInFeat
                    Dim pNAF As IAnnotationFeature
                    Set pNAF = pSaveFeat
                    pNAF.Annotation = pAF.Annotation
                End If
                'Set pGeo = pTopo.Intersect(pInFeat.ShapeCopy, esriGeometry0Dimension)
                '将该点要素添加到用于保存的要素类中
                fillFldValue pInFeat, pSaveFeat, arrInSave(), nInSave, pInFeat.Shape
            End If
        Case 3  'polyline
            '如果多义线穿越多边形或包含在多边形中
            If (pRealOper.Crosses(pInFeat.ShapeCopy) Or (pRealOper.Contains(pInFeat.ShapeCopy))) Then
               nFeatCur = nFeatCur + 1
                Set pSaveFeat = pSaveFeatCls.CreateFeature
                '获得相交部分的geometry
                Set pGeo = pTopo.Intersect(pClipPoly, esriGeometry1Dimension)
                fillFldValue pInFeat, pSaveFeat, arrInSave(), nInSave, pGeo
            End If
        Case 4  'polygon
            '如果多边形与裁减多边形相交或在裁减多边形中
            If ((pRealOper.Overlaps(pInFeat.ShapeCopy)) Or (pRealOper.Contains(pInFeat.ShapeCopy))) Then
                nFeatCur = nFeatCur + 1
                Set pSaveFeat = pSaveFeatCls.CreateFeature
                Set pGeo = pTopo.Intersect(pClipPoly, esriGeometry2Dimension)
                fillFldValue pInFeat, pSaveFeat, arrInSave(), nInSave, pGeo
                Debug.Print "nfeatcur" & nFeatCur
            End If
        Case Else
        End Select


(本文已被浏览 次)
发布人:admin
推荐给好友:发送给好友
上篇新闻:
下篇新闻:
相关评论
发表我的评论
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  •   相关文章  
    无相关新闻

    关于我们友情链接 ┋ 与我在线 ┋ 管理 ┋ TOP
     
    网站当前版本:GisPower CMS V3.0
    『GIS 动力』- http://www.gispower.org/
    联系我们:webmaster#gispower.org
    Copyright (c) 2003-2007 GisPOwer.Org. All Rights Reserved.
     

                   滇ICP备05006901号