Gis問題,關於判斷一個點是否在一個polygon內的算法(由點發出射線那個),sharpmap中有嗎?


想判斷一個點是否在一個polygon內。
聽說有個gis的算法 ,就是用點發出一條射線,判斷射線經過的polygon,在經過一個polygon后,如果點與polygon的交點數是奇數的話,就在這個polygon內,否則就不在。大家有誰聽過這個算法啊?
SharpMap中有提供相關的東西嗎 或者有類似的判斷的方法?謝謝

5 个解决方案

#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


UP

#3


Nobody can help me or give me some suggestions?

#4


給你吧,沒人會,呵呵 我自己解決了。

#5


我是這么解決的
#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

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com