分享

sharpMap学习笔记之三

 Jcstone 2021-11-29


点选功能的实现,对于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 == nullreturn;
            
//查询和鼠标点击的点相交的要素
            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 == nullreturn;
            
//利用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[0as SharpMap.Data.FeatureDataTable ;
            
if (dt == nullreturn;
            SharpMap.Data.FeatureDataRow dr1 
= dt[0as 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 == nullreturn;
            
//查询和鼠标点击的点相交的要素
            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[0as 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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_30737433/article/details/98074911

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多