点选功能的实现,对于sharpMap v0.9来说,几乎没有涉及到空间分析的方法,比如多边形的相交,点在哪个多边形内等,如果要完成这些功能,可以借助NetTopologySuite和GeoAPI两个开源项目的成果。但值得庆幸的是即将推出的sharpMap v2.0,将对以上的几个开源项目进行集成,使SharpMap具有了空间分析功能。此点选功能的实现也是借助了NetTopologySuite和GeoAPI。效果图如下:
代码如下:
System.Drawing.PointF pt_click = new PointF((float)e.X, (float)e.Y); SharpMap.Geometries.Point pt_map = szmap.ImageToWorld(pt_click); //获取图层 SharpMap.Layers.VectorLayer query_lyr = szmap.GetLayerByName("深圳区域shp.shp") as SharpMap.Layers.VectorLayer; if (query_lyr == null) return; //查询和鼠标点击的点相交的要素 SharpMap.Data.FeatureDataSet ds = new SharpMap.Data.FeatureDataSet(); if (!query_lyr.DataSource.IsOpen) query_lyr.DataSource.Open(); query_lyr.DataSource.ExecuteIntersectionQuery(pt_map.GetBoundingBox(), ds); query_lyr.DataSource.Close(); if (ds == null) return; //利用NetTopologySuite和GeoAPI GisSharpBlog.NetTopologySuite.IO.WKTReader reader = new GisSharpBlog.NetTopologySuite.IO.WKTReader(); GeoAPI.Geometries.IGeometry point = reader.Read(pt_map.ToString()); //获取第一个要素和点击点的距离 int rowid = 0; SharpMap.Data.FeatureDataTable dt = ds.Tables[0] as SharpMap.Data.FeatureDataTable ; if (dt == null) return; SharpMap.Data.FeatureDataRow dr1 = dt[0] as SharpMap.Data.FeatureDataRow; double distance = point.Distance(reader.Read(dr1.Geometry.ToString())); //若表中的要素大于1则要进行距离比较 int rowcount=0; foreach(SharpMap.Data.FeatureDataRow r in dt ) { rowcount++; } if (rowcount>1) { for (int i = 1; i <rowcount; i++) { SharpMap.Data.FeatureDataRow dr = dt[i] as SharpMap.Data.FeatureDataRow; if (distance > point.Distance(reader.Read(dr.Geometry.ToString()))) { distance = point.Distance(reader.Read(dr.Geometry.ToString())); rowid = i; } } } //将选中的要素存入session中,以进行缓冲分析 Session.Add("selectedFeature", dt[rowid].Geometry); //把选中要素添加到选择图层,高亮显示 SharpMap.Layers.VectorLayer selectedLyr = new SharpMap.Layers.VectorLayer("selectedLyr"); selectedLyr.DataSource = new SharpMap.Data.Providers.GeometryProvider(dt[rowid ] as SharpMap.Data.FeatureDataRow ); selectedLyr.Style.EnableOutline = true; selectedLyr.Style.Outline = new Pen(Color.Blue, 2); selectedLyr.Style.Fill = new SolidBrush(Color.Transparent); selectedLyr.SRID = 4326; szmap.Layers.Add(selectedLyr); 此代码实现了通过鼠标点击,在地图上高亮所选地图要素。 不过在对准确性要求不高的情况下,可以只借助sharpMap本身提供的ExecuteIntersectionQuery方法来获取结果 System.Drawing.PointF pt_click = new PointF((float)e.X, (float)e.Y); SharpMap.Geometries.Point pt_map = szmap.ImageToWorld(pt_click); //获取图层 SharpMap.Layers.VectorLayer query_lyr = szmap.GetLayerByName("深圳区域shp.shp") as SharpMap.Layers.VectorLayer; if (query_lyr == null) return; //查询和鼠标点击的点相交的要素 SharpMap.Data.FeatureDataSet ds = new SharpMap.Data.FeatureDataSet(); if (!query_lyr.DataSource.IsOpen) query_lyr.DataSource.Open(); query_lyr.DataSource.ExecuteIntersectionQuery(pt_map.GetBoundingBox(), ds); query_lyr.DataSource.Close(); //把选中要素添加到选择图层,高亮显示 SharpMap.Layers.VectorLayer selectedLyr = new SharpMap.Layers.VectorLayer("selectedLyr"); selectedLyr.DataSource = new SharpMap.Data.Providers.GeometryProvider(ds.Tables[0] as SharpMap.Data.FeatureDataTable); selectedLyr.Style.EnableOutline = true; selectedLyr.Style.Outline = new Pen(Color.Blue, 2); selectedLyr.Style.Fill = new SolidBrush(Color.Transparent); selectedLyr.SRID = 4326; szmap.Layers.Add(selectedLyr); 此中方法准确性就不是很高,在几个地物相邻处点击鼠标,往往要选中几个地图要素,这是由于它是分析地图要素的boundingBox的空间关系来获取的。
powered by sharpMap v0.9,NetTopologySuite,GeoAPI. 代码参考了网上一些资料和www.sharpgis.net 转载于:https://www.cnblogs.com/liujunhzau524/archive/2008/07/08/1238047.html
|