zoukankan      html  css  js  c++  java
  • 9.2 空间拓扑运算[转]

     

    link http://www.cnblogs.com/tonywang711/archive/2012/08/30/2663652.html

    9.2.  空间拓扑运算

    9.2.1.   ITopologicalOperator接口

    通过一系列基于一个或者多个几何图形中点间的逻辑比较,然后返回另外一些几何图形,这个过程就是空间几何图形的拓扑运算。

    空间几何图形的拓扑运算包括裁切(Clip)、凸多边形(Convex hull)、切割(Cut)、差分(Difference)、交集(Intersect)、对称差分(又称为异或,Symmetric difference)和并集(Union)等,这些拓扑运算在ITopologicalOperator接口中定义,在GeometryBagMultipointPointPolygonPolyline类中实现。

    注意ITopologicalOperator接口的方法仅仅能使用在高级几何对象上,即PointMultipointPolylinePolygon;如果要在低级的几何对象上如SegmentPathRing上使用,则需要先组合为高级别几何对象才行。

       

    ITopologicalOperator::Boundary可以返回一个几何对象的边界,边界的维度比源对象要低一维。

    ITopologicalOperator::Buffer可以给一个高级别几何对象产生一个缓冲区,无论是点、多边形还是多义线,他们的缓冲区都是一个具有面积的几何对象。

    ITopologicalOperator::Clip方法可以将一个几何对象使用一个包络线来进行裁切,裁切的结果为几何对象被包络线包围的部分。

    ITopologicalOperator::ConstructUnion方法可以将一个几何对象的枚举(包含了多个几何对象的枚举值)与同维度的单个几何对象合并,这种方法在大量几何对象合并的时候是非常有效的;Union方法则可以合并两个同维度的单个几何对象,合并后的两个单个几何对象将变成一个几何对象。

    ITopologicalOperator::ConvexHull方法可以产生一个几何图形的最小的边框凸多边形。

    ITopologicalOperator::Cut方法指定一条切割曲线和一个几何图形,经过切割运算后把几何图形分为左右两部分,左右两部分是相对曲线的方向而言;注意,点和多点是不能被切割的,而折线和多边形只有与切割曲线相交时才能进行切割运算。

    ITopologicalOperator::Difference方法可以产生两个几何对象的差集。如A是源对象,B是参与运算的几何对象,则CA减去AB的交集后剩下的部分;而SymmetricDifference(对称差分)方法则是将AB的并集减去AB的交集部分。

    ITopologicalOperator::Intersection则可以返回两个维度几何形体对象的交集,即两个对象重合部分。

       

    参与空间拓扑运算的几何形体,必须是拓扑上简单的(topologically simple),否则会产生esriGeometryError536错误。

    当几何形体自上次验证之后并未发生变化,那么IsKnowSimple属性返回True;而IsSimple才是实际上验证几何形体是不是拓扑上简单的。因此在使用IsSimple之前检验IsKnownSimple是更有效的,特别是在循环里,如下代码:

    IEnumGeometry pEnumGeom;

    pEnumGeom = pGeometryBag as IEnumGeometry;

    ITopologicalOperator pTopoOp;

    pTopoOp = pEnumGeom.Next() as ITopologicalOperator;

    while ( pTopoOp != null)

    {

    //首先验证IsKnownSimple因为它速度更快

    //在枚举特别大的时候这样更节约时间

    if (!( pTopoOp.IsKnownSimple))

    {

    if (!( pTopoOp.IsSimple))

    pTopoOp.Simplify();

    }

    pTopoOp = pEnumGeom.Next()as ITopologicalOperator;

    }

       

    ITopologicalOperator::Simplify方法可以让一个几何对象变得在拓扑上一致,例如在一个PointCollection中,它可以让所有的重合点(即两个点拥有相同坐标值)被移除(出发拥有不同的属性);对于SegmentCollection,它将移除重合的线段,而相交的线段会变成非相交的线段(即在相交点处产生一个顶点);对于Polygon而言,所有相交的环将被移除,所有的内外的方向将被修正,未封闭的环将被封闭,如图

       

    9.2.2.   开发实例 -- 缓冲区查询

    pActiveView = axMapControl1.ActiveView;

    pMap = axMapControl1.Map;

    IFeatureLayer pFeatureLayer = pMap.get_Layer(1) as IFeatureLayer;

    IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;

    //鼠标点击Map的点

    IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);

    //对点对象做缓冲区运算

    ITopologicalOperator pTopo;

    pTopo = pPoint as ITopologicalOperator;

    IGeometry pBuffer;

    pBuffer = pTopo.Buffer(4);

    IGeometry pGeometry = pBuffer.Envelope;

    //创建空间过滤器

    ISpatialFilter pSpatialFilter;

    pSpatialFilter = new SpatialFilterClass();

    pSpatialFilter.Geometry = pGeometry;

    //绑定空间过滤关系

    switch (pFeatureClass.ShapeType)

    {

    case esriGeometryType.esriGeometryPoint:

    pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;

    break;

    case esriGeometryType.esriGeometryPolyline:

    pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;

    break;

    case esriGeometryType.esriGeometryPolygon:

    pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;

    break;

    }

    IFeatureSelection pFeatureSelection;

    pFeatureSelection = pFeatureLayer as IFeatureSelection;

    pFeatureSelection.SelectFeatures(pSpatialFilter, esriSelectionResultEnum.esriSelectionResultNew, false);

    ISelectionSet pFeatSet;

    pFeatSet = pFeatureSelection.SelectionSet;

    ICursor pCursor;

    pFeatSet.Search(null, true, out pCursor);

    IFeatureCursor pFeatureCursor = pCursor as IFeatureCursor;

    IFeature pFeature = pFeatureCursor.NextFeature();

    //遍历所有符合要求的要素,将它们加入要素选择集中

    while (pFeature != null)

    {

    //将当前的图层加入当前图层的要素选择集

    pMap.SelectFeature(pFeatureLayer, pFeature);

    pFeature = pFeatureCursor.NextFeature();

    }

    pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);

       

  • 相关阅读:
    【微服务架构】SpringCloud之Ribbon
    SpringCloud之Eureka(注册中心集群篇)
    Eureka简介
    两行代码 搞定计数
    HBase详细概述
    电商项目介绍---说的很好
    面试:----Nginx的一理解
    redis介绍
    Linux操作系统介绍
    什么是Solr
  • 原文地址:https://www.cnblogs.com/xiexiaokui/p/4985414.html
Copyright © 2011-2022 走看看