從零開(kāi)始構(gòu)建一個(gè)GIS應(yīng)用程序

摘要:本文主要介紹OpenLayers的使用。
一、一個(gè)簡(jiǎn)單的例子(基于ES6語(yǔ)法環(huán)境)

const { Vector as VectorSource, OSM } = window.ol.source;`
const { Feature } = window.ol;
const { Point } = window.ol.geom;
const { fromLonLat } = window.ol.proj;
const { Vector as VectorLayer, Tile as TileLayer } = window.ol.layer;
const { View } = window.ol;
const { Style } = window.ol.style;

const source = new VectorSource({
  features: [ 
    new Feature({ geometry: new Point(fromLonLat([32, 12])) }),
    new Feature({ geometry: new Point(fromLonLat([32, 12])) }),
    new Feature({ geometry: new Point(fromLonLat([33, 11])) }),
 ]
})
const layer = new VectorLayer({
  source,
  style() {
    return new Style({
      image: new Icon({ src: 'icon.png' })
    })
  }  
})
const map = new Map({ 
  target: 'map',
  layers: [
    new TileLayer({ source: new OSM() }),
    layer
  ],
  view: new View({
    center: fromLonLat([37.41, 8.82]),
    zoom: 4,
  })
})

以上代碼渲染的結(jié)果如下圖所示,在一個(gè)id為map的div容器里渲染出一副底圖并且有3個(gè)目標(biāo)點(diǎn)。

image.png

是不是已經(jīng)被各種構(gòu)造函數(shù)弄的眼花繚亂了?不著急我們慢慢分析。
二、基本概念
1.Map
OpenLayers的核心組件是map(ol.Map)。它被呈現(xiàn)給target容器(例如div,包含地圖的網(wǎng)頁(yè)上的元素)。所有地圖屬性都可以在構(gòu)造時(shí)配置,或者使用setter方法配置,例如setTarget()。

const map = new Map({ target: 'map' })

2.View
Map不會(huì)對(duì)中心,縮放級(jí)別和地圖投影等內(nèi)容負(fù)責(zé),負(fù)責(zé)這些的是View

map.setView(new View({
  center: [0, 0],
  zoom: 2
}));

3.Source
Source表示數(shù)據(jù)源,常用的有ol.source.Vector與ol.source.OSM

const osmSource = new OSM(); //底圖數(shù)據(jù)源

4.Layer
Layer是數(shù)據(jù)的集合與展示,OpenLayers有四種基本類(lèi)型的Layer:

  • ol.layer.Tile - 渲染在網(wǎng)格中提供平鋪圖像的源,這些網(wǎng)格由特定分辨率的縮放級(jí)別組織。
  • ol.layer.Image - 渲染以任意范圍和分辨率提供地圖圖像的源。
  • ol.layer.Vector - 渲染矢量數(shù)據(jù)客戶(hù)端。
  • ol.layer.VectorTile - 渲染作為矢量切片提供的數(shù)據(jù)。
const osmLayer = new TileLayer({source: osmSource});
map.addLayer(osmLayer);

三、進(jìn)階
當(dāng)有了基本的概念后,就可以搭建一個(gè)只有底圖的地圖了,那么如何基于地圖做實(shí)際業(yè)務(wù)的開(kāi)發(fā)呢?列如在指定的經(jīng)緯度展示目標(biāo)點(diǎn),以及移除目標(biāo)點(diǎn)。那就需要更多的類(lèi),比如Icon, Feature, Point,當(dāng)需要做事件響應(yīng)的時(shí)候需要Intereaction,當(dāng)涉及坐標(biāo)的時(shí)候甚至還需要fromLonLat這樣的方法。至于使用哪個(gè)類(lèi),以及這些類(lèi)的實(shí)例有哪些方法,可以參考官網(wǎng)的API文檔。

四、總結(jié)
回過(guò)頭再看我們的例子是不是就清晰很多了?可以看出OpenLayers是基與一系列基本的類(lèi)來(lái)構(gòu)造實(shí)例,這些類(lèi)的實(shí)例又進(jìn)行嵌套組合,最終實(shí)現(xiàn)地圖的渲染。當(dāng)需要?jiǎng)討B(tài)改變地圖的某些展現(xiàn)時(shí),需要對(duì)構(gòu)造出來(lái)的實(shí)例進(jìn)行setter與getter操作。
剛開(kāi)始使用OpenLayer的時(shí)候有太多不適應(yīng),最主要的就是類(lèi)的嵌套太多,明明可以用一個(gè)類(lèi)實(shí)現(xiàn)的配置,非要用2個(gè)甚至3個(gè)類(lèi)來(lái)實(shí)現(xiàn),最終構(gòu)造出很多看起來(lái)沒(méi)有作用的實(shí)例,例如Point, Source, Style這樣的類(lèi)。
后來(lái)才發(fā)現(xiàn)這樣的好處是可以對(duì)邏輯進(jìn)行解耦,可以快速定位業(yè)務(wù)需求,并非過(guò)度設(shè)計(jì),而是恰到好處!

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

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

  • 1 CALayer IOS SDK詳解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi閱讀 5,340評(píng)論 3 23
  • source 是 Layer 的重要組成部分,表示圖層的來(lái)源,也就是服務(wù)地址。除了在構(gòu)造函數(shù)中指定外,還可以使用 ...
    changhr2013閱讀 10,743評(píng)論 1 1
  • 一 同事小李,一直宣揚(yáng)不婚。 共事幾年,小李是一個(gè)自我到骨子里的女人,特別在意生活中所有細(xì)節(jié)。 辦公桌上每周換一束...
    會(huì)飛的果子閱讀 369評(píng)論 3 4
  • 每天早上聽(tīng)到鬧鐘的響聲,眼都不睜的將鬧鐘關(guān)掉,想接著酣睡,但這會(huì)總睡不熟,覺(jué)得心里有事兒,不敢把眼睛深...
    暢游之靈閱讀 229評(píng)論 0 0
  • 無(wú)盡的醇香 打著旋兒地向我走來(lái) 沁人心脾 微苦的相思 深深地浸入我的腦海 永生難忘 這純粹的酒香 一如既往地堅(jiān)守它...
    元初沖沖沖閱讀 104評(píng)論 1 3

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