
代码如下:
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);powered by sharpMap v0.9,NetTopologySuite,GeoAPI.
代码参考了网上一些资料和www.sharpgis.net
本文介绍如何使用SharpMap结合NetTopologySuite和GeoAPI实现地图上的点选功能,并提供了两种不同的实现方法及其代码示例。
872

被折叠的 条评论
为什么被折叠?



