加载中…
个人资料
杨济忠
杨济忠
  • 博客等级:
  • 博客积分:0
  • 博客访问:346,830
  • 关注人气:36
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SharpMap地图介绍及开发例子

(2016-10-25 22:27:38)
我专门给大家翻译外文IT参考资料,想学的,可以关注,也可以关注我个人自己建的博客:http://www.1024sky.cn
SharpMap是一个基于.net 2.0使用C#开发的Map渲染类库,可以渲染各类GIS数据(目前支持ESRI Shape和PostGIS格式),可应用于桌面和Web程序。
它的优点有:
1、占用资源较少,响应比较快。在对于项目中如果只需要简单的地图功能的话,是一个比 较好的选择 。
2、它是基于.NET 2.0环境下开发的,对于.NET环境支持较好。
3、使用简单,只要在.NET项目中引用相应的dll文件即可,没有复杂的安装步骤。
支持B/S及C/S两种方式的DLL调用,支持地图渲染效果

SharpMap最新版基于.NET Framework 4,采用C#开发的地图渲染引擎,非常易于使用。我这次研究的是比较稳定发布的V1.1版本。可以在GitHub下载该源码,地址:https://github.com/SharpMap/SharpMap。不想下载的可以在我文章后的链接下载我调试好的源码并且源码中也有一些我自己写的注释(注意如果使用GitHub的源码时要使用VS2013以上的Nuget还原,建议直接下载我调试好的)。

SharpMap实现功能:

(1)符合OpenGIS的简单要素规范,支持点、线、面、多点、多线、多面、集合对象集合等要素集合。

(2)支持常规的地图操作,例如旋转、平移、缩放等。

(3)实时的地图投影转换。

(4)使用异步委托实现效率最大化,可编制展示复杂的地图主体渲染。

(5)支持Web地图展示,支持AJAX地图控件,支持WMS服务。

(6)有很好的接口支持数据格式和图层的扩展。

SharpMap支持的格式:

(1)支持矢量数据格式:例如ESRI Shape File、PostGIS、Oracle、Microsoft SQLServer、SQLite等。

(2)支持栅格数据格式:例如.bmp、.gif、.tif、.png、.dem等格式。

(3)WMS地图服务。

SharpMap使用的第三方开源库:

BruTile:这是基于C#开发的支持GIS瓦片(tile)的开源代码库地址为:https://github.com/BruTile/BruTile

NetTopoLogySuite:基于.net平台处理GIS空间数据及其空间关系的类库。开源代码库地址为:https://github.com/NetTopologySuite/NetTopologySuite。还使用了该团队的其他开源项目GeoAPI,实现.net与GIS互操作开源代码库地址为:https://github.com/NetTopologySuite/GeoAPI有兴趣的话可以研究一下。

ProjNET:基于.Net开源的地图投影库,支持基准面转换,支持大地坐标系,地心坐标系以及投影坐标系。开源代码库地址为:http://projnet.codeplex.com/

SharpMap源码结构

(1)SharpMap名称空间是SharpMap的核心,Base文件夹是基础的资源释放接口。Converters文件夹是数据格式转换类。CoordinateSystems文件夹是坐标系统的矩阵转换类。Data文件夹下是数据格式类。Geometries文件夹是对GeoAPI的扩展。Layers文件夹是图层类管理。Map文件夹是核心,其中Map是地图对象,MapViewportGuard是目录树管理。Rendering文件夹下是渲染类。Styles文件夹下是样式类。Utilities文件夹下是公共类主要提供一些算法。Web文件夹下是web访问地图的接口。

(2)SharpMap.UI名称空间是WinForm编程的核心,在其Forms文件夹下是MapBox类是核心,他本质上是一个自定义组件(Component)继承与WinForm的Control控件类。ToolBar文件夹下是工具条类都继承自System.Windows.Forms.ToolStrip,它们也是自定义组件。

(3)其余名称空间下的类就不介绍了有兴趣可以再研究。注意Examples文件夹下有对应的实例代码可以作为研究的入口。

2.开发的例子

1.添加SharpMap的UI组件至VS工具箱

添加之后如图所示

2.加载Shapefile文件

1、在窗体添加MapBox组件

2、为项目添加SharpMap引用,一般来说给WinForm窗体添加MapBox组件后,会自动引用SharpMap引用,如果没有的话,手动添加SharpMap.dll引用

3、在窗体中添加一个打开文件的按钮(支持多选),在点击事件中添加如下代码


  private void button1_Click(object sender, EventArgs e)
        {
            //加载前清除图层
            mapBox1.Map.Layers.Clear();
            //设置鼠标为漫游
            mapBox1.ActiveTool = SharpMap.Forms.MapBox.Tools.Pan;
            OpenFileDialog Fd = new OpenFileDialog();
            Fd.Filter = "shp文件|*.shp";
            Fd.Multiselect = true;
            if (Fd.ShowDialog() == DialogResult.OK)
            {
                foreach (var fileName in Fd.FileNames)
                {
                    //  VectorLayer为矢量图层类
                    SharpMap.Layers.VectorLayer vlay = new SharpMap.Layers.VectorLayer("");
                    //设置面填充颜色
                    vlay.Style.Fill =new SolidBrush(Color.FromArgb(192, Color.DarkSlateBlue));
                    //加载shp资源
                    vlay.DataSource = new SharpMap.Data.Providers.ShapeFile(fileName, true);
                    //添加到界面
                    mapBox1.Map.Layers.Add(vlay);
                }
                //缩放到全局
                mapBox1.Map.ZoomToExtents();
                mapBox1.Refresh();
            }
            }

4.显示效果

3.总结

为什么我要研究SharpMap呢?目前流行的都是B/S架构的项目,大家大多都是调用Arcgis的Api或者百度地图Api等,这些Api将一些GIS的核心都封装到了内部,我们只管调用。但是作为一个有追求的程序员,不但要知其然,也要知其所以然,才能有所进步。读源码是了解GIS底层知识最快捷的方式,SharpMap是一款很好的研究底层原理的项目,第一他的项目核心源码一万多,读起来压力不大。第二这个项目从2005年开始直到最近都有更新,说明作者倾注的很多心血,值得研究一下。第三这个项目基于C#开发的,相比其他C或C++更易懂。

下一次篇文章我打算讲一下屏幕坐标系到地理坐标系的转换以及如何实现缩放,该系列未完待续,期待您的关注…………

 SharpMapV1.1可运行源码地址:SharpMap V1.1

作者:ATtuing

出处:http://www.cnblogs.com/ATtuing

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有