移動(dòng)端地圖技術(shù)

前言

介紹地圖之前我們首先了解它的基本組成。相信大家都了解拼圖游戲的原理霞怀,把一張大圖切割成若干小塊晃跺,然后按照一定的規(guī)則拼接起來(lái)。地圖的原理也是一樣巡验。我搜羅的目前移動(dòng)端比較常見(jiàn)的繪制地圖的方法际插,與大家分享碘耳。

背景

互聯(lián)網(wǎng)地圖服務(wù)商的在線地圖都通過(guò)瓦片的方式提供显设,稱為瓦片地圖服務(wù)。最常見(jiàn)的地圖瓦片是圖片格式的辛辨,現(xiàn)在有的地圖服務(wù)商也提供了矢量的瓦片數(shù)據(jù)捕捂,然后在用戶端使用Canvas渲染成圖片,如node-canvas實(shí)現(xiàn)百度地圖個(gè)性化底圖繪制斗搞。
在進(jìn)行地圖開發(fā)時(shí)指攒,為獲取特定經(jīng)緯度所在區(qū)域的瓦片和獲取瓦片上像素點(diǎn)對(duì)應(yīng)的經(jīng)緯度,經(jīng)常需要進(jìn)行經(jīng)緯度坐標(biāo)與瓦片坐標(biāo)僻焚、像素坐標(biāo)的相互轉(zhuǎn)換允悦。

主要經(jīng)緯度坐標(biāo)系

國(guó)際標(biāo)準(zhǔn)的經(jīng)緯度坐標(biāo)是WGS84,Open Street Map虑啤、外國(guó)版的Google Map都是采用WGS84隙弛;高德地圖使用的坐標(biāo)系是GCJ-02;百度地圖使用的坐標(biāo)系是BD-09狞山。高德地圖和百度地圖都提供了在線的單向坐標(biāo)轉(zhuǎn)換接口全闷,將其他坐標(biāo)系換化到自己的坐標(biāo)系,但這種轉(zhuǎn)換受限于http url請(qǐng)求字段長(zhǎng)度和網(wǎng)絡(luò)請(qǐng)求延遲萍启,批量處理并不實(shí)用总珠。離線相互轉(zhuǎn)換可以通過(guò)開源JavaScript庫(kù)coordtransform實(shí)現(xiàn)屏鳍,誤差在10米左右。
雖然各地圖服務(wù)商經(jīng)緯度坐標(biāo)系不同局服,但某一互聯(lián)網(wǎng)地圖的經(jīng)緯度坐標(biāo)與瓦片坐標(biāo)相互轉(zhuǎn)換只與該地圖商的墨卡托投影和瓦片編號(hào)的定義有關(guān)钓瞭,跟地圖商采用的大地坐標(biāo)系標(biāo)準(zhǔn)無(wú)關(guān)。

瓦片切割和瓦片坐標(biāo)

地圖瓦片具有以下特點(diǎn):

    1. 具有唯一的瓦片等級(jí)(Level)和瓦片坐標(biāo)編號(hào)(tileX, tileY)淫奔。
    1. 瓦片分辨率為256\times256降淮。
    1. 最小的地圖等級(jí)是0,此時(shí)世界地圖只由一張瓦片組成搏讶。
    1. 瓦片等級(jí)越高佳鳖,組成世界地圖的瓦片數(shù)越多,可以展示的地圖越詳細(xì)媒惕。
    1. 某一瓦片等級(jí)地圖的瓦片是由低一級(jí)的各瓦片切割成的4個(gè)瓦片組成系吩,形成了瓦片金字塔。

瓦片坐標(biāo)和經(jīng)緯度坐標(biāo)之間存在關(guān)系妒蔚,而這層關(guān)系是通過(guò)后端接口加密處理并且一一映射后的穿挨,有自己的計(jì)算公式

  • 坐標(biāo)轉(zhuǎn)換圖解
    [圖片上傳失敗...(image-5b8538-1618472263075)]

瓦片地圖等級(jí)范圍

瓦片地圖等級(jí)范圍反映了地圖可縮放的程度。
雖然最小的瓦片等級(jí)是0肴盏,但是部分地圖并不提供0級(jí)或其他較小瓦片等級(jí)的地圖科盛,因?yàn)榇藭r(shí)的世界地圖將會(huì)很小,不能鋪滿用戶設(shè)備窗口菜皂。
經(jīng)過(guò)實(shí)際測(cè)試贞绵,各地圖服務(wù)商的瓦片等級(jí)和測(cè)試鏈接如下:

下圖是百度地圖的一個(gè)瓦片圖片展示:

[圖片上傳失敗...(image-ce75b9-1618472263075)]

  • 瓦片等級(jí)由2的次方來(lái)劃分的,即1到4章母,4到16母蛛,16到
    如圖示意:
    [圖片上傳失敗...(image-fb329e-1618472263075)]

需要注意的問(wèn)題

  • 瓦片像素坐標(biāo)的起始點(diǎn)
  1. 高德地圖、谷歌地圖的瓦片坐標(biāo)起點(diǎn)在左上角乳怎,像素坐標(biāo)(pixelX, pixelY)在瓦片中的起點(diǎn)為左上角彩郊。
  2. 百度地圖中,像素坐標(biāo)(pixelX, pixelY)的起點(diǎn)為左下角蚪缀。

百度地圖技術(shù)介紹

簡(jiǎn)單介紹一個(gè)地圖的底圖的相關(guān)知識(shí)吧秫逝,我們眼中看到的豐富的地圖信息,其中組成地圖的主要元素椿胯,莫過(guò)于地圖的一張張底圖瓦片了筷登。如下圖所示,

一般我們打開了一個(gè)地圖哩盲,其實(shí)際上可能會(huì)像上圖一樣前方,由一堆瓦片組成狈醉。1,2惠险,3苗傅,4表示不同的瓦片。 而某一張瓦片如下圖所示
在線地址:http://developer.baidu.com/map/custom/

百度地圖底圖繪制技術(shù)現(xiàn)狀

要想繪制上面所示的底圖班巩,目前現(xiàn)在主要有兩類技術(shù)

  • 柵格: 也就是傳意義的圖片技術(shù)渣慕,在server端把圖片畫好。瀏覽器使用node-canvas實(shí)現(xiàn)百度地圖個(gè)性化底圖繪制標(biāo)簽拼出來(lái)

  • 矢量:在瀏覽器使用canvas技術(shù)抱慌,將矢量的數(shù)據(jù)逊桦,在瀏覽器完成渲染。它最大的問(wèn)題在于:只支持高端瀏覽器

百度地圖抑进,目前兩種技術(shù)都已經(jīng)實(shí)現(xiàn)强经,如果大家使用的是mapapi,在高端瀏覽器下打開,你會(huì)發(fā)現(xiàn)寺渗,他是使用canvas繪制的匿情。
其中的地圖底圖在IE678等瀏覽器下,就是使用node-canvas在后端繪制出來(lái)的,獲取當(dāng)前繪制經(jīng)緯度信殊,之后通過(guò)接口調(diào)用瓦片炬称,
經(jīng)緯度坐標(biāo)與瓦片坐標(biāo)、像素坐標(biāo)的相互轉(zhuǎn)換涡拘,以平面坐標(biāo)為中間量進(jìn)行轉(zhuǎn)換玲躯。主要代碼為

// Bmap為百度JavaScript API V2.0的地圖對(duì)象
  lnglatToPoint(longitude, latitude) {
    let projection = new BMap.MercatorProjection();
    let lnglat = new BMap.Point(longitude, latitude);
    let point = projection.lngLatToPoint(lnglat);
    return {
      pointX: point.x,
      pointY: point.y
    };
  }

  pointToLnglat(pointX, pointY) {
    let projection = new BMap.MercatorProjection();
    let point = new BMap.Pixel(pointX, pointY);
    let lnglat = projection.pointToLngLat(point);
    return {
      lng: lnglat.lng,
      lat: lnglat.lat
    };
  }

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

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

如圖所示

[圖片上傳失敗...(image-809df1-1618472263075)]

canvas繪制圖片的優(yōu)點(diǎn)

  • 1.它允許我們使用canvas的語(yǔ)法和接口寫成的js代碼鲸伴,放在server跑府蔗。
  • 2.減少大量的DOM操作可以大大提升性能晋控。

如介紹

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('node-canvas實(shí)現(xiàn)百度地圖個(gè)性化底圖繪制');

目前使用canvas的原因有以下幾點(diǎn):

  1. 百度地圖已經(jīng)很好的實(shí)現(xiàn)使用canvas技術(shù)在瀏覽器完成渲染汞窗。

并有不錯(cuò)的展現(xiàn)效果和性能,在移動(dòng)端體驗(yàn)更好赡译。因?yàn)槭噶康臄?shù)據(jù)比請(qǐng)求圖片的體積要小的多

  1. 在canvas的方案下仲吏,已經(jīng)實(shí)現(xiàn)個(gè)性化底圖的繪制效果

底圖繪制由樣式+矢量數(shù)據(jù)組成。只要修改替換樣式文件蝌焚,就可以實(shí)現(xiàn)個(gè)性化地圖的渲染裹唆。

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

展現(xiàn)地圖底圖许帐,必須使用柵格圖實(shí)現(xiàn)。需要有后端技術(shù)來(lái)生成底圖

  1. 由于不樣的樣式要求得到不同的底圖毕谴。就需要圖片是實(shí)時(shí)繪制的成畦,而且要求性能必須好

在線地址:http://api.map.baidu.com/customimage/tile?x=788&y=293&z=12&customid=midnight
可以看的出來(lái)距芬,速度是很快的。
[圖片上傳失敗...(image-b5a7e5-1618472263075)]
(9個(gè)瓦片生成的大圖)

參考資料

  1. 瓦片地圖服務(wù)
  2. node-canvas實(shí)現(xiàn)百度地圖個(gè)性化底圖繪制
  3. 地圖投影的N種姿勢(shì)
  4. 百度地圖API詳解之地圖坐標(biāo)系統(tǒng)
  5. 高德地圖層級(jí)

https://yolkpie.net/2021/03/30/%E7%A7%BB%E5%8A%A8%E7%AB%AF%E5%9C%B0%E5%9B%BE%E6%8A%80%E6%9C%AF/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末循帐,一起剝皮案震驚了整個(gè)濱河市框仔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拄养,老刑警劉巖离斩,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瘪匿,居然都是意外死亡跛梗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門棋弥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茄袖,“玉大人,你說(shuō)我怎么就攤上這事嘁锯∠芟椋” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵家乘,是天一觀的道長(zhǎng)蝗羊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)仁锯,這世上最難降的妖魔是什么耀找? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮业崖,結(jié)果婚禮上野芒,老公的妹妹穿的比我還像新娘。我一直安慰自己双炕,他們只是感情好狞悲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妇斤,像睡著了一般摇锋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上站超,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天荸恕,我揣著相機(jī)與錄音,去河邊找鬼死相。 笑死融求,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的算撮。 我是一名探鬼主播生宛,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼施掏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了茅糜?” 一聲冷哼從身側(cè)響起七芭,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蔑赘,沒(méi)想到半個(gè)月后狸驳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缩赛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年耙箍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酥馍。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辩昆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旨袒,到底是詐尸還是另有隱情汁针,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布砚尽,位于F島的核電站施无,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏必孤。R本人自食惡果不足惜猾骡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望敷搪。 院中可真熱鬧兴想,春花似錦、人聲如沸赡勘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狮含。三九已至顽悼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間几迄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工冰评, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留映胁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓甲雅,卻偏偏與公主長(zhǎng)得像解孙,于是被迫代替她去往敵國(guó)和親坑填。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 夜鶯2517閱讀 127,720評(píng)論 1 9
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月弛姜,有人笑有人哭脐瑰,有人歡樂(lè)有人憂愁,有人驚喜有人失落廷臼,有的覺(jué)得收獲滿滿有...
    陌忘宇閱讀 8,536評(píng)論 28 53
  • 兔子雖然是枚小碩 但學(xué)校的碩士四人寢不夠 就被分到了博士樓里 兩人一間 在學(xué)校的最西邊 靠山 兔子的室友身體不好 ...
    待業(yè)的兔子閱讀 2,603評(píng)論 2 9
  • 信任包括信任自己和信任他人 很多時(shí)候苍在,很多事情,失敗荠商、遺憾寂恬、錯(cuò)過(guò),源于不自信莱没,不信任他人 覺(jué)得自己做不成初肉,別人做不...
    吳氵晃閱讀 6,190評(píng)論 4 8