來(lái)自:http://blog.sina.com.cn/s/blog_4d0b75870100o960.html
//獲取最近的結(jié)點(diǎn),然后在OnMouseMove中顯示
//pnt:鼠標(biāo)移動(dòng)點(diǎn)
//mapSize:設(shè)置的地理范圍
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);//將地理范圍轉(zhuǎn)化為像素featCache.Initialize(pnt, pixelSize);//初始化緩存for (int i = 0; i < actview.FocusMap.LayerCount; i++){
//只有點(diǎn)、線、面并且可視的圖層才加入緩存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;
//捕捉節(jié)點(diǎn),另外可以設(shè)置esriGeometryHitPartType,捕捉邊線點(diǎn),中間點(diǎn)等。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;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注