AE 判断点是否在面内

 1         /// <summary>
 2         /// 根据面要素的ID获取面,判断点是否在面内
 3         /// </summary>
 4         /// <param name="point">要判断的点,射线的起点</param>
 5         /// <param name="ID">面的ID</param>
 6         /// <param name="pFeatureLayer">面要素所在的图层</param>
 7         /// <returns></returns>
 8         private bool PointIsInPolygon(IPoint point, int ID, IFeatureLayer pFeatureLayer)
 9         {
10             IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
11             IPolygon pPolygon = (pFeatureClass.GetFeature(ID)).Shape as IPolygon;
12             //与多边形的最大最小XY值比较
13             IEnvelope pEnvelope = new EnvelopeClass();
14             pEnvelope = pPolygon.Envelope;
15             if(point.X<pEnvelope.XMin||point.X>pEnvelope.XMax||point.Y<pEnvelope.YMin||point.Y>pEnvelope.YMax)
16                 return false;
17             //如果在这个范围内,向左作射线,根据线与面的拓扑判断交点个数
18             try {
19                 IPoint toPoint = new PointClass();
20                 toPoint.PutCoords(getXminValue(pPolygon) - 20.00000000, point.Y);
21                 IPolyline pLine = new PolylineClass();//定义射线
22                 pLine.ToPoint = toPoint;
23                 pLine.FromPoint = point;
24 
25                 ITopologicalOperator pTopo = pPolygon as ITopologicalOperator;
26                 IGeometryCollection pGeoCol = pTopo.Intersect((IGeometry)pLine, esriGeometryDimension.esriGeometry0Dimension) as IGeometryCollection;
27                 IPointCollection pPointCol = pGeoCol as IPointCollection;
28                 if ((pPointCol.PointCount) % 2 == 0)
29                 {
30                     return false;
31                 }
32                 else
33                 {
34                     return true;
35                 }
36                 
37             }
38             catch (Exception ee)
39             {
40                 MessageBox.Show(ee.Message);
41                 return false;
42             }
43         }
44         /// <summary>
45         /// 获取polygon的X最小值
46         /// </summary>
47         /// <param name="pPolygon"></param>
48         /// <returns></returns>
49         private double getXminValue(IPolygon pPolygon)
50         {
51             IPointCollection pPointCollection = pPolygon as IPointCollection;
52             int n = pPointCollection.PointCount;
53             double[] coordx = new double[n];
54             for (int i = 0; i < n; i++)
55             {
56                 IPoint point = pPointCollection.get_Point(i);
57                 coordx[i] = point.X;
58             }
59             System.Array.Sort(coordx);
60             return coordx[0];
61         }    
原文地址:https://www.cnblogs.com/xiaominmin54/p/4231749.html