1.简介
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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。