解決Mapbox GL JS國內(nèi)底圖加載問題 - MineData替換

原文地址:解決Mapbox GL JS國內(nèi)底圖加載問題 - MineData替換

眾所周知,Mapbox GL JS是一個JavaScript庫,它使用WebGL以矢量切片和Mapbox Style渲染交互式地圖。但是,有一種"墻"叫做"GFW",經(jīng)常出現(xiàn)地圖加載不出來的情況,另外,Mapbox使用的是OSM數(shù)據(jù),也就存在邊界線問題。好消息是Mapbox已經(jīng)入駐中國,相信不久就會推出符合中國政府標(biāo)準(zhǔn)的地圖,目前已經(jīng)在移動端推出(Mapbox 發(fā)布中國地圖插件,同時支持 iOS 和 Android 兩大平臺| 附中文文檔)。
但是,目前不是還沒推出嘛,要想加載穩(wěn)定、速度快也有辦法:

  1. 不用Mapbox,加載諸如高德、百度、GeoQ的瓦片地圖服務(wù);
  2. 自己發(fā)布地圖服務(wù),可用GeoServer;
  3. 使用MineData平臺(四維圖新)的數(shù)據(jù)替換。

方法1,不能"自定義地圖樣式",沒有了自定義就沒有了靈魂(心中一萬個舍不得);方法2,數(shù)據(jù)獲取、更新、質(zhì)量都是問題。下面進入方法3......

注冊MineData,發(fā)布地圖

MineData頁面注冊賬號并進入工作臺,如下圖,可以看到很多默認(rèn)樣式。

MindeData工作臺

在"我的地圖"里新增方案并發(fā)布,記住 tokensolution

我的地圖

然后導(dǎo)出樣式文件。


導(dǎo)出樣式文件

修改樣式文件

下載的文件格式如下(完整的已上傳至Github,傳送門 - 9389.json):

{
  "version": 8, // 版本號
  "glyphs": "minemap://fonts/{fontstack}/{range}", // 字體
  "sprite": "minemap://sprite/sprite", // 雪碧圖
  "layers": [], // 圖層
  "sources": {} // 數(shù)據(jù)源
}

這個樣式文件是不能直接使用的,需要做一些修改。

配置變量

請求數(shù)據(jù)源需要token和solution,并且數(shù)據(jù)源的url還有一些區(qū)別,具體配置可在源碼中查到minemap.js,所以定義了以下配置變量,也方便修改。

var CONFIG = {
  API_URL: "http://minedata.cn/minemapapi/v2.0.0/",
  DATA_URL: "http://datahive.minedata.cn/data/",
  ACCESS_TOKEN: '<your access token here>',
  SOLUTION: 9389
};

字體和雪碧圖

{
  "glyphs": config.API_URL + "fonts/{fontstack}/{range}.pbf",
  "sprite": config.API_URL + "sprite/sprite",
}

數(shù)據(jù)源

{
  "source": {
    "Landuse": {
      "tiles": [CONFIG.DATA_URL + "Landuse/{z}/{x}/{y}?token=" + CONFIG.ACCESS_TOKEN + "&solu=" + CONFIG.SOLUTION],
      "type": "vector"
    },
  }
}

樣式?jīng)_突

minemap.js目前版本為v2.0.0,style和最新的Mapbox GL JS存在一些沖突。比如:

  • extrusion → fill-extrusion
  • fill-water,這個估計是minemap自定義的,Mapbox沒有,我直接刪除了
  • filter里的 !arrin!in ,不知道是Mapbox去掉了,還是minemap自定義的,我直接改為 !inin 了,目前未發(fā)現(xiàn)問題,發(fā)現(xiàn)問題再看

附:in!in 是數(shù)據(jù)源要素屬性中存放的是字符串或數(shù)字,過濾條件去判斷存在或不存在這些字符串或數(shù)字;arrin!arrin 是數(shù)據(jù)源要素屬性中存放的是字符串或數(shù)字組成的數(shù)組,過濾條件去判斷要素屬性數(shù)組數(shù)據(jù)中存在或不存在這些過濾內(nèi)容。

修改結(jié)果

修改后的樣式文件9389.js

var map = new mapboxgl.Map({
  container: 'map',
  style: _style, // 修改后的樣式對象,用json路徑會報錯,改為js對象即可
  center: [104.29318, 35.70000],
  zoom: 4,
  minZoom: 3
}); 

加載完成,速度很快!


結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • guess what 如果有一臺時光機,我想馬上穿梭到 你身邊 十米的距離 只是想 陪...
    橘子醬1988閱讀 272評論 0 0
  • 45 我們一起神翻譯 Ⅱ. 多余修飾語(Unnecessary Modifiers) 文章中的冗詞除了上一章所提到...
    123逍遙游閱讀 475評論 0 2
  • “菌湯,肥牛,午餐肉,蝦滑,再來一杯可樂?!北緛硐爰訋讟铀夭耍瑓s發(fā)現(xiàn)這些已足夠填滿我的味蕾。 作為“吃辣會臉紅成熟...
    戚宴閱讀 320評論 0 1

友情鏈接更多精彩內(nèi)容