想判断一个点是否在一个polygon内。
听说有个gis的算法 ,就是用点发出一条射线,判断射线经过的polygon,在经过一个polygon后,如果点与polygon的交点数是奇数的话,就在这个polygon内,否则就不在。大家有谁听过这个算法啊?
SharpMap中有提供相关的东西吗 或者有类似的判断的方法?谢谢

解决方案 »

  1.   

    我找到了within方法,但是呢,现在还有连个问题。
    1,  SharpMap.Geometries.BoundingBox bbox = new SharpMap.Geometries.Point(lon, lat).GetBoundingBox();
        List<Geometry> list = layCountries.DataSource.GetGeometriesInView(bbox);            Point point = new Point(lon, lat);
                for (int k = 0; k < list.Count; k++)
                {
                    if (list[k].Contains(point))
                    {
                        return "find it";
                    }
                }    我用这得到的list,不包含我要的那个点。
    2, 加入我找到了包含那个点的Polygon的话,我也得不出来我要的polygon的属性,因为layCountries.DataSource.ExecuteIntersectionQuery(list[k], ds)出错了,报了个NotSupportedException.也就是说,我没办法把一个Geometry的信息读出来。但是layCountries.DataSource.ExecuteIntersectionQuery(bbox,ds)是可以读出来的。
    为什么Geometry不行但是BoundingBox可以呢?
      

  2.   

    Nobody can help me or give me some suggestions?
      

  3.   

    我是这么解决的
    #region 选择区域算法
                SharpMap.Map map = MapHelper.InitializeMap(new System.Drawing.Size(Width, Height));
                if (map == null)
                    throw (new ArgumentException("Invalid map"));            //获取图层和地图点
                SharpMap.Layers.VectorLayer lyr = map.GetLayerByName("天津市基图") as SharpMap.Layers.VectorLayer;
                System.Collections.Generic.List<SharpMap.Geometries.Point> liners = new System.Collections.Generic.List<SharpMap.Geometries.Point>();
                liners.Add(new SharpMap.Geometries.Point(startX, startY));
                liners.Add(new SharpMap.Geometries.Point(endX, startY));
                liners.Add(new SharpMap.Geometries.Point(endX, endY));
                liners.Add(new SharpMap.Geometries.Point(startX, endY));
                liners.Add(new SharpMap.Geometries.Point(startX, startY));
                SharpMap.Geometries.Polygon pt_map = new SharpMap.Geometries.Polygon(new SharpMap.Geometries.LinearRing(liners));            if (lyr != null)
                {
                    //查询和鼠标点击的点相交的要素
                    SharpMap.Data.FeatureDataSet ds = new SharpMap.Data.FeatureDataSet();
                    if (!lyr.DataSource.IsOpen)
                        lyr.DataSource.Open();
                    lyr.DataSource.ExecuteIntersectionQuery(pt_map.GetBoundingBox(), ds);
                    lyr.DataSource.Close();                if (ds != null && ds.Tables.Count != 0)
                    {
                        //利用NetTopologySuite和GeoAPI
                        TerraNova.NetTopologySuite.IO.WKTReader reader = new TerraNova.NetTopologySuite.IO.WKTReader();
                        TerraNova.NetTopologySuite.Geometries.Geometry field = reader.Read(pt_map.ToString());                    //获取第一个要素和点击点的距离
                        SharpMap.Data.FeatureDataTable dt = ds.Tables[0] as SharpMap.Data.FeatureDataTable;                    if (dt != null && dt.Count != 0)
                        {
                            foreach (SharpMap.Data.FeatureDataRow r in dt)
                            {
                                TerraNova.NetTopologySuite.Geometries.Geometry polygon = reader.Read(r.Geometry.ToString());
                                if (polygon.Intersects(field)) {
                                    arcName += r["Name"].ToString();
                                }
                            }
                        }
                    }
                }
                #endregion