Arcgis engine定位捕捉点

Arcgis engine定位捕捉点

前言
所谓捕捉,即能够及时获得点范围内的最近邻点,实现这个功能AE提供了IHitTest接口,该接口只有一个HitTest方法。
使用HitTest方法获得的捕捉点的类型有如下几种
在这里插入图片描述

/// <summary>
        /// 获取捕捉点
        /// </summary>
        /// <param name="mainMap"></param>
        /// <param name="QueryPoint"></param>
        /// <param name="pFeatureLayer"></param>
        /// <returns></returns>
        public static IPoint getSnapPoint(AxMapControl mainMap, IPoint QueryPoint, IFeatureLayer pFeatureLayer,string snapStyle)
        {
            IPoint pHitPoint = null;
            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;

            ITopologicalOperator pTopologicalOperator = QueryPoint as ITopologicalOperator;
            double bufferLength = convertPixelsToMapUnits(mainMap.ActiveView, 10);
            IGeometry pGeometry = pTopologicalOperator.Buffer(bufferLength).Envelope as IGeometry;

            ISpatialFilter pSpatialFilter = new SpatialFilterClass();
            pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;
            pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;
            pSpatialFilter.Geometry = pGeometry;

            IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
            IFeature pFeature=pFeatureCursor.NextFeature();

            IPoint hitPoint=new PointClass();
            double searchRadius = convertPixelsToMapUnits(mainMap.ActiveView, 10);
            double hitDistance = 0;
            int hitPartIndex = 0;
            int hitSegmentIndex = 0;
            bool bRightSide = false;
            ***//关键点在此句,以上都是为得到IHitTest 做准备***
            IHitTest pHitTest = pFeature.Shape as IHitTest;
            while (pFeature != null)
            {                       
                switch (snapStyle)
                {
                    case "顶点":
                        if (pHitTest.HitTest(QueryPoint, searchRadius, esriGeometryHitPartType.esriGeometryPartVertex, hitPoint, hitDistance, hitPartIndex, hitSegmentIndex, bRightSide))
                        {
                            pHitPoint = hitPoint;
                        }
                        break;
                    case "边界点":
                        if (pHitTest.HitTest(QueryPoint, searchRadius, esriGeometryHitPartType.esriGeometryPartBoundary, hitPoint, hitDistance, hitPartIndex, hitSegmentIndex, bRightSide))
                        {
                            pHitPoint = hitPoint;
                            break;
                        }
                        break;
                    case "线中点":
                        if (pHitTest.HitTest(QueryPoint, searchRadius, esriGeometryHitPartType.esriGeometryPartMidpoint, hitPoint, hitDistance, hitPartIndex, hitSegmentIndex, bRightSide))
                        {
                            pHitPoint = hitPoint;
                            break;
                        }
                        break;
                    case "面中心":
                        if (pHitTest.HitTest(QueryPoint, searchRadius, esriGeometryHitPartType.esriGeometryPartCentroid, hitPoint, hitDistance, hitPartIndex, hitSegmentIndex, bRightSide))
                        {
                            pHitPoint = hitPoint;
                            break;
                        }
                        break;
                    case "端点":
                        if (pHitTest.HitTest(QueryPoint, searchRadius, esriGeometryHitPartType.esriGeometryPartEndpoint, hitPoint, hitDistance, hitPartIndex, hitSegmentIndex, bRightSide))
                        {
                            pHitPoint = hitPoint;
                            break;
                        }
                        break;

                }
                if (pHitPoint != null)
                    break;
                pFeature = pFeatureCursor.NextFeature();
                pHitTest = pFeature.Shape as IHitTest;
            }
            return pHitPoint;
        }
        /// <summary>
        /// 像素个数转为地图上数字
        /// </summary>
        /// <param name="pActiveView"></param>
        /// <param name="pixelUnits"></param>
        /// <returns></returns>
        public static double convertPixelsToMapUnits(IActiveView pActiveView, double pixelUnits)
        {
            double realWorldDisplayExtent;
            int pixelExtent;
            double sizeOfOnePixel;
            pixelExtent = pActiveView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().right - pActiveView.ScreenDisplay.DisplayTransformation.get_DeviceFrame().left;
            realWorldDisplayExtent = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;
            sizeOfOnePixel = realWorldDisplayExtent / pixelExtent;
            return pixelUnits * sizeOfOnePixel;
        }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
c# 读取.mdb中的栅格数据 string path = @"E:\zxl\npgDB.mdb"; axMapControl1.ActiveView.Clear(); axMapControl1.ActiveView.Refresh(); pFWorkspace = OpenAccessWorkspace(path, pFWorkspace); IFeatureLayer iflayer; iflayer = new FeatureLayerClass(); iflayer.FeatureClass = pFWorkspace.OpenFeatureClass("地标"); axMapControl1.AddLayer(iflayer, 0); IFeatureLayer featureLayer = iflayer; //this.axMapControl1.Map.get_Layer(0) as IFeatureLayer; IFeatureCursor featureCursor; IFeature feature; IGeometry geometry; IActiveView activeView = this.axMapControl1.ActiveView; ITopologicalOperator topo; featureCursor = featureLayer.FeatureClass.Search(null, false); feature = featureCursor.NextFeature(); ISpatialFilter spatialFilter = new SpatialFilterClass(); IFeatureSelection featureSelection; if (feature != null) { MessageBox.Show("if","tishi"); topo = feature.Shape as ITopologicalOperator; //double bufferLength = ConvertPixelsToMapUnits(activeView, 2); //geometry = topo.Buffer(bufferLength); geometry = topo.Buffer(1000); spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; spatialFilter.Geometry = geometry; spatialFilter.GeometryField = featureLayer.FeatureClass.ShapeFieldName; spatialFilter.SubFields = "name"; spatialFilter.WhereClause = "name='第一教学楼'"; featureSelection = featureLayer as IFeatureSelection; featureSelection.SelectFeatures(spatialFilter, esriSelectionResultEnum.esriSelectionResultNew, false); ISelectionSet selectionSet = featureSelection.SelectionSet; ICursor cursor; selectionSet.Search(null, true, out cursor); featureCursor = cursor as IFeatureCursor; feature = featureCursor.NextFeature(); while (feature != null) { MessageBox.Show("while", "tishi"); this.axMapControl1.Map.SelectFeature(featureLayer, feature); feature = featureCursor.NextFeature(); } // activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null); activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, geometry.Envelope); } } private void button13_Click(object sender, EventArgs e) { string path = @"E:\zxl\npgDB.mdb"; axMapControl1.ActiveView.Clear(); axMapControl1.ActiveView.Refresh(); pFWorkspace = OpenAccessWorkspace(path, pFWorkspace); IFeatureLayer iflayer; iflayer = new FeatureLayerClass(); iflayer.FeatureClass = pFWorkspace.OpenFeatureClass("地标"); axMapControl1.AddLayer(iflayer, 0); Filter filter = new Filter(); ISpatialFilter filter1=new SpatialFilterClass(); filter1.WhereClause=""; //filter1. = "CITY_NAME = &apos;Phoenix&apos;"; //Envelope envelope = new Envelope(-119, 32, -113, 35); //filter1.Geometry = envelope; //DisplayBuffer displaybuffer = new DisplayBuffer(); //displaybuffer.Distance = 200; //displaybuffer.Units = BufferUnits.Miles; //SimpleRenderer bufferrenderer = new SimpleRenderer(); //SimpleFillSymbol sfs = new SimpleFillSymbol(); //sfs.Color = System.Drawing.Color.Yellow; //sfs.Transparency = 50.0; //bufferrenderer.Symbol = sfs; //FeatureLayer bufferlayer = iflayer.CreateBufferLayer(filter, displaybuffer, bufferrenderer, "mybuffer"); //mapview.Layers.Add(bufferlayer); //mapview.Draw(); Geoprocessor gp=new Geoprocessor();

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mekeater

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值