mapbox-gl.js本地化

mapbox-gl官網地址:https://www.mapbox.com/mapbox-gl-js/api/javascript

介紹

mapbox-gl.js是mapbox用於web端地圖可視化的api。 使用的時候首先要註冊個帳戶,而後得到一個  accessToken。css

以後在官網例子裏能夠發現,地圖和圖標、字體等等的顯示都須要這個accessToken,那勢必聯網。html

由於項目環境不容許上網,因此須要將其本地化,即把須要accessToken的請求所有本地化到本身的服務上來。java

本地化

首先根據大神猿基地的文章:Mapbox GL JS本地化實踐  來一步步進行本地化。下面重點講一下我在本地化出現的問題與解決辦法~~node

 

第一步,先貼所有代碼~~

[html] view plain copypython

  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4.     <meta charset='utf-8' />  
  5.     <title></title>  
  6.     <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />  
  7.    <script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.38.0/mapbox-gl.js'></script>  
  8.     <link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.38.0/mapbox-gl.css' rel='stylesheet' />  
  9.     <style>  
  10.         body { margin:0; padding:0; }  
  11.         #map { position:absolute; top:0; bottom:0; width:100%; }  
  12.     </style>  
  13. </head>  
  14. <body>  
  15.   
  16. <div id='map'></div>  
  17. <script>  
  18.      var map = new mapboxgl.Map({  
  19.         container: 'map', // container id  
  20.         style: {  
  21.             "version": 8,        
  22.             "sprite": "http://localhost:8080/mapboxTest/sprite",  
  23.             "glyphs": "http://localhost:8080/mapboxTest/mapbox本地化/font/{fontstack}/{range}.pbf",  
  24.             "sources": {  
  25.                 "osm-tiles": {  
  26.                     "type": "raster",  
  27.                     'tiles': [  
  28.                        "http://c.tile.openstreetmap.org/{z}/{x}/{y}.png"  
  29.                     ],  
  30.                     'tileSize': 256  
  31.                 }  
  32.             },  
  33.             "layers": [{  
  34.                 "id": "simple-tiles",  
  35.                 "type": "raster",  
  36.                 "source": "osm-tiles",  
  37.                 "minzoom": 0,  
  38.                 "maxzoom": 22  
  39.             }]  
  40.         },  
  41.         center: [114.28321838378906,30.54302215576172],  
  42.         zoom: 12  
  43.     });  
  44.     //添加要素  
  45.     map.on('load', function () {  
  46.         map.addSource("points", {  
  47.             "type": "geojson",  
  48.             "data": {  
  49.                 "type": "FeatureCollection",  
  50.                 "features": [{  
  51.                     "type": "Feature",  
  52.                     "geometry": {  
  53.                         "type": "Point",  
  54.                         "coordinates": [114.28321838378906,30.54302215576172]  
  55.                     },  
  56.                     "properties": {  
  57.                         "title": "test1",  
  58.                         "icon": "monument"  
  59.                     }  
  60.                 }]  
  61.             }  
  62.         });  
  63.         map.addLayer({  
  64.             "id": "points",  
  65.             "type": "symbol",  
  66.             "source": "points",  
  67.             "layout": {  
  68.                 "icon-image": "{icon}-15",  
  69.                "text-field": "{title}",  
  70.                 "text-font": ["YaHei"],  
  71.               "text-offset": [0, 0.6],  
  72.                "text-anchor": "top"  
  73.             }  
  74.         });  
  75.     });  
  76. </script>  
  77. </body>  
  78. </html>  

第二步,本地化圖標。

大神已經說得很清楚了,在此不贅述。就是把請求到的sprite.png     sprite.png      sprite2x.png 放到tomcat的sprite文件夾下。而後把代碼裏的請求地址改成:[html] view plain copygit

  1. http://localhost:8080/mapboxTest/sprite  

第三步,本地化字體。

用的是   https://github.com/mapbox/node-fontnikgithub

首先,安裝ubuntu虛擬機,以後安裝python2.7與node.js v6.x,而後在node-fontnik文件夾下運行web

npm install

以後在文件夾里加上你要轉換的字體,如微軟雅黑的tff文件npm

 

而後寫一個testYH.js文件在文件夾fontnik裏,

內容以下(來自猿基地):

[javascript] view plain copy

  1. <span style="font-size:14px;">var fontnik = require('.');  
  2.   
  3.   
  4. var fs = require('fs');  
  5.   
  6.   
  7. var path = require('path');  
  8.   
  9.   
  10.   
  11.   
  12.   
  13.   
  14. var convert = function(fileName, outputDir) {  
  15.   
  16.   
  17.     var font = fs.readFileSync(path.resolve(__dirname + "/" + fileName));  
  18.   
  19.   
  20.     output2pbf(font, 0, 255, outputDir);  
  21.   
  22.   
  23. }  
  24.   
  25.   
  26.   
  27.   
  28.   
  29.   
  30. function output2pbf(font, start, end, outputDir) {  
  31.   
  32.   
  33.     if (start > 65535) {  
  34.   
  35.   
  36.         console.log("done!");  
  37.   
  38.   
  39.         return;  
  40.   
  41.   
  42.     }  
  43.   
  44.   
  45.     fontnik.range({font: font, start: start, end: end}, function(err, res) {  
  46.   
  47.   
  48.         var outputFilePath = path.resolve(__dirname + "/" + outputDir + start + "-" + end + ".pbf");  
  49.   
  50.   
  51.         fs.writeFile(outputFilePath, res, function(err){  
  52.   
  53.   
  54.             if(err) {  
  55.   
  56.   
  57.                 console.error(err);  
  58.   
  59.   
  60.             } else {  
  61.   
  62.   
  63.                 output2pbf(font, end+1, end+1+255, outputDir);  
  64.   
  65.   
  66.             }  
  67.   
  68.   
  69.         });  
  70.   
  71.   
  72.     });  
  73.   
  74.   
  75. }  
  76.   
  77.   
  78. convert("./fonts/YaHei/MSYaHei.ttf", "./Microsoft YaHei/");  
  79.   
  80. 做者:猿基地  
  81. 連接:http://www.jianshu.com/p/23634e54487e  
  82. 來源:簡書  
  83. 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處</span><span style="font-size: 16px;">。</span>  

以後運行: node mutest.js

就能夠獲得轉換後的一堆pdf文件,把它們放在tomcat裏的文件夾「YaHei」下面

以後,在html里加上:

[html] view plain copy

  1. "glyphs": "http://localhost:8080/mapboxTest/mapbox本地化/font/{fontstack}/{range}.pbf",  


[html] view plain copy

  1. <span style="font-size:14px;"> "text-font": ["YaHei"],</span>  

就能夠啦!!!

相關文章
相關標籤/搜索