mapboxgl 互聯(lián)網(wǎng)地圖糾偏插件(三)

先說結(jié)論,結(jié)論當然是:大功告成,喜大普奔??葱Ч麍D:

image

好了,接下來說一下過程

先回顧一下這個系列的 第一篇第二篇

第一篇是直接改的 mapboxgl 源碼,在源碼里面對瓦片的位置進行糾偏,遇到的問題是,地圖旋轉(zhuǎn)時會有錯位,還有瓦片糾偏后屏幕邊緣會有空白。

第二篇是寫了一個 mapboxgl 自定義圖層,遇到的問題是,地圖在大比例尺時,瓦片會瘋狂抖動。

這兩篇文章發(fā)出后,有兩位大牛針對上面的問題,給出了建設性的意見。

一位是思否上的網(wǎng)友“undefined”(這個不是bug,是他的名稱),他在看了第一篇文章后,找出了地圖旋轉(zhuǎn)時瓦片錯位的原因,并給出了解決方法。

image

按照上面的思路,我重新寫了一個不包含旋轉(zhuǎn)參數(shù)的 pixelMatrix 矩陣后,錯位問題解決。

image

解決了錯位后,接下來解決屏幕邊緣出現(xiàn)空白的問題。

我的思路是,在計算瓦片的顯示范圍時,對顯示范圍進行偏移,讓程序按偏移的范圍去請求瓦片,這樣后續(xù)瓦片糾偏后,就不會出現(xiàn)空白區(qū)域了。

在二維地圖中,瓦片顯示的范圍是根據(jù)屏幕 4 個角的坐標直接計算的。但 mapboxgl 是三維地圖,三維地圖的顯示范圍是根據(jù)相機的參數(shù)來計算的,需要判斷相機視椎體和瓦片的相交關(guān)系,這里還沒有整明白。

所以,這個方案就又卡這兒了。

另一位網(wǎng)友是 mapboxgl 技術(shù)交流群里的“可樂瓶里泡枸杞”,他指出了第2篇文章中,大比例尺時地圖抖動問題的原因,并給出了解決思路。

image

上圖的博客鏈接中詳細說明了地圖抖動的原因,大概意思是:webgl 只支持 float32 精度,而 JS 默認是采用 float64 精度,JS 中的高精度數(shù)字向webgl 傳輸時會造成精度損失,這種損失帶來的影響就是地圖抖動,比例尺越大抖動的越厲害。

如何能避免精度的損失?博客中介紹了 deck.gl 的做法:

  1. 將經(jīng)緯度坐標轉(zhuǎn)墨卡托坐標這一步,放到 webgl 中來實現(xiàn),目的是為了使用 GPU 計算

  2. 在比例尺大于12級時,不再直接使用墨卡托坐標,而是計算墨卡托坐標和屏幕中心點的相對位置。使用 float32 的精度保存相對位置是完全沒有問題的,這樣就規(guī)避了精度損失的問題

  3. 重寫 view 和 Projection 矩陣

按這個思路,我將上次寫的 mapboxgl 自定義圖層糾偏插件進行了改造,最終大比例尺時地圖不再抖動了。

但又很快遇到了新問題:拖動地圖時,瓦片和鼠標的移動距離不一致。

image

返回去看那篇博客的在線示例,也有同樣的問題

image

既然這樣,那就解決問題吧,瞅了瞅代碼,總覺得下面這兩行不順眼,

image

不除 2 了試試,哈哈,一招命中,問題解決。

image

至此,mapboxgl 對高德地圖瓦片糾偏的問題成功解決,我把他封裝成了插件,方便大家使用。GIS兵器庫中又多了一件趁手的兵器。

這個插件目前不僅僅是支持高德地圖瓦片,所有 gcj02 坐標的地圖瓦片都支持。

當然,作為插件來講,它還不夠完美,目前發(fā)現(xiàn)有這么幾個可以完善的地方:

  1. 跟 mapboxgl 自帶的瓦片圖層相比,瓦片在縮放時有點發(fā)虛

  2. 地圖縮放時,瓦片沒有過渡效果

  3. 移除圖層后,有時會莫名其妙的突然出現(xiàn)

  4. 在手機端顯示有問題

這些問題,后續(xù)會慢慢完善。也歡迎大家一起參與進來,多提 Issues 和 Pull requests

地址

在線示例:http://gisarmory.xyz/blog/index.html?demo=mapboxglMapCorrection3

插件地址:http://gisarmory.xyz/blog/index.html?source=mapboxglMapCorrection3

總結(jié)

  1. 解決 mapboxgl 中高德地圖瓦片偏移的問題有兩個方案,方案一改源碼,方案二寫自定義圖層

  2. 方案一有了突破,解決了地圖旋轉(zhuǎn)時瓦片錯位的問題,但偏移后屏幕邊緣空白的問題沒有解決

  3. 方案二在成功解決了地圖大比例尺上瓦片抖動的問題后,最終實現(xiàn)了瓦片的糾偏

  4. 將方案二的代碼封裝成了插件,方便大家使用


原文地址:http://gisarmory.xyz/blog/index.html?blog=mapboxglMapCorrection3

關(guān)注《GIS兵器庫》, 只給你網(wǎng)上搜不到的GIS知識技能。

本文章采用 知識共享署名-非商業(yè)性使用-相同方式共享 4.0 國際許可協(xié)議 進行許可。歡迎轉(zhuǎn)載、使用、重新發(fā)布,但務必保留文章署名《GIS兵器庫》(包含鏈接: http://gisarmory.xyz/blog/),不得用于商業(yè)目的,基于本文修改后的作品務必以相同的許可發(fā)布。

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

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

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