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
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。