node-canvas實現百度地圖個性化底圖繪制


node-canvas實現百度地圖個性化底圖繪制

 

隨着nodejs的推出,node的並發和異步的強大能力,越來越多的得到應用,而且取得了非常不錯的效果。

作為一個前端工程師對node.js自然有着一份更深的感情,躍躍欲試的心情,總希望能將它應用到產品中來。

經過努力,node技術在百度LBS開發平台,得到了很好的落地,實現了百度地圖個性化的底圖繪制,並最終推出了百度地圖的個性化地圖平台

百度地圖個性化平台

百度地圖大家可能不會陌生了。我們發現個性化定制地圖樣式的需求非常強烈,開發者有強烈的欲望,希望控制地圖的樣式,打造出與眾不同的地圖風格。

百度地圖個化平台:2014年5月中旬上線,目前已經很好地實現了個性化的配置功能。

在線地址:http://developer.baidu.com/map/custom/ 

其中的地圖底圖在IE678等瀏覽器下,就是使用node-canvas在后端繪制出來的。給一張效果圖吧。不同主題的效果demo頁,可以看我們的官方網頁

 

主題列表頁地址

百度地圖底圖技術介紹 

簡單介紹一個地圖的底圖的相關知識吧,我們眼中看到的豐富的地圖信息,其中組成地圖的主要元素,莫過於地圖的一張張底圖瓦片了。如下圖所示,

一般我們打開了一個地圖,其實際上可能會像上圖一樣,由一堆瓦片組成。1,2,3,4表示不同的瓦片。 而某一張瓦片如下圖所示

線上鏈接 :http://online2.map.bdimg.com/tile/?qt=tile&x=790&y=294&z=12&styles=pl&udt=20140613 

百度地圖底圖繪制技術現狀

要想繪制上面所示的底圖,目前現在主要有兩類技術

柵格: 也就是傳意義的圖片技術,在server端把圖片畫好。瀏覽器使用<img>標簽拼出來

矢量:在瀏覽器使用canvas技術,將矢量的數據,在瀏覽器完成渲染。它最大的問題在於:只支持高端瀏覽器

 

百度地圖,目前兩種技術都已經實現,如果大家使用的是mapapi,在高端瀏覽器下打開,你會發現,他是使用canvas繪制的。

http://developer.baidu.com/map/jsdemo.htm#a1_2

有興趣可以使用不同的瀏覽器打開看看就可以看出來。

如圖所示

為什么要用node-canvas來繪制底圖呢?

有如下幾個原因

1. 百度地圖已經很好的實現使用canvas技術在瀏覽器完成渲染。

  並有不錯的展現效果和性能,在移動端體驗更好。因為矢量的數據比請求圖片的體積要小的多

2. 在canvas的方案下,已經實現個性化底圖的繪制效果

  底圖繪制由樣式+矢量數據組成。只要修改替換樣式文件,就可以實現個性化地圖的渲染。

3. 低端瀏覽器如IE6-8等瀏覽器,是不支持canvas功能的。

  展現地圖底圖,必須使用柵格圖實現。需要有后端技術來生成底圖

4. 由於不樣的樣式要求得到不同的底圖。就需要圖片是實時繪制的,而且要求性能必須好。

 

node-canvas繪制底圖效果怎么樣呢?

先show一張由node-canvas繪制的底圖瓦片吧。

在線地址:http://api.map.baidu.com/customimage/tile?x=788&y=293&z=12&customid=midnight

可以看看請求的速度 ,應該是非常快的。

大圖(9個瓦片生成的效果圖)

在線地址:http://api.map.baidu.com/customimage/snap?customid=light

使用node-canvas的核心思路

上面這個圖,就是我想表達的核心意思。一份代碼即可以在瀏覽器里繪制地圖,也可以在server端繪制地圖。

讓javascript一統天下吧~~~

node-canvas介紹

node-canvas 

官網的介紹:Node canvas is a Cairo backed Canvas implementation for NodeJS.

用一句話說: 他允許我們使用canvas的語法和接口寫成的js代碼,放在server跑。

如例子中的介紹

復制代碼
var Canvas = require('canvas')
  , canvas = new Canvas(200,200)
  , ctx = canvas.getContext('2d');

ctx.font = '30px Impact';
ctx.rotate(.1);
ctx.fillText("Awesome!", 50, 100);

var te = ctx.measureText('Awesome!');
ctx.strokeStyle = 'rgba(0,0,0,0.5)';
ctx.beginPath();
ctx.lineTo(50, 102);
ctx.lineTo(50 + te.width, 102);
ctx.stroke();

console.log('<img src="' + canvas.toDataURL() + '" />');
復制代碼

 

 經過我的證實,確實是與canvas的接口使用完全一致。

 

后台繪制的主要邏輯

 

node-canvas的幾個注意點

  1. 環境安裝困難。
    • 由於依賴多個包,且對版本有各種要求。所以搭建消耗了大量的時間。最好終於搞定。
    • 部署形式,采用的是在線下把全部環境編譯好,上線時,全部拷貝即可。
  2. 圖片資源,換成相對路徑。
  3. 中文字體安裝,需要在linux機器上安裝所需要的字體。

 

node的一些性能調優

關於node的一些調優,網上有很多的經驗,方法都較為類似,這里簡單列一下幾個關鍵的。

  1. 一定要開啟cluster. node為單進程,多核的機器 可以很好的利用cpu的使用率。
  2. 合理設置網絡等配置。如果 node請求了第三方的http服務,如重試,超時,異常處理一定要全面。maxSocket等限制一定要打開。
  3. 合理開啟緩存,一些預處理盡量放在node啟動時完成,盡量不要放在request時再重復執行。
  4. 將node運行中,對cpu的依賴降到最低,盡量不要把復雜的計算放在js中計算,代碼一定優化優化再優化。

node-開發輔助

  1. 使⽤用supervisor提⾼高 nodejs調試效率(監聽js ⽂文件變化 ,⾃自動重啟 node)  ,參考文章
  2. 使用node-inspector 在瀏覽器實現本地調試,參考文章
  3. 使用npm鏡像,加速npm安裝。 

總結

  1. node技術越來越成熟,在生產環境中沒有任何問題。並發的優勢非常明顯,也可以實現代碼的前后端復用的目標。
  2. node-canvas的出現,可以很好解決server繪制圖片的需求,性能表現的很好。
  3. 開發node的app,對於前端工程師來說,學習成本不高。

 

轉載自:https://www.cnblogs.com/well1010/articles/baidu-map-node-canvas.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM