Esempio n. 1
0
 /// <summary>
 /// 通过缓冲区二分查找获取点到线要素图层中的最短距离
 /// 基于二分查找和贪心算法
 /// </summary>
 /// <param name="featureLayer">要素图层</param>
 /// <param name="point">被查询点</param>
 /// <param name="thefeature">缓冲区中最近要素</param>
 /// <param name="distance">最短距离</param>
 /// <param name="disNum">在线段上的位置集合,1在右方,2在左方,0在线上</param>
 /// <param name="minSpan">最小间距</param>
 /// <returns>离点最近的单线</returns>
 public static IPoint GetNearestLineInFeatureLayerByBufferBinary(IFeatureLayer featureLayer, IPoint point, ref IFeature thefeature, ref double distance, ref int disNum, double minSpan)
 {
     #region 初始化操作
     IQueryFilter pQueryFilter = new QueryFilter();
     pQueryFilter.WhereClause = "";
     //要素个数为0则直接返回null
     int count = featureLayer.FeatureClass.FeatureCount(pQueryFilter);
     if (count == 0)
     {
         return(null);
     }
     //个数为1则直接计算
     else if (count == 1)
     {
         return(GetNearestLineInFeatureLayer(featureLayer, point, ref thefeature, ref distance, ref disNum));
     }
     #endregion
     double low    = 0;
     double high   = GetPointToTheEnvelopMax(featureLayer, point);
     IArray pArray = null;
     ////求最大缓冲区内的要素个数
     ITopologicalOperator pTopOperator = point as ITopologicalOperator;
     IGeometry            pGeometry    = pTopOperator.Buffer(high);
     ILayer    layer     = featureLayer as ILayer;
     IIdentify pIdentity = layer as IIdentify;
     pArray = pIdentity.Identify(pGeometry);
     // 如果为0或者计算错误直接返回null
     if (pArray.Count == 0 || pArray == null)
     {
         return(null);
     }
     //如果只有一个要素 则直接计算返回
     else if (pArray.Count == 1)
     {
         return(GetPointToIArrayMin(point, ref thefeature, ref distance, ref disNum, pArray));
     }
     ///////////////////////////////////////////////
     while ((high - low) < minSpan)
     {
         double buffer_distance = (low + high) / 2;
         pGeometry = pTopOperator.Buffer(buffer_distance);
         pArray    = pIdentity.Identify(pGeometry);
         if (pArray.Count == 0)
         {
             low = buffer_distance;
         }
         else
         {
             high = buffer_distance;
         }
     }
     ////此时high可以认为是最低缓冲区距离 直接求解最短距离
     pGeometry = pTopOperator.Buffer(high);
     pArray    = pIdentity.Identify(pGeometry);
     return(GetPointToIArrayMin(point, ref thefeature, ref distance, ref disNum, pArray));
 }
Esempio n. 2
0
        private double[][] EdgeCorrection(int intNFeatureCount, int intNDistBnd, IFeature pFeature, double[,] arrXYPts, double dblDistInc, double dblBeginDist)
        {
            double[][]            dblWeightCnt = new double[intNFeatureCount][];
            ITopologicalOperator2 pTopoOpt     = (ITopologicalOperator2)pFeature.ShapeCopy;

            for (int i = 0; i < intNFeatureCount; i++)
            {
                IPoint pFromPts = new PointClass();
                pFromPts.X      = arrXYPts[i, 0];
                pFromPts.Y      = arrXYPts[i, 1];
                dblWeightCnt[i] = new double[intNDistBnd];
                ITopologicalOperator pTopoBuffer = pFromPts as ITopologicalOperator;

                for (int l = intNDistBnd; l > 0; l--)
                {
                    if (l == intNDistBnd)
                    {
                        double   dblWeight        = 0;
                        double   dblRefDist       = l * dblDistInc + dblBeginDist;
                        IPolygon polygon          = pTopoBuffer.Buffer(dblRefDist) as IPolygon;
                        IArea    pPolyArea        = polygon as IArea;
                        IArea    pIntersectedArea = (IArea)pTopoOpt.Intersect(polygon, esriGeometryDimension.esriGeometry2Dimension);

                        dblWeight = pIntersectedArea.Area / pPolyArea.Area;
                        dblWeightCnt[i][l - 1] = dblWeight;
                    }
                    else
                    {
                        if (dblWeightCnt[i][l] != 1)
                        {
                            double   dblWeight        = 0;
                            double   dblRefDist       = l * dblDistInc + dblBeginDist;
                            IPolygon polygon          = pTopoBuffer.Buffer(dblRefDist) as IPolygon;
                            IArea    pPolyArea        = polygon as IArea;
                            IArea    pIntersectedArea = (IArea)pTopoOpt.Intersect(polygon, esriGeometryDimension.esriGeometry2Dimension);

                            dblWeight = pIntersectedArea.Area / pPolyArea.Area;
                            dblWeightCnt[i][l - 1] = dblWeight;
                        }
                        else
                        {
                            dblWeightCnt[i][l - 1] = 1;
                        }
                    }
                }
            }
            //if (dblWeightCnt[l - 1] < 0.5)
            //    MessageBox.Show("11");
            return(dblWeightCnt);
        }
Esempio n. 3
0
 /// <summary>
 /// 跳转
 /// </summary>
 /// <params name="pGeo"></params>
 public static void Jump(IGeometry pGeo)
 {
     if (pGeo == null)
     {
         return;
     }
     if (pGeo.GeometryType == esriGeometryType.esriGeometryPoint)
     {
         ITopologicalOperator pTopo = (ITopologicalOperator)pGeo;
         pGeo = pTopo.Buffer(10);
     }
     else
     {
         double ct = 10;
         if (pGeo.Envelope.Height > pGeo.Envelope.Width)
         {
             ct = pGeo.Envelope.Height / 4;
         }
         else
         {
             ct = pGeo.Envelope.Width / 4;
         }
         ITopologicalOperator pTopo = (ITopologicalOperator)pGeo;
         pGeo = pTopo.Buffer(ct);
     }
     GIS.Common.DataEditCommon.g_pAxMapControl.Extent = pGeo.Envelope;
     GIS.Common.DataEditCommon.g_pMyMapCtrl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, GIS.Common.DataEditCommon.g_pAxMapControl.Extent);
 }
Esempio n. 4
0
        public static IArray Identity(IFeatureClass featureclass, IGeometry geometry, string whereClause)
        {
            if (geometry == null)
            {
                return(null);
            }
            if (geometry.GeometryType == esriGeometryType.esriGeometryPoint)
            {
                ITopologicalOperator topop = geometry as ITopologicalOperator;
                double buffer = 0.0;
                if (double.TryParse(System.Configuration.ConfigurationManager.AppSettings["BUFFER"], out buffer))
                {
                    geometry = topop.Buffer(buffer);
                }
            }
            IFeatureLayer featureLayer = new FeatureLayerClass();

            featureLayer.FeatureClass = featureclass;
            IFeatureLayerDefinition featureLayerDefinition = featureLayer as IFeatureLayerDefinition;

            featureLayerDefinition.DefinitionExpression = whereClause;
            IFeatureLayer newfeatureLayer = featureLayerDefinition.CreateSelectionLayer(featureclass.AliasName, false, null, whereClause);
            IIdentify     identify        = featureLayer as IIdentify;
            IArray        identifyObjs    = identify.Identify(geometry);

            return(identifyObjs);
        }
Esempio n. 5
0
        /// <summary>
        /// 执行空间查询
        /// </summary>
        private void SelectFeaturesBySpatial()
        {
            IActiveView pActView = mMap as IActiveView;
            IPoint      pt       = pActView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);

            ITopologicalOperator pTopo = pt as ITopologicalOperator;
            IGeometry            pGeo  = pTopo.Buffer((double)NumericDistance.Value);

            //定义和创建用于查询的ISpatialFilter接口对象
            ISpatialFilter spatialFilter = new SpatialFilterClass();

            spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
            //对选择的目标图层进行遍历,并对每一个图层进行空间查询,查询结果将放在选择集中
            IFeatureLayer featureLayer;

            //对所有选择的目标图层进行遍历
            for (int i = 0; i < checkListLayer.CheckedItems.Count; i++)
            {
                //根据选择的目标图层名称获得对应的矢量图层
                featureLayer = GetFeatureLayerByName(mMap, (string)checkListLayer.CheckedItems[i]);
                //进行接口转换,使用IFeatureSelection接口选择要素
                IFeatureSelection featureSelection = featureLayer as IFeatureSelection;
                //使用IFeatureSelection接口的SelectFeature方法,根据空间查询过滤器选择要素,将其放在新的选择集中
                featureSelection.SelectFeatures((IQueryFilter)spatialFilter, esriSelectionResultEnum.esriSelectionResultAdd, false);
            }

            //进行接口转换,使用IActiveView接口进行视图操作
            IActiveView activeView = mMap as IActiveView;

            //进行部分刷新操作,只刷新选择集的内容
            activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, activeView.Extent);
        }
Esempio n. 6
0
        public IFeature GetNearToFeature()
        {
            if (Polyline == null || PointFeatureLayer == null)
            {
                return(null);
            }

            ITopologicalOperator pTopologicalOperator = Polyline.ToPoint as ITopologicalOperator;

            if (pTopologicalOperator == null)
            {
                return(null);
            }
            ISpatialFilter pSpatialFilter = new SpatialFilterClass();

            pSpatialFilter.Geometry      = pTopologicalOperator.Buffer(Tolerance);
            pSpatialFilter.SpatialRel    = esriSpatialRelEnum.esriSpatialRelEnvelopeIntersects;
            pSpatialFilter.GeometryField = PointFeatureLayer.FeatureClass.ShapeFieldName;

            IFeatureCursor pFeatureCursor = PointFeatureLayer.Search(pSpatialFilter, false);
            IFeature       pFeature       = pFeatureCursor.NextFeature();

            Marshal.ReleaseComObject(pFeatureCursor);
            return(pFeature);
        }
        /// <summary>生成缓冲区多边形</summary>
        /// <param name="dblVerySmall">一个极小值</param>
        /// <param name="dblBuffer">缓冲区半径</param>
        public void CreateBufferAndSmallBuffer(double dblBuffer, double dblVerySmall)
        {
            //正常缓冲区
            this.CreateBuffer(dblBuffer);

            //CreateBufferWithoutEnds(_pBufferGeo, dblBuffer);
            //this .cut

            //考虑到数据存储的问题,建立小缓冲区,用于判断线段是否相交等
            ITopologicalOperator pTop      = this.pPolyline as ITopologicalOperator;
            IGeometry            pSmallGeo = pTop.Buffer(dblVerySmall);

            _pSmallBufferGeo = pSmallGeo;

            //考虑到数据存储的问题,建立ToPoint的小缓冲区,用于判断线段是否相交等
            ITopologicalOperator pTopTo           = this.pPolyline.ToPoint as ITopologicalOperator;
            IGeometry            pToPointSmallGeo = pTopTo.Buffer(dblVerySmall);

            _pToptSmallBufferGeo = pToPointSmallGeo;

            //考虑到数据存储的问题,建立ToPoint的小缓冲区,用于判断线段是否相交等
            ITopologicalOperator pTopFr           = this.pPolyline.FromPoint as ITopologicalOperator;
            IGeometry            pFrPointSmallGeo = pTopFr.Buffer(dblVerySmall);

            _pFrptSmallBufferGeo = pFrPointSmallGeo;
        }
Esempio n. 8
0
        private void 给出可测区域ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            IGeometry          buffer;
            ISelection         pSeletion         = axMapControl1.Map.FeatureSelection;
            IEnumFeature       pEnumFeature      = (IEnumFeature)pSeletion;
            IGraphicsContainer graphicsContainer = axMapControl1.ActiveView.GraphicsContainer;

            graphicsContainer.DeleteAllElements();
            IFeature pFeature       = pEnumFeature.Next();
            double   bufferDistance = GlobalData.dist;

            if (bufferDistance <= 0.0)
            {
                MessageBox.Show("距离设置错误");
                return;
            }


            while (pFeature != null)
            {
                ITopologicalOperator topoOperator = pFeature.Shape as ITopologicalOperator;
                buffer = topoOperator.Buffer(bufferDistance);
                IElement element = new PolygonElementClass();
                element.Geometry = buffer;
                graphicsContainer.AddElement(element, 0);
                pFeature = pEnumFeature.Next();
            }
            axMapControl1.Refresh();
        }
Esempio n. 9
0
        public override void OnMouseUp(int Button, int Shift, int X, int Y)
        {
            int    iPiexl        = 3;
            double iMapTolerance = ConvertPixelsToMapUnits(m_MapControl.ActiveView, iPiexl);

            IGeometry pGeometry = null;

            ITopologicalOperator pTopo = (ITopologicalOperator)m_pPoint;

            if (pTopo != null)
            {
                pGeometry = pTopo.Buffer(iMapTolerance);
            }


            if (m_frmQuery == null)
            {
                m_frmQuery             = new frmQueryForest(m_MapControl);
                m_frmQuery.Owner       = m_mainFrm;
                m_frmQuery.FormClosed += new FormClosedEventHandler(frmQuery_FormClosed);
            }
            //ygc 2012-8-28 将查询结果数据在主窗体下方显示
            // _QuerBar.m_pMapControl = m_MapControl;
            // _QuerBar.EmergeQueryData(m_MapControl.ActiveView.FocusMap, pGeometry, esriSpatialRelEnum.esriSpatialRelIntersects);
            m_frmQuery.Show();
            ///ZQ 20111119  modify
            m_frmQuery.FillData(m_MapControl.ActiveView.FocusMap, pGeometry, esriSpatialRelEnum.esriSpatialRelIntersects);
        }
Esempio n. 10
0
        public Tower GetNearestTower(IPoint pPoint, int buffer)
        {
            ITopologicalOperator pTopo = (ITopologicalOperator)pPoint;

            IGeometry pBufferedPoint = pTopo.Buffer(buffer);

            ISpatialFilter pSFilter = new SpatialFilter();

            pSFilter.Geometry   = pBufferedPoint;
            pSFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;

            //query the geodatabase..
            IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)_workspace;

            IFeatureClass fcTower = pFeatureWorkspace.OpenFeatureClass("Towers");

            IFeatureCursor pFCursor      = fcTower.Search(pSFilter, true);
            IFeature       pTowerFeature = pFCursor.NextFeature();

            if (pTowerFeature == null)
            {
                return(null);
            }

            return(GetTower(pTowerFeature));
        }
Esempio n. 11
0
        public bool Buffer(string layerName, string sWhere, int iSize, IMap imap)
        {
            IFeatureClass pFcl;
            IFeature      pF;
            IGeometry     pGt;
            DataOperator  pDo = new DataOperator(imap, null);
            IFeatureLayer pFl = (IFeatureLayer)pDo.GetLayerbyName(layerName);

            pFcl = pFl.FeatureClass;
            IQueryFilter pQf = new QueryFilterClass();

            pQf.WhereClause = sWhere;
            IFeatureCursor pFc;

            pFc = (IFeatureCursor)pFcl.Search(pQf, false);
            int count = pFcl.FeatureCount(pQf);

            pF  = pFc.NextFeature();
            pGt = pF.Shape;
            ITopologicalOperator pTo       = (ITopologicalOperator)pGt;
            IGeometry            pGtBuffer = pTo.Buffer(iSize);
            ISpatialFilter       pSf       = new SpatialFilter();

            pSf.Geometry   = pGtBuffer;
            pSf.SpatialRel = esriSpatialRelEnum.esriSpatialRelIndexIntersects;
            IFeatureSelection pFs = (IFeatureSelection)pFl;

            pFs.SelectFeatures(pSf, esriSelectionResultEnum.esriSelectionResultNew, false);
            return(true);
        }
Esempio n. 12
0
        /// <summary>
        /// 点选查询
        /// </summary>
        /// <param name="pPoint">空间点</param>
        /// <param name="pFeatureLayer">操作图层</param>
        /// <param name="pRadius">缓冲区半径</param>
        /// <returns>返回查找结果</returns>
        public IFeature GetPointSelect(IPoint pPoint, IFeatureLayer pFeatureLayer, double pRadius)
        {
            if (pPoint != null && pFeatureLayer != null)
            {
                ITopologicalOperator pTopologicalOperator = pPoint as ITopologicalOperator;
                IGeometry            pGeometry            = pTopologicalOperator.Buffer(pRadius);//建立缓冲区
                ISpatialFilter       pSpatialFilter       = new SpatialFilterClass();
                pSpatialFilter.Geometry   = pGeometry;
                pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;                  //求交

                IFeatureCursor pFeatureCursor = pFeatureLayer.FeatureClass.Search(pSpatialFilter, false); //空间查询
                IFeature       pFeature       = pFeatureCursor.NextFeature();

                if (pFeature != null)
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor); //释放缓存
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(pSpatialFilter); //释放缓存
                    pGeometry = pFeature.Shape;
                    return(pFeature);
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                return(null);
            }
        }
Esempio n. 13
0
        private void GlacisUpDown_ValueChanged(object sender, EventArgs e)
        {
            if (this.bGeo.Checked && this.m_OriginGeo != null)
            {
                if (this.GlacisUpDown.Value > 0m)
                {
                    try
                    {
                        ITopologicalOperator topologicalOperator = (ITopologicalOperator)this.m_OriginGeo;
                        IGeometry            geometry            = topologicalOperator.Buffer((double)this.GlacisUpDown.Value);
                        if (geometry != null)
                        {
                            this.m_ipGeo = geometry;
                        }
                        else
                        {
                            MessageBox.Show(@"复杂多边形,创建缓冲区失败!");
                            this.m_ipGeo = this.m_OriginGeo;
                        }
                        goto IL_CF;
                    }
                    catch (Exception)
                    {
                        MessageBox.Show(@"复杂多边形,创建缓冲区失败!");
                        this.GlacisUpDown.Value = 0m;
                        this.m_ipGeo            = this.m_OriginGeo;
                        goto IL_CF;
                    }
                }
                this.m_ipGeo = this.m_OriginGeo;
IL_CF:
                IActiveView activeView = m_context.ActiveView;
                activeView.Refresh();
            }
        }
Esempio n. 14
0
        /// <summary>
        /// 缩放到Feature
        /// </summary>
        /// <param name="pMapControl"></param>
        /// <param name="pFeature"></param>
        private void ZoomToFeature(IMapControlDefault pMapControl, IFeature pFeature)
        {
            if (pFeature == null)
            {
                return;
            }
            if (pFeature.Shape == null)
            {
                return;
            }
            IEnvelope pEnvelope = null;

            if (pFeature.Shape.GeometryType == esriGeometryType.esriGeometryPoint)
            {
                ITopologicalOperator pTop      = pFeature.Shape as ITopologicalOperator;
                IGeometry            pGeometry = pTop.Buffer(50);
                pEnvelope = pGeometry.Envelope;
            }
            else
            {
                pEnvelope = pFeature.Extent;
            }

            if (pEnvelope == null)
            {
                return;
            }
            pEnvelope.Expand(1.5, 1.5, true);
            IActiveView pActiveView = pMapControl.Map as IActiveView;

            pActiveView.Extent = pEnvelope;
            pActiveView.Refresh();
        }
Esempio n. 15
0
        public bool Buffer(string layerName, string sWhere, int iSize, IMap iMap)
        {
            IFeatureClass featureClass;
            IFeature      feature;
            IGeometry     geometry;

            DataOperator  dataOperator = new DataOperator(iMap);
            IFeatureLayer featureLayer = (IFeatureLayer)dataOperator.GetLayerByName(layerName);

            featureClass = featureLayer.FeatureClass;
            IQueryFilter queryFilter = new QueryFilter();

            queryFilter.WhereClause = sWhere;
            IFeatureCursor featureCursor;

            featureCursor = (IFeatureCursor)featureClass.Search(queryFilter, false);
            int count = featureClass.FeatureCount(queryFilter);

            feature  = featureCursor.NextFeature();
            geometry = feature.Shape;

            ITopologicalOperator ipTO        = (ITopologicalOperator)geometry;
            IGeometry            iGeomBuffer = ipTO.Buffer(iSize);

            ISpatialFilter spatialFilter = new SpatialFilter();

            spatialFilter.Geometry   = iGeomBuffer;
            spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIndexIntersects;

            IFeatureSelection featureSelection = (IFeatureSelection)featureLayer;

            featureSelection.SelectFeatures(spatialFilter, esriSelectionResultEnum.esriSelectionResultNew, false);

            return(true);
        }
Esempio n. 16
0
        public void createPointBuffer()
        {
            // ITopologicalOperator  ===>  IGeometry as ITopologicalOperator
            IGeometry            geometry   = axMapControl1.TrackLine(); // IRubberBand   ----   橡皮筋
            ITopologicalOperator topoOper   = geometry as ITopologicalOperator;
            IPolygon             geoPolygon = topoOper.Buffer(1) as IPolygon;
            // IElement

            // 创建符号
            ISimpleLineSymbol pSimpleLineSymbol = new SimpleLineSymbol();

            pSimpleLineSymbol.Width = 2;
            pSimpleLineSymbol.Style = esriSimpleLineStyle.esriSLSSolid;
            //pSimpleLineSymbol.Color = GetRGBColor(46, 24, 63);// Common.GetRGBColor(46, 24, 63);

            ISimpleFillSymbol pSimpleFillSymbol = new SimpleFillSymbol();

            //pSimpleFillSymbol.Color = GetRGBColor(11, 200, 145);
            pSimpleFillSymbol.Outline = pSimpleLineSymbol;
            // 创建Element并赋值图形和符号
            IFillShapeElement pPolygonElement = new PolygonElement() as IFillShapeElement;
            IElement          pElement        = (IElement)pPolygonElement;

            pElement.Geometry      = geoPolygon;
            pPolygonElement.Symbol = pSimpleFillSymbol;

            // 添加到IGraphicsContainer容器
            IGraphicsContainer pGraphicsContainer = (IGraphicsContainer)axMapControl1.Map;

            pGraphicsContainer.AddElement((IElement)pPolygonElement, 0);
            axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
        }
Esempio n. 17
0
        public static IFeatureCursor GetAllFeaturesFromPointSearchInGeoFeatureLayer(Double searchTolerance, IPoint point, IFeatureClass featureClass, IActiveView activeView)
        {
            if (searchTolerance < 0 || point == null || featureClass == null || activeView == null)
            {
                return(null);
            }
            IMap map = activeView.FocusMap;

            // Expand the points envelope to give better search results
            //IEnvelope envelope = point.Envelope;
            //envelope.Expand(searchTolerance, searchTolerance, false);
            ITopologicalOperator pTopologicalOperator = point as ITopologicalOperator;

            String shapeFieldName = featureClass.ShapeFieldName;

            // Create a new spatial filter and use the new envelope as the geometry
            ISpatialFilter spatialFilter = new SpatialFilterClass();

            spatialFilter.Geometry   = pTopologicalOperator.Buffer(searchTolerance);
            spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelEnvelopeIntersects;
            spatialFilter.set_OutputSpatialReference(shapeFieldName, map.SpatialReference);
            spatialFilter.GeometryField = shapeFieldName;

            // Do the search
            IFeatureCursor featureCursor = featureClass.Search(spatialFilter, false);

            return(featureCursor);
        }
Esempio n. 18
0
        public bool Buffer(string layerName, string sWhere, int iSize, IMap iMap)
        {
            IFeatureClass      featClass;
            IFeature           feature;
            IGeometry          iGeom;
            DataOperator       dataOperator      = new DataOperator(iMap);
            IFeatureLayer      featLayer         = (IFeatureLayer)dataOperator.GetLayerByName(layerName);
            IGraphicsContainer graphicsContainer = (IGraphicsContainer)iMap;

            graphicsContainer.DeleteAllElements();
            featClass = featLayer.FeatureClass;
            IQueryFilter queryFilter = new QueryFilter();

            queryFilter.WhereClause = sWhere;
            IFeatureCursor featCursor;

            featCursor = (IFeatureCursor)featClass.Search(queryFilter, false);
            int count = featClass.FeatureCount(queryFilter);

            feature = featCursor.NextFeature();
            iGeom   = feature.Shape;
            IElement             element = new PolygonElementClass();
            ITopologicalOperator ipTO    = (ITopologicalOperator)iGeom;

            element.Geometry = ipTO.Buffer(iSize);
            graphicsContainer.AddElement(element, 0);
            return(true);
        }
Esempio n. 19
0
        public static List <IFeature> GetAllFeaturesFromPolygonInGeoFeatureLayer(IPolygon polygon, IFeatureLayer featureLayer, IMap map, double distance = 0)
        {
            List <IFeature> list = new List <IFeature>();

            if (polygon == null || featureLayer == null || map == null)
            {
                return(list);
            }
            ITopologicalOperator pTopologicalOperator = polygon as ITopologicalOperator;

            if (pTopologicalOperator == null)
            {
                return(list);
            }
            ISpatialFilter pSpatialFilter = new SpatialFilterClass();

            pSpatialFilter.Geometry   = pTopologicalOperator.Buffer(distance);
            pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
            pSpatialFilter.OutputSpatialReference[featureLayer.FeatureClass.ShapeFieldName] = map.SpatialReference;
            pSpatialFilter.GeometryField = featureLayer.FeatureClass.ShapeFieldName;

            IFeatureCursor pFeatureCursor = featureLayer.Search(pSpatialFilter, false);
            IFeature       pFeature;

            while ((pFeature = pFeatureCursor.NextFeature()) != null)
            {
                list.Add(pFeature);
            }
            Marshal.ReleaseComObject(pFeatureCursor);
            return(list);
        }
Esempio n. 20
0
        /// <summary>
        /// 创建指定图形的缓冲区
        /// </summary>
        /// <param name="shape">要缓冲区的图形</param>
        /// <param name="tolerance">缓冲间隔</param>
        /// <returns>生成的缓冲区图形</returns>
        public static IGeometry GetBuffer(this IGeometry shape, double tolerance)
        {
            ITopologicalOperator topo = shape as ITopologicalOperator;

            if (topo == null || (tolerance < 0 && shape.GeometryType != esriGeometryType.esriGeometryPolygon))
            {
                return(null);
            }

            if (!topo.IsSimple)//若是不是简单图形,进行简化处理
            {
                topo.Simplify();
            }

            int       iTry   = 0;//测验测验10次
            IGeometry buffer = null;

            while (buffer == null && iTry <= 10)
            {
                try
                {
                    //若是调用不成功,将缓冲间隔加0.01倍再试(若是第10次成功,则缓冲间隔比本来大了0.09倍)
                    //若是对缓冲间隔请求更严格,可以削减增量的倍数
                    //按照测试经验,一般最多测验测验三次就可以成功
                    buffer = topo.Buffer(tolerance * (1.0 + 0.01 * iTry));
                }
                catch
                {
                    buffer = null;
                    iTry   = iTry + 1;
                }
            }
            return(buffer);
        }
Esempio n. 21
0
        private void button2_Click(object sender, EventArgs e)
        {
            IActiveView        pIActiveView        = pmapcontrol.Map as IActiveView;
            IGraphicsContainer pIGraphicsContainer = pIActiveView.GraphicsContainer;

            pIGraphicsContainer.DeleteAllElements();

            IFeatureLayer  pIFeatureLayer  = pmapcontrol.get_Layer(0) as IFeatureLayer;
            IFeatureCursor pIFeatureCursor = pIFeatureLayer.FeatureClass.Search(null, false);

            IFeature pfeature = pIFeatureCursor.NextFeature();

            while (pfeature != null)
            {
                ITopologicalOperator pITopologicalOperator = pfeature.Shape as ITopologicalOperator;
                IPolygon             pPolygon = pITopologicalOperator.Buffer(double.Parse(textBox1.Text)) as IPolygon;

                IElement pIElement = new PolygonElement();
                pIElement.Geometry = pPolygon;

                pIGraphicsContainer.AddElement(pIElement, 0);

                pfeature = pIFeatureCursor.NextFeature();
            }
            pmapcontrol.Refresh();
            this.Close();
        }
Esempio n. 22
0
        public string CheckLine(string pipelineName, IPolyline polyline, IFeatureClass featureClass)
        {
            string message = "";
            ITopologicalOperator topologicalOperator = polyline as ITopologicalOperator;
            IPolygon             polygon             = topologicalOperator.Buffer(_dataCheck.DataCheckConfig.LineMinimumSpacing) as IPolygon;
            ISpatialFilter       spatialFilter       = new SpatialFilterClass();

            spatialFilter.Geometry      = polygon;
            spatialFilter.SpatialRel    = esriSpatialRelEnum.esriSpatialRelIntersects;
            spatialFilter.GeometryField = featureClass.ShapeFieldName;
            IFeatureCursor featureCursor = featureClass.Search(spatialFilter, false);
            IFeature       feature;

            while ((feature = featureCursor.NextFeature()) != null)
            {
                IPolyline tempPolyline = feature.Shape as IPolyline;
                if (tempPolyline == null || tempPolyline.IsEmpty)
                {
                    continue;
                }
                IProximityOperator proximityOperator = polyline as IProximityOperator;
                double             d = proximityOperator.ReturnDistance(tempPolyline);
                if (d < _dataCheck.DataCheckConfig.LineMinimumSpacing)
                {
                    message += $"{pipelineName}:与 {feature.OID} 的距离为 {d};";
                }
            }
            Marshal.ReleaseComObject(featureCursor);
            return(message);
        }
        private IFeature SelctFeatureBasedMousePoint(IPoint pPoint)
        {
            //对点对象做缓冲区运算
            ITopologicalOperator pTopo     = pPoint as ITopologicalOperator;
            IGeometry            pBuffer   = pTopo.Buffer(0.5);
            IGeometry            pGeometry = pBuffer.Envelope;

            SetAllPolylinePolygonLayersSelectable();
            ISelectionEnvironment selEnvironment = new SelectionEnvironmentClass();

            selEnvironment.CombinationMethod = esriSelectionResultEnum.esriSelectionResultNew;
            m_map.SelectByShape(pGeometry, selEnvironment, true);
            IEnumFeature SelectedFeatures = m_map.FeatureSelection as IEnumFeature;

            SelectedFeatures.Reset();
            IFeature extendFeature = SelectedFeatures.Next();

            SetAllLayersSelectable();

            m_activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, m_activeView.Extent);

            if (extendFeature != null && extendFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolyline)
            {
                return(extendFeature);
            }
            return(null);
        }
Esempio n. 24
0
 /// <summary>
 /// 计算每个数据点相邻的数据点,找出核心点
 /// </summary>
 private void FindNeighborPoints()
 {
     for (int i = 0; i < m_DBSCANPnts.Count; i++)
     {
         List <DBSCANPoint>   neighborPnts        = new List <DBSCANPoint>();
         IPoint               point               = m_DBSCANPnts[i].GetPoint();
         ITopologicalOperator topologicalOperator = point as ITopologicalOperator;
         IGeometry            pointBuffer         = topologicalOperator.Buffer(m_dEps);//缓冲距离
         topologicalOperator.Simplify();
         ISpatialFilter spatialFilter = new SpatialFilterClass();
         spatialFilter.Geometry   = pointBuffer;
         spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
         IFeatureLayer  featurelayer  = m_dataInfo.GetInputLayer() as IFeatureLayer;
         IFeatureCursor featureCursor = featurelayer.FeatureClass.Search(spatialFilter, false);
         IFeature       feature       = featureCursor.NextFeature();
         while (feature != null)
         {
             neighborPnts.Add(GetDBSCANPointByOID(feature.OID));
             feature = featureCursor.NextFeature();
         }
         m_DBSCANPnts[i].SetNeighborPoints(neighborPnts);
         //标记核心点
         if (m_DBSCANPnts[i].GetNeighborPoints().Count >= m_nMinPts)
         {
             m_DBSCANPnts[i].SetPointType(1);
         }
         System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor);
     }
 }
Esempio n. 25
0
        /// <summary>
        /// Buffers the input geometry.
        /// </summary>
        /// <param name="inputGeometry">The input geometry.</param>
        /// <param name="bufferDistance">The buffer distance.</param>
        public static void BufferGeometry(ref IGeometry inputGeometry, double bufferDistance)
        {
            if (inputGeometry == null)
            {
                return;
            }
            if (inputGeometry.IsEmpty)
            {
                return;
            }

            IGeometry bufferGeometry = null;

            //// DEBUG - Check area before
            //if (inputGeometry is IPolygon)
            //{
            //    IArea areaBefore = inputGeometry as IArea;
            //    System.Diagnostics.Debug.WriteLine(areaBefore.Area);
            //}

            // Get the ITopologicalOperator
            ITopologicalOperator topoOp = (ITopologicalOperator)inputGeometry;

            // Perform buffer
            bufferGeometry = topoOp.Buffer(bufferDistance);

            //// DEBUG - Check area after
            //if (bufferGeometry is IPolygon)
            //{
            //    IArea areaAfter = bufferGeometry as IArea;
            //    System.Diagnostics.Debug.WriteLine("After Buffer:  " + areaAfter.Area);
            //}

            inputGeometry = bufferGeometry;
        }
Esempio n. 26
0
        /// <summary>
        /// 把geometry合并起来,组成一个新的geometry,在缓冲buffer个单位
        /// </summary>
        /// <param name="lstGeo">Geo列表</param>
        /// <param name="buffer">缓冲单位</param>
        /// <returns></returns>
        public static IGeometry GetUnionGeometry(IList <IGeometry> lstGeo, double buffer)
        {
            if (lstGeo.Count == 0)
            {
                return(null);
            }
            IGeometryBag pGeometryBag = new GeometryBagClass();

            pGeometryBag.SpatialReference = lstGeo[0].SpatialReference;
            IGeometryCollection pGeometryCollection = pGeometryBag as IGeometryCollection;
            object obj = Type.Missing;

            foreach (IGeometry geo in lstGeo)
            {
                pGeometryCollection.AddGeometry(geo, ref obj, ref obj);
            }

            ITopologicalOperator UnionPolygon = new PolygonClass();

            UnionPolygon.ConstructUnion(pGeometryCollection as ESRI.ArcGIS.Geometry.IEnumGeometry);
            IGeometry            geoResult    = UnionPolygon as IGeometry;
            ITopologicalOperator operatorTopo = geoResult as ITopologicalOperator;

            return(operatorTopo.Buffer(buffer));
        }
        public void GetFeatureOnMouseDown(int x, int y)
        {
            MyselectedFeature.Clear();
            try
            {
                if (MyselectedLayer == null)
                {
                    return;
                }
                IFeatureLayer featureLayer = MyselectedLayer as IFeatureLayer;
                if (featureLayer == null)
                {
                    return;
                }
                IFeatureClass featureClass = featureLayer.FeatureClass;
                if (featureClass == null)
                {
                    return;
                }

                IPoint    point    = MyMapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);
                IGeometry geometry = point as IGeometry;

                double length = ConvertPixelsToMapUnits(4);
                ITopologicalOperator pTopo  = geometry as ITopologicalOperator;
                IGeometry            buffer = pTopo.Buffer(length);
                geometry = buffer.Envelope as IGeometry;

                ISpatialFilter spatialFilter = new SpatialFilterClass();
                spatialFilter.Geometry = geometry;
                switch (featureClass.ShapeType)
                {
                case esriGeometryType.esriGeometryPoint:
                    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
                    break;

                case esriGeometryType.esriGeometryPolygon:
                    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
                    break;

                case esriGeometryType.esriGeometryPolyline:
                    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;
                    break;
                }
                spatialFilter.GeometryField = featureClass.ShapeFieldName;
                IQueryFilter filter = spatialFilter as IQueryFilter;

                IFeatureCursor cursor   = featureClass.Search(filter, false);
                IFeature       pfeature = cursor.NextFeature();
                while (pfeature != null)
                {
                    MyselectedFeature.Add(pfeature);
                    pfeature = cursor.NextFeature();
                }
            }
            catch
            {
                return;
            }
        }
Esempio n. 28
0
 public override void OnDblClick()
 {
     if (this._lineFeedback != null)
     {
         this._Point = null;
         IPolyline polyline = this._lineFeedback.Stop();
         this._lineFeedback = null;
         if (!polyline.IsEmpty)
         {
             frmInputText frm = new frmInputText();
             frm.Title             = "输入缓冲距离";
             frm.Label             = "缓冲距离";
             frm.txtText.EditValue = 50;
             if (frm.ShowDialog() != DialogResult.OK)
             {
                 return;
             }
             double bufferDist = 50;
             try
             {
                 bufferDist = Convert.ToDouble(frm.txtText.EditValue);
             }
             catch (Exception)
             {
                 MessageService.Current.Warn("缓冲距离必须为数字!");
                 return;
             }
             ITopologicalOperator topo   = polyline as ITopologicalOperator;
             IGeometry            buffer = topo.Buffer(bufferDist);
             _plugin.FireFenceAdded(new FenceAddedArgs((IGeometry)buffer));
             IActiveView activeView = this._context.FocusMap as IActiveView;
             activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, buffer.Envelope);
         }
     }
 }
Esempio n. 29
0
        protected override void OnDoubleClick()
        {
            base.OnDoubleClick();


            try
            {
                if (LineFeedBack != null)
                {
                    trackgeom    = LineFeedBack.Stop();
                    LineFeedBack = null;

                    if (GetDriveCenterlineIntersection(trackgeom))
                    {
                        if (CalculateHouseNumber())
                        {
                            SetAttributes();
                        }
                    }

                    mMap.ClearSelection();
                    ITopologicalOperator to = SelectedPoint.Shape as ITopologicalOperator;
                    IGeometry            g  = to.Buffer(10);
                    mMap.SelectByShape(g, ArcMap.ThisApplication.SelectionEnvironment, true);
                    IFeatureSelection fsel = Globals.AddressPointLayer as IFeatureSelection;


                    ArcMap.Document.FocusMap.ClearSelection();
                    ArcMap.Document.ActiveView.Refresh();
                    ArcMap.Document.FocusMap.ClearSelection();
                }
            }
            catch { }
        }
Esempio n. 30
0
        /// <summary>
        /// 根据要素的缓冲距离查找要素
        /// </summary>
        /// <param name="desFeaCls"></param>
        /// <param name="pointFeature"></param>
        /// <param name="dis"></param>
        /// <returns></returns>
        private List <IFeature> GetFeatureByDis(IFeatureClass desFeaCls, IFeature pointFeature, esriSpatialRelEnum spatialRelEnum, double dis)
        {
            List <IFeature> LstFeature = new List <IFeature>();
            //根据源要素的缓冲半径得到缓冲范围
            ITopologicalOperator pTopoOper = pointFeature.Shape as ITopologicalOperator;
            IGeometry            pGeo      = pTopoOper.Buffer(dis);

            //查找缓冲范围内的要素
            ISpatialFilter pFilter = new SpatialFilterClass();

            pFilter.GeometryField = "SHAPE";
            pFilter.Geometry      = pGeo;
            pFilter.SpatialRel    = spatialRelEnum;// esriSpatialRelEnum.esriSpatialRelIntersects;//.esriSpatialRelWithin;
            IFeatureCursor pCursor = desFeaCls.Search(pFilter, false);

            if (pCursor == null)
            {
                return(null);
            }
            IFeature pFeature = pCursor.NextFeature();

            while (pFeature != null)
            {
                LstFeature.Add(pFeature);
                pFeature = pCursor.NextFeature();
            }

            //释放cursor
            System.Runtime.InteropServices.Marshal.ReleaseComObject(pCursor);
            return(LstFeature);
        }