点选功能的实现,对于sharpMap v0.9来说,几乎没有涉及到空间分析的方法,比如多边形的相交,点在哪个多边形内等,如果要完成这些功能,可以借助
NetTopologySuite和GeoAPI两个开源项目的成果。但值得庆幸的是即将推出的sharpMap v2.0,将对以上的几个开源项目进行集成,使SharpMap具有了空间分析功能。此点选功能的实现也是借助了NetTopologySuite和GeoAPI。效果图如下:
![](https://images.cnblogs.com/cnblogs_com/liujunhzau524/point.JPG)
代码如下:
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 )
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
rowcount++;
}
if
(rowcount
>
1
)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
for (int i = 1; i <rowcount; i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
SharpMap.Data.FeatureDataRow dr = dt[i] as SharpMap.Data.FeatureDataRow;
if (distance > point.Distance(reader.Read(dr.Geometry.ToString())))
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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