SharpMap是基於.Net平台開發的GIS地圖渲染組件。在SharpMap的內部設計了基於OGC 標准的幾何模型 構架,設計了IProvider策略模式的多源矢量地圖數據適配器接口,地圖要素渲染的底層主要通過幾何變 換將Geometry轉換為.Net支持的幾何模型如System.Drawing.Point、System.Drawing.Rectangle、 System.Drawing.Drawing2D.GraphicsPath等,然後調用System.Drawing.Graphics類的Draw方法實現地圖 要素的繪制。在SharpMap內部由於沒有設計Symbol的構架,因此,對於需要開發真正的GIS系統,需要封 裝Symbol架構,以便實現專題渲染和地圖符號庫。
SharpMap為我們提供了GIS系統最基本的功能集合,如地圖可視化、空間查詢等功能,因此我們可以利 用SharpMap提供的部分功能為我們在.Net平台上實現地圖可視化提供支持,而不需要借助一些商業組件。 本文就將簡單的介紹一些基於SharpMap實現部分程序的代碼示例,希望對研究開源的朋友有所啟示和幫助 。注:我已經對SharpMap部分Bug做了修改,重新設計了系統的構架,也新開發了一些新的模塊。這些都 將在以後的文章中有所闡述。
基於Jackey.Framework開發Windows應用程序示例
//初始化代碼,請在窗體裝載事件中調用該方法。 private void init() { //Set buddy control. this.tocControl1.MapControl = this.mapControl1; //create a vector layer and set the default renderer. SharpMap.Layers.VectorLayer layCity=new SharpMap.Layers.VectorLayer ("City"); layCity.DataSource=new SharpMap.Data.Providers.ShapeFileProvider (@"D:"ArcGIS"DeveloperKit"SamplesNET"data"GulfOfStLawrence"data"Can_Mjr_Cities.shp"); ((SharpMap.Rendering.SimpleFeatureRenderer) layCity.Renderer).Symbol=new SharpMap.Symbols.MarkerSymbol (SharpMap.Symbols.SymbolType.Circle,Color.Blue,10f); //create a vector layer and set the default renderer. SharpMap.Layers.VectorLayer layRoad = new SharpMap.Layers.VectorLayer("Road"); layRoad.DataSource = new SharpMap.Data.Providers.ShapeFileProvider (@"D:"ArcGIS"DeveloperKit"SamplesNET"data"GulfOfStLawrence"data"mjrroads.shp"); ((SharpMap.Rendering.SimpleFeatureRenderer)layRoad.Renderer).Symbol = new SharpMap.Symbols.LineSymbol(Color.Green, 2f); //create a vector layer and set the default renderer. SharpMap.Layers.VectorLayer layCoasts = new SharpMap.Layers.VectorLayer("Coasts"); layCoasts.DataSource = new SharpMap.Data.Providers.ShapeFileProvider (@"D:"ArcGIS"DeveloperKit"SamplesNET"data"GulfOfStLawrence"data"Coasts.shp"); ((SharpMap.Rendering.SimpleFeatureRenderer)layCoasts.Renderer).Symbol = new SharpMap.Symbols.FillSymbol(Color.LightCyan); //add the layer to the map this.mapControl1.Map.Layers.Add(layCoasts); this.mapControl1.Map.Layers.Add(layRoad); this.mapControl1.Map.Layers.Add(layCity); //zoom the map to the full extent this.mapControl1.ZoomToFullExtent(); }