基於開源項目SharpMap的熱力圖(HeatLayer)實現。

  當前公司須要一個用時較少的熱力圖呈現方案,在避免較底層的GDI開發和比較了多家GIS產品的實際效果以後,團隊決定用sharpMap的API來實現,因爲以前框架採用的是另一個開源項目GMap.net,兩個項目的交互必然存在一個過渡,而這個過渡就是Image類。框架

 

  爲了方便你們理解,以及以後我回頭再看不至於看不懂,加入了較多的註釋。ide

 

先放一張最終效果圖和數據點的對比:spa

 

 

實現過程:.net

一、首先添加幾個NuGet程序包,SharpMap和SharpMap.Layers.HeatLayer,另外,我的建議把SharpMap.UI也加入到項目裏,由於地圖控件在這個程序集之中。code

 

二、初始化一個地圖對象對象

 1 private static SharpMap.Map GetDefaultMap(Size sharpMapSize)  2  {  3             //必須先初始化一個地圖對象,不然數據源會報沒有初始化對象(這tm確定是個bug)。
 4             SharpMap.Map mySharpMap = new SharpMap.Map(new Size(sharpMapSize.Width, sharpMapSize.Height));  5             //這裏能夠設置最小的放大級別,若是不夠小,地圖沒法縮放,會影響最終image邊界。
 6             mySharpMap.MinimumZoom = 0.01; //Minimum zoom allowed  7             //背景色透明
 8             mySharpMap.BackColor = Color.Transparent;  9 
10             return mySharpMap; 11         }
地圖對象構建

 

三、經過一個ShapeFile文件,構造熱圖層對象。blog

 1 private static SharpMap.Layers.HeatLayer GetHeatLayerByVector(string vectorPath, string valueColumn, float scale)  2  {  3             //初始化一個矢量圖層,做爲數據源。
 4             SharpMap.Layers.VectorLayer myVectorLayer = new SharpMap.Layers.VectorLayer("My layer");  5             //這個數據源很是重要。
 6             myVectorLayer.DataSource = new SharpMap.Data.Providers.ShapeFile(vectorPath);  7             myVectorLayer.Style.PointColor = Brushes.Transparent;  8 
 9             //新建熱層對象。第三個參數很是重要,與value相乘後的百分數決定了symbol顯示的顏色,大於1的是靛藍色
10             SharpMap.Layers.HeatLayer heatLayer = new SharpMap.Layers.HeatLayer(myVectorLayer, valueColumn, scale); 11 
12             return heatLayer; 13         }
構造圖層

 

四、圖層相關設置ci

1             //這兩個變量跟比例尺有關,在區間內可變,區間外symbol再也不變
2             heatLayer.ZoomMin = 0f; 3             heatLayer.ZoomMax = 1000000f;//myMap.GetExtents().Width; 4             //控制透明度
5             heatLayer.OpacityMax = 0.2f; 6             heatLayer.OpacityMin = 0.6f; 7             //設置地圖顏色條帶,官方就2種,一種彩虹,一種火焰。
8             heatLayer.HeatColorBlend = SharpMap.Layers.HeatLayer.Classic;    
設置圖層參數

 

五、根據圖層和地圖對象,獲得image開發

 1 private static System.Drawing.Image GetHeatLayerImage(SharpMap.Layers.HeatLayer heatLayer, SharpMap.Map mySharpMap, Envelope Extent)  2  {  3 
 4             //在地圖對象中加入構造的熱圖對象。
 5  mySharpMap.Layers.Add(heatLayer);  6             //轉到當前四至範圍
 7  mySharpMap.ZoomToBox(Extent);  8             //經過地圖對象,拿到img對象。-----------------------------------------------Image-----------------------------
 9             Image imgMap = mySharpMap.GetMap(); 10 
11             return imgMap; 12         }
獲得image

 

六、以後根據這個image,加載到相關地圖控件就能夠了,因爲地圖控件代碼並不屬於SharpMap項目,暫時不給出了。get

 

ps:若是有人須要源碼請移步傳送門。若有任何問題,請回復交流。

相關文章
相關標籤/搜索