zoukankan      html  css  js  c++  java
  • ArcEngine实现捕捉节点

    来自:http://blog.sina.com.cn/s/blog_4d0b75870100o960.html

    //获取最近的结点,然后在  OnMouseMove中显示

    //pnt:鼠标移动点

    //mapSize:设置的地理范围

    public static IPoint GetNearestVertex(IActiveView actview, IPoint pnt, double mapSize)
            {
                IPoint vetex = null;
                IPoint hitPnt=new PointClass();
                IHitTest hitTest = null;
                IPointCollection pntColl =new MultipointClass();
                IProximityOperator prox = null;
                double hitdis=0;
                int hitpartindex=0,hitsegindex=0;
                Boolean rside = false;
                IFeatureCache2 featCache = new FeatureCacheClass();
                double pixelSize = ConvertMapUnitsToPixels(actview, mapSize);  //将地理范围转化为像素
                featCache.Initialize(pnt, pixelSize);  //初始化缓存
                for (int i = 0; i < actview.FocusMap.LayerCount; i++)
                {

                     //只有点、线、面并且可视的图层才加入缓存
                    IFeatureLayer featLayer =(IFeatureLayer) actview.FocusMap.get_Layer(i);
                    if (featLayer != null && featLayer.Visible == true &&
                        (featLayer.FeatureClass.ShapeType==esriGeometryType.esriGeometryPolyline ||
                        featLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPolygon ||
                        featLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint))
                    {
                        featCache.AddFeatures(featLayer.FeatureClass, null);
                        for (int j = 0; j < featCache.Count; j++)
                        {
                            IFeature feat = featCache.get_Feature(j);
                            hitTest =(IHitTest ) feat.Shape;

    //捕捉节点,另外可以设置esriGeometryHitPartType,捕捉边线点,中间点等。
                            if (hitTest.HitTest(pnt, mapSize, esriGeometryHitPartType.esriGeometryPartVertex, hitPnt, ref hitdis, ref hitpartindex, ref hitsegindex, ref rside))
                            {
                                object obj=Type.Missing ;
                                pntColl.AddPoint(hitPnt,ref obj,ref obj);
                                break;
                            }
                        }
                    }
                }
                prox =(IProximityOperator)pnt;
                double minDis=0, dis=0;
                for (int i = 0; i < pntColl.PointCount; i++)
                {
                    IPoint tmpPnt=pntColl.get_Point(i);
                    dis= prox.ReturnDistance(tmpPnt);
                    if (i == 0)
                    {
                        minDis = dis;
                        vetex = tmpPnt;
                    }
                    else
                    {
                        if (dis < minDis)
                        {
                            minDis = dis;
                            vetex = tmpPnt;
                        }
                    }
                }
                return vetex;
            }

  • 相关阅读:
    Linux 系统中 sudo 命令的 10 个技巧
    如何在 Linux 中配置基于密钥认证的 SSH
    选择 NoSQL 数据库需要考虑的 10 个问题
    10 个 Linux 中方便的 Bash 别名
    扒一扒 EventServiceProvider 源代码
    [Binary Hacking] ABI and EABI
    瀑布流 ajax 预载入 json
    PHP5+标准函数库观察者之实现
    使用汇编分析c代码的内存分布
    but no declaration can be found for element &#39;aop:aspectj-autoproxy&#39;.
  • 原文地址:https://www.cnblogs.com/gisoracle/p/3967148.html
Copyright © 2011-2022 走看看