sharpMap学习笔记之三

点选功能的实现,对于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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值