Mapbox 作為現如今比較流行的地圖框架為我們提供了漂亮的個性化地圖,在平常的使用過程中可以方便的接入高德/谷歌等矢量切片地圖。由於Mapbox地圖數據來源於Open Street Map等國外廠商,中國地圖POI/道路等信息都不全,造成在實際項目中使用很不精細。對比國內互聯網地圖廠商,百度和高德都提供了自有格式的矢量地圖,如何解析其數據,再將數據PBF化,就是我們重點研究的問題了。本文作為學術研究,將探討下解析高德矢量地圖,並PFB化。
- 打開高德地圖,我們可以看到地圖數據有以下兩種請求格式:
1. mapType=normal&v=2&style=5&rd=1&flds=poilabel,roadlabel&t= 2. mapType=normal&v=2&style=5&rd=1&flds=region,building,road&t=
第一種格式是用來請求標志類的,包括POI 道路標注,第二種數據格式是用來請求區域、建築面數據、道路信息的。
- url 參數t后面就是請求的行列號和地圖層級。**注意:**這個行列號是經過加密的。
- 請求第一種格式的URL,通過分析返回的數據結構,可以得到每組JSON 數據是通過|連接的,從下標為1的數據進行JSON反序列化,得到的POI 和道路標注數據。如下圖
再進一步研究得出下標為0的就是POI數據,下標為1的是標注的顏色(也是加密的),下標為4的就是POI 的分類,分類為labels:pois的興趣點,二級分類是下標為5的數據。 分析POI數據如下圖
下標為0 的是標注名稱,下標為1的是坐標信息(加密),下標為2 為文字偏移量,下標3為POI 的圖片的位置和偏移量。
4. 過同樣的分析手段,我們得到了高德地圖的各個元素數據,接下來進行PBF序列化數據,在這之前先考慮下Mapbox的Style樣式問題。
- sprite Json 文件和圖片文件。高德地圖中POI 所有的圖標都在一個文件中icon-normal-small.png,每個圖標的大小為24×24,計算POI 圖標生成sprite Json文件。
- mapbox 圖層大致可分為地圖背景、region、road、building、poi、road_label,當然根據高德數據格式可以划分的更細,比如可以將poi 分為19個小類和區域標注、城市、區縣鄉鎮,村庄等。這樣的分類和高德提供的風格化地圖樣式一樣的了。 同時我們可以加入自定義的行政區背景地圖使得地圖更加的漂亮。
解決了以上兩個問題后,就可以進行PBF序列化數據 新建java web 項目,引入java-vector-tile jar 包,編寫相關代碼,發布服務,再使用mapbox 接入服務,此致mapbox成功接入了高德矢量化地圖。
遺留問題:
1)高德地圖中將道路和道路標注分開,且道路標注是多個文字,使得mapbox 中道路的文字顯示不全。
2)道路數據不夠精細,導致地圖在大比例尺下道路與道路之間有間隙。
3)建築物鋸齒過於明顯。
4)對於區縣繪制矩形底圖需要動態計算暫時未實現。