zoukankan      html  css  js  c++  java
  • ArcEngine 9.3 学习笔记(十):地图查询(IFeatureClass.Search()参数说明,空间分析常用接口、方法)

    补充第五章最后一节知识:

    5.8  IFeatureClass.Search(IQueryFilter,bool Recycling)参数说明

      解释第二个参数bool Recycling 的意义:
      IFeatureClass.Search(IQueryFilter,bool Recycling)方法,返回游标。
      第二个参数设置为true时,当用pFeatureCursor遍历 pFeatureClass时,每次获取下一个后,前一个 记录的图形值在内存中所占的地址就会被销毁回收;
      反之,不会回收,依然存在 在内存中。

    第六章 空间分析

      空间分析功能是GIS的主要功能之一,本章将为读者介绍一些GIS开发常用的功能涉及到的空间拓扑运算,空间关系运算,空间临近运算所使用到的接口。

    6.1 目标

      熟悉ITopologicalOperator接口(用于空间拓扑运算)的使用;
      熟悉IRelationalOperator接口(用于空间拓扑运算)的使用;
      熟悉IProximityOperator接口(用于空间拓扑运算)的使用。

    6.3 ITopologicalOperator接口

             ITopologicalOperator接口:用来通过对已存在的几何对象做空间拓扑运算,以产生新的结合对象。
             实现该接口的类又Point,Multipoint,Polygon,MultiPatch ,这些都是高级几何对象,另外GeometryBag也实现了该接口
             低级的构建几何对象如Segments(Line,Circular,Arc,Elliptic Arc,Bezier Curve),Path或者Rings 如果想使用该接口需要包装成高级几何对象
             ITopologicalOperator接口,通常GIS系统中 缓冲区分析,裁剪几何图形,几何图形差分操作,几何图形合并操作等都需要使用此接口
             ITopologicalOperator的主要方法:
                  1、Boundary      几何图形对象的边界
                  2、Buffer            对几何图形对象进行缓冲区空间拓扑操作
                  3、Clip              对几何图形对象进行裁剪  空间拓扑操作
                  4、ConstructUnion    高效的合并多个枚举几何对象与单个几何对象合并为单个几何对象,这对于大量几何对象的合并非常有效
                  5、ConvexHull        构建几何对象的凸边形
                  6、Cut               切割几何对象
                  7、Difference        一个几何图形减去它与另一个几何图形相交的部分
                  8、Intersect     两个同维度几何对象的交集部分
                  9、Simplify      使几何对象拓扑一致
                  10、SymmetricDifference      对称差分将两个几何图形的并集部分减去,减去两个几何图形交集部分
                  11、Union        合并两个同维度的几何对象为单个几何对象

      1)Boundary属性:

        Polygon几何对象的Boundary是组成它的Polyline对象;

        Polyline几何对象的Boundary是组成它的顶点Point几何对象;

        而Point几何对象的Boundary是空对象。

      2)Buffer方法使用代码片段:

     1         /// <summary>
     2         /// 获取缓冲区图形
     3         /// </summary>
     4         /// <param name="pGeometry">源几何图形</param>
     5         /// <param name="distance">缓冲区半径</param>
     6         /// <returns></returns>
     7         private IGeometry GetBufferPolygon(IGeometry pGeometry, double distance)
     8         {
     9             ITopologicalOperator topoloticalOperator = pGeometry as ITopologicalOperator;
    10             IPolygon pPolygon = topoloticalOperator.Buffer(distance) as IPolygon;// 擦,这就得到缓冲区了?
    11             return pPolygon;
    12         }
    View Code

      3)Clip 方法,用一个Envelope对象,对一个几何对象进行裁剪;
      4)ConvexHull方法,可以产生一个几何图形的最小的 边框凸多边形 (没有凹面包含几何图形的最小多边形);
      5)Cut方法,不支持GeometryBags几何对象,它可以指定一条切割曲线和一个几何图形,经过切割运算后把几何图形分为左右两部分,左右两部分是相对曲线的方向而言的。点与多点不能被切割,Polyline和Polygon只有与切割曲线相交时才能执行CUt方法;
      6)Difference方法 用于产生两个几何对象的差集 ,(两个几何对象,将一个作为保留对象,与另一个做交集,在保留对象上减去 交集部分 得到的对象就是差集);
      7)Union 是合并同维度的两个几何对象,ConstructUnion 的解释太模糊,没看懂,(看图理解的是,Union必须有交集才能合并,ConstructUnion 几何对象分离也能合并,作为一个整体几何对象);
      8)Intersect方法,用于返回两个同维度几何对象的交集,即两个几何对象的重合部分;
      9)SymetricDifference方法,用于产生两个几何图形的对称差分,即两个几何对象的并集减去 它们交集部分。

      10)IsSimple属性和Simplify方法
        a)IsSimple属性用于检测几何对象是否是拓扑正确,即为简化几何对象; ---拓扑正确的判断
        b)Simplify方法,用于简化几何对象,使几何对象的拓扑正确。     ---拓扑正确的操作

    6.3.2 简化几何对象功能开发

      以下代码片段演示了如何使一个几何对象在拓扑上一致,例如在一个PointCollection对象中移除所有重合点;
      对于SegmentCollection移除所有重合线段,而相交的线段会变成非相交线段(即在相交处产生一个顶点);
      Polygon所有相交的环将被移除,未封闭的环将被封闭。

     1         /// <summary>
     2         /// 简化几何对象
     3         /// </summary>
     4         /// <param name="pGeometry"></param>
     5         private void SimplifyGeometry(IGeometry pGeometry)
     6         {
     7             try
     8             {
     9                 ITopologicalOperator pTopOperator = pGeometry as ITopologicalOperator;
    10                 if (pTopOperator != null)
    11                 {
    12                     if (!(pTopOperator.IsKnownSimple))
    13                     {
    14                         if (!pTopOperator.IsSimple)
    15                         {
    16                             pTopOperator.Simplify();// 擦,又完成了
    17                         }
    18                     }
    19                 }
    20             }
    21             catch (Exception)
    22             {
    23 
    24                 throw;
    25             }
    26         }

    6.4 IRelationalOperator接口

      几何对象之间都存在着某种关联关系,如包含,相等,在内部,相交,叠加等
      这些关联关系的获得都可以通过IRelationalOperator接口来获得,关系运算是在两个几何对象间进行的
      通过IrelationalOperator的某一个方法 ,返回一个布尔值,来说明这两个几何对象是否有这种关系!!!
      所有支持ITopologicalOperator的几何对象的类,也实现了IRelationalOperator接口,其中包括Envelope对象
      这意味着还可以对两个几何对象的Envelope进行关联关系检查

      IRelationalOperator 接口的方法:
        1、Contains  检查 A与B 是否是A包含B的关系
        2、Crosses    检查A与B是否相交
        3、Equal  检查A与B是否相等
        4、Touches   检查A与B是否是否相连
        5、Disjoint     检查A与B是否是否不相交
        6、Overlaps    检查A与B是否有重叠
        7、Relation        检查是否存在定义relationship(关系?)
        8、Within         检查两个几何图形,A是否包含于B中

    6.4.2 判断几何对象包含关系功能开发

      以下代码片段演示如何 判断 几何图形A 是否包含 几何图形B

     1         /// <summary>
     2         /// 判断 几何图形A 是否包含 几何图形B
     3         /// </summary>
     4         /// <param name="pGeometryA"></param>
     5         /// <param name="pGeometryB"></param>
     6         /// <returns></returns>
     7         private bool CheckGeometryContain(IGeometry pGeometryA, IGeometry pGeometryB)
     8         {
     9             IRelationalOperator pRelOperator = pGeometryA as IRelationalOperator;
    10             if (pRelOperator.Contains(pGeometryB))
    11             {
    12                 return true;
    13             }
    14             else
    15             {
    16                 return false;
    17             }
    18         }

    6.5 IProximityOperator接口

      IProximityOperator接口,用于获取两个几何图形的距离,以及给点一个Point,求另一个几何图形上离给定点最近的点。

      QueryNearestPoint,ReturnDistance,ReturnNearestPoint
      ReturnDistance方法用于返回两个几何对象间的最短距离,
      QueryNearestPoint方法用于查询获取几何对象上离给定输入点的最近距离的点的引用
      ReturnNearestPoint方法,用于创建并返回几何对象上离给定 输入点的最近距离的点

      以下代码片段演示如何使用IProximityOperator接口获取给定与要查询的几何图形的最近点。

     1         /// <summary>
     2         /// 在pGeometry上返回一个 离pInputPoint最近的point
     3         /// </summary>
     4         /// <param name="pInputPoint">给定的点对象</param>
     5         /// <param name="pGeometry">要查询的几何图形</param>
     6         /// <returns></returns>
     7         private IPoint NearestPoint(IPoint pInputPoint, IGeometry pGeometry)
     8         {
     9             try
    10             {
    11                 IProximityOperator pProximity = (IProximityOperator)pGeometry;
    12                 IPoint pNearestPoint = pProximity.ReturnNearestPoint(pInputPoint, esriSegmentExtension.esriNoExtension);
    13                 return pNearestPoint;
    14             }
    15             catch (Exception)
    16             {
    17                 return null;
    18             }
    19         }

      以下代码片段演示如何使用IProximityOperator接口查询给定的两个几何对象的距离

     1         /// <summary>
     2         /// 获取两个几何图形的距离
     3         /// </summary>
     4         /// <param name="pGeometryA">几何图形A</param>
     5         /// <param name="pGeometryB">几何图形B</param>
     6         /// <returns></returns>
     7         private double GetTwoGeometryDistance(IGeometry pGeometryA, IGeometry pGeometryB)
     8         {
     9             IProximityOperator pProOperator = pGeometryA as IProximityOperator;
    10             if (pGeometryA != null && pGeometryB != null)
    11             {
    12                 double distance = pProOperator.ReturnDistance(pGeometryB);
    13                 return distance;
    14             }
    15             else
    16             {
    17                 return 0;
    18             }
    19         }
  • 相关阅读:
    H5系列之drag拖放
    H5系列之contenteditable
    H5系列之新input
    利用css3和js实现旋转木马图片小demo
    利用css3实现照片列表展开小demo
    reduce()、filter()、map()、some()、every()、...展开属性
    ES6,ES7,ES8,ES9,ES10新特性
    Web Components 是什么?它为什么对我们这么重要?
    vscode常用快捷键以及插件
    使用for..in时会遍历对象原型中的自定义属性
  • 原文地址:https://www.cnblogs.com/cloud915/p/3118019.html
Copyright © 2011-2022 走看看