想判断一个点是否在一个polygon内。
听说有个gis的算法 ,就是用点发出一条射线,判断射线经过的polygon,在经过一个polygon后,如果点与polygon的交点数是奇数的话,就在这个polygon内,否则就不在。大家有谁听过这个算法啊?
SharpMap中有提供相关的东西吗 或者有类似的判断的方法?谢谢
听说有个gis的算法 ,就是用点发出一条射线,判断射线经过的polygon,在经过一个polygon后,如果点与polygon的交点数是奇数的话,就在这个polygon内,否则就不在。大家有谁听过这个算法啊?
SharpMap中有提供相关的东西吗 或者有类似的判断的方法?谢谢
解决方案 »
- MSSQL VARCHAR问题
- c# 里怎样才能在程序捕获异常后继续执行
- 很简单的问题 自定义字符串方法 第一个来拿分啊
- 在smartphone2003上,用什么组件可以显示一篇文章,还能带滚动条浏览的啊????
- 想学用C#编写类似PETSHOP3.2那样的asp。NET程序,不知该看什么书?
- 最近准备写个程序,在两个数据库之间导数据,大家有好的实现方法吗?
- 谁知道北京佳诚网络公司情况及待遇???
- 填充DataSet时出现空值
- c#中关于控件之间的值传递问题。 急!!!!!!!!!!!!
- 关于Linq Group by + 去重 + 计数的问题
- 在c#中怎样打开指定网页
- 散分!!我要散分!!!我就要散分!!!!大家来讨论!!
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可以呢?
#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