移動(dòng)端使用openlayers加載手繪地圖

除了二維平面圖、衛(wèi)星圖外涮坐,三維地圖凄贩、手繪地圖等新地圖形式也開(kāi)始出現(xiàn)在各應(yīng)用中。手繪地圖能夠快速定制化的呈現(xiàn)出特定區(qū)域的路線袱讹、交通疲扎、建筑、景點(diǎn)等捷雕,對(duì)于景區(qū)導(dǎo)覽椒丧、旅游觀光和規(guī)劃等場(chǎng)景,具有良好的應(yīng)用前景救巷。最近做了個(gè)關(guān)于手繪地圖的項(xiàng)目壶熏,使用 openlayers 渲染,加載速度和渲染效果都很不錯(cuò)浦译。

參考資料:
openlayers 文檔地址:https://openlayers.org/en/latest/apidoc/


一棒假、手繪地圖繪制、參數(shù)設(shè)置

繪圖人員繪制完地圖并配準(zhǔn)后精盅,發(fā)布到 GeoServer(一款基于 java 的開(kāi)源 GIS 工具集)帽哑,需在 GeoServer 上設(shè)置好投影坐標(biāo)系(EPSG:3857即墨卡托坐標(biāo)系,EPSG:4326即WGS84坐標(biāo)系)叹俏、地圖瓦片格式妻枕、坐標(biāo)軸范圍、地圖原點(diǎn)她肯、地圖層級(jí)佳头、分辨率等參數(shù),一般由后臺(tái)人員設(shè)置晴氨。

注意:以上地圖參數(shù)一般由后臺(tái)人員通過(guò)接口傳給前端康嘉,但有時(shí)傳過(guò)來(lái)的數(shù)據(jù)可能不全,此時(shí)必須問(wèn)清楚或者自己去 GeoServer 上看籽前,加載地圖時(shí)如果出現(xiàn)問(wèn)題基本是因?yàn)槁┝藚?shù)或者參數(shù)錯(cuò)誤亭珍。

二、openlayers 加載手繪地圖

1枝哄、項(xiàng)目引入 openlayers
首先npm 安裝 openlayers

npm install ol

注意肄梨,在 vue 中必須逐一聲明所需的 openlayers 庫(kù)的對(duì)象和方法才能正常使用

import Map from 'ol/Map.js'        // 無(wú)法像普通庫(kù)那樣直接 import ol from 'ol' 后調(diào)用里面的對(duì)象和方法 
import View from 'ol/View.js'
import Vectors from 'ol/layer/Vector.js'
import { asString } from 'ol/color'
import { fromLonLat, Projection } from 'ol/proj.js'

2、加載手繪地圖
手繪地圖以 WMTS (Web Map Tile Service, Web 地圖瓦片形式)加載挠锥,先創(chuàng)建一個(gè)類型為 WMTS 的圖層資源众羡,再將其放入創(chuàng)建的 Map 對(duì)象的圖層資源集合中。

// 單獨(dú)引入要使用的對(duì)象和方法
import Map from 'ol/Map.js'
import View from 'ol/View.js'
import { fromLonLat, Projection } from 'ol/proj.js'
import { WMTS, Vector } from 'ol/source.js'
import WMTSTileGrid from 'ol/tilegrid/WMTS.js'
import TileLayer from 'ol/layer/Tile.js'


/*配置 WMTS 圖層資源參數(shù)
 *@param{object}  data  后臺(tái)接口傳過(guò)來(lái)的地圖參數(shù)
 *@return {object} 返回創(chuàng)建的 WMTS 圖層資源對(duì)象
*/
initWMTSLayer(data) {
    const projection = new Projection({         // 地圖的投影坐標(biāo)系
    code: 'EPSG:4326',               // 類型可以是墨卡托坐標(biāo)系或WGS84坐標(biāo)系
    units: 'm',                              // 坐標(biāo)單位
        axisOrientation: 'neu'           // 坐標(biāo)軸方向
    })
    // 設(shè)置分辨率數(shù)組蓖租,這里后臺(tái)傳過(guò)來(lái)的是以逗號(hào)分隔的字符串
    const resolutions = data.layerCoordinates.split(',').map(item => +item)
    // 設(shè)置地圖瓦片矩陣Id
    const gridIds = data.gridsetIds.split(',').map(item => item.replace(/\s+/g, '')
    const tilesGrid = new WMTSTileGrid({            // 地圖瓦片網(wǎng)格對(duì)象
         tileSize: [256, 256],              // 瓦片大小
         origin: [-2.003750834E7, 2.003750834E7],            // 切片原點(diǎn)
         resolutions: resolutions,
         matrixIds: gridIds
    }),
    // 創(chuàng)建 WMTS 圖層資源
    const source = new WMTS({
        url: data.url              // 地圖服務(wù)的地址
        layer: data.layerName           // 地圖圖層的名稱
        matrixSet: data.gridsetName      // 地圖瓦片矩陣
        format: 'image/png'       // 地圖瓦片的格式粱侣,可以接口傳過(guò)來(lái)也可以前端寫(xiě)死
        projection: projection,
        tileGrid: tilesGrid,
        wrapX: true         
    })
    return source
}


/*創(chuàng)建 Map 對(duì)象羊壹,將配置好的 WMTS 圖層資源加入到圖層合集中
*@param{object}  data  后臺(tái)接口傳過(guò)來(lái)的地圖參數(shù)
*/
initMap(data) {
    const projection = new Projection({         // 地圖的投影坐標(biāo)系
    code: 'EPSG:4326',               // 類型可以是墨卡托坐標(biāo)系或WGS84坐標(biāo)系
    units: 'm',                              // 坐標(biāo)單位
        axisOrientation: 'neu'           // 坐標(biāo)軸方向
    })
    // 設(shè)置地圖可拖動(dòng)的范圍
    const leftBottom = data.leftBottom.split(',')
    const rightTop = data.rightTop.split(',')
    // 創(chuàng)建地圖對(duì)象
    this.map = new Map({          
        target: 'map',
        interactions: defaultInteractions({       // 禁止旋轉(zhuǎn)
            altShiftDragRotate: false,
            pinchRotate: false
        }),
        view: new View({
        center: data.center.split(','),                // 設(shè)置地圖中心坐標(biāo)
        zoom: data.minLevel || data.defaultLevel,          // 設(shè)置地圖打開(kāi)默認(rèn)的層級(jí)
        minZoom: data.minLevel,                 // 設(shè)置最小縮放層級(jí)
        maxZoom: data.maxLevel,               // 設(shè)置最大縮放層級(jí)
            projection: projection,             // 設(shè)置投影坐標(biāo)系
            extent: [+leftBottom[0], +leftBottom[1], +rightTop[0], +rightTop[1]]  // 拖動(dòng)范圍
        }),
        layers: [                   // 將創(chuàng)建好的 WMTS 圖層資源放入地圖圖層合集中
            new TileLayer({
            source: this.initWMTSLayer(data)
          })
        ]
    })
    // 地圖打開(kāi)后移動(dòng)到要顯示的位置
    this.map.getView().animate({
        center: data.location.split(','),          // 目標(biāo)位置的坐標(biāo)
        duration: data.duration,               // 移動(dòng)動(dòng)畫(huà)時(shí)長(zhǎng)
        zoom: data.minLevel || data.defaultLevel      // 地圖縮放層級(jí) 
    })
}

以上,實(shí)現(xiàn)加載手繪地圖后齐婴,移動(dòng)至指定經(jīng)緯度油猫。


手繪地圖.png

這樣就完成了手繪地圖底圖的加載,后續(xù)如何為地圖添加標(biāo)注(含聚合標(biāo)注)柠偶、覆蓋物及路線等情妖,可以查看我的另一篇文章:http://www.reibang.com/p/4af2a52a0fc6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诱担,隨后出現(xiàn)的幾起案子毡证,更是在濱河造成了極大的恐慌,老刑警劉巖该肴,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件情竹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡匀哄,警方通過(guò)查閱死者的電腦和手機(jī)秦效,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)涎嚼,“玉大人阱州,你說(shuō)我怎么就攤上這事》ㄌ荩” “怎么了苔货?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)立哑。 經(jīng)常有香客問(wèn)我夜惭,道長(zhǎng),這世上最難降的妖魔是什么铛绰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任诈茧,我火速辦了婚禮,結(jié)果婚禮上捂掰,老公的妹妹穿的比我還像新娘敢会。我一直安慰自己,他們只是感情好这嚣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布鸥昏。 她就那樣靜靜地躺著,像睡著了一般姐帚。 火紅的嫁衣襯著肌膚如雪吏垮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音惫皱,去河邊找鬼像樊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛旅敷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颤霎,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼媳谁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了友酱?” 一聲冷哼從身側(cè)響起晴音,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缔杉,沒(méi)想到半個(gè)月后锤躁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡或详,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年系羞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霸琴。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡椒振,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梧乘,到底是詐尸還是另有隱情澎迎,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布选调,位于F島的核電站夹供,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏仁堪。R本人自食惡果不足惜哮洽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枝笨。 院中可真熱鬧袁铐,春花似錦、人聲如沸横浑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)徙融。三九已至洒缀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背树绩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工萨脑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饺饭。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓渤早,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瘫俊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹊杖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359