openlayers3教材詳解及demo(完整)
OpenLayers 3對OpenLayers網絡地圖庫進行了根本的從新設計。版本2雖然被普遍使用,但從JavaScript開發的早期發展階段開始,已日益現實出它的落後。 OL3已運用現代的設計模式從底層重寫。
最初的版本旨在支持第2版提供的功能,提供大量商業或免費的瓦片資源以及最流行的開源矢量數據格式。與版本2同樣,數據能夠被任意投影。最初的版本還增長了一些額外的功能,如可以方便地旋轉地圖以及顯示地圖動畫。
OpenLayers 3同時設計了一些主要的新功能,如顯示三維地圖,或使用WebGL快速顯示大型矢量數據集,這些功能將在之後的版本中加入。
首先須要明白的一點是,Source和Layer是一對一的關係,有一個Source,必然須要一個Layer,而後把這個Layer添加到Map上,就能夠顯示出來了。經過官網的API搜索ol.source能夠發現有不少不一樣的Source,但概括起來共三種:ol.source.Tile,ol.source.Image和ol.source.Vector。
- ol.source.Tile對應的是瓦片數據源,如今網頁地圖服務中,絕大多數都是使用的瓦片地圖,而OpenLayers 3做爲一個WebGIS引擎,理所固然應該支持瓦片。
- ol.source.Image對應的是一整張圖,而不像瓦片那樣不少張圖,從而無需切片,也能夠加載一些地圖,適用於一些小場景地圖。
- ol.source.Vector對應的是矢量地圖源,點,線,面等等經常使用的地圖元素(Feature),就囊括到這裏面了。這樣看來,只要這兩種Source就能夠搞定80%的需求了。
咱們先了解最爲複雜的ol.source.Tile,其葉子節點類有不少,大體能夠分爲幾類:
- 在線服務的Source,包括ol.source.BingMaps(使用的是微軟提供的Bing在線地圖數據),ol.source.MapQuest(使用的是MapQuest提供的在線地圖數據)(注: 因爲MapQuest開始收費,ol v3.17.0就移除了ol.source.MapQuest),ol.source.OSM(使用的是Open Street Map提供的在線地圖數據),ol.source.Stamen(使用的是Stamen提供的在線地圖數據)。沒有本身的地圖服務器的狀況下,可直接使用它們,加載地圖底圖。
// 建立地圖
new ol.Map({
// 設置地圖圖層
layers: [
// 建立一個使用Open Street Map地圖源的瓦片圖層
new ol.layer.Tile({source: new ol.source.OSM()})
],
// 設置顯示地圖的視圖
view: new ol.View({
center: [0, 0], // 定義地圖顯示中心於經度0度,緯度0度處
zoom: 2 // 而且定義地圖顯示層級爲2
}),
// 讓id爲map的div做爲地圖的容器
target: 'map'
});
//地圖聯動效果
<p>地圖1</p><div id="map1" style="width: 100%"></div><p>地圖2</p><div id="map2" style="width: 100%"></div><script>
// 建立一個視圖
var view = new ol.View({
center: [0, 0],
zoom: 2
});
// 建立第一個地圖
new ol.Map({
layers: [
new ol.layer.Tile({source: new ol.source.OSM()})
],
view: view,
target: 'map1'
});
// 建立第二個地圖
new ol.Map({
layers: [
new ol.layer.Tile({source: new ol.source.OSM()})
],
view: view,
target: 'map2'
});
代碼只有一點不一樣,即兩個ol.Map使用了同一個view,就是這麼神奇。
view部分
<body>
<div id="map" style="width: 100%, height: 400px"></div>
<div id="navigate-container">
<input type="button" onClick="moveToLeft();" value="左移" />
<input type="button" onClick="moveToRight();" value="右移" />
<input type="button" onClick="moveToUp();" value="上移" />
<input type="button" onClick="moveToDown();" value="下移" />
<input type="button" onClick="moveToChengDu();" value="移到成都" />
<input type="button" onClick="zoomIn();" value="放大" />
<input type="button" onClick="zoomOut();" value="縮小" />
</div>
<script>
var map = new ol.Map({
layers: [
new ol.layer.Tile({source: new ol.source.OSM()})
],
view: new ol.View({
// 設置成都爲地圖中心,此處進行座標轉換, 把EPSG:4326的座標,轉換爲EPSG:3857座標,由於ol默認使用的是EPSG:38 57座標
center: ol.proj.transform([104.06, 30.67], 'EPSG:4326', 'EPSG:3857'),
zoom: 10
}),
target: 'map'
});
// 向左移動地圖
function moveToLeft() {
var view = map.getView();
var mapCenter = view.getCenter();
// 讓地圖中心的x值增長,便可使得地圖向左移動,增長的值根據效果可自由設定
mapCenter[0] += 50000;
view.setCenter(mapCenter);
map.render();
}
// 向右移動地圖
function moveToRight() {
var view = map.getView();
var mapCenter = view.getCenter();
// 讓地圖中心的x值減小,便可使得地圖向右移動,減小的值根據效果可自由設定
mapCenter[0] -= 50000;
view.setCenter(mapCenter);
map.render();
}
// 向上移動地圖
function moveToUp() {
var view = map.getView();
var mapCenter = view.getCenter();
// 讓地圖中心的y值減小,便可使得地圖向上移動,減小的值根據效果可自由設定
mapCenter[1] -= 50000;
view.setCenter(mapCenter);
map.render();
}
// 向下移動地圖
function moveToDown() {
var view = map.getView();
var mapCenter = view.getCenter();
// 讓地圖中心的y值增長,便可使得地圖向下移動,增長的值根據效果可自由設定
mapCenter[1] += 50000;
view.setCenter(mapCenter);
map.render();
}
// 移動到成都
function moveToChengDu() {
var view = map.getView();
// 設置地圖中心爲成都的座標,便可讓地圖移動到成都
view.setCenter(ol.proj.transform([104.06, 30.67], 'EPSG:4326', 'EPSG:3857'));
map.render();
}
// 放大地圖
function zoomIn() {
var view = map.getView();
// 讓地圖的zoom增長1,從而實現地圖放大
view.setZoom(view.getZoom() + 1);
}
// 縮小地圖
function zoomOut() {
var view = map.getView();
// 讓地圖的zoom減少1,從而實現地圖縮小
view.setZoom(view.getZoom() - 1);
}
</script></body>
限制地圖範圍
<body>
<div id="map" style="width: 100%"></div>
<script>
new ol.Map({
layers: [
new ol.layer.Tile({source: new ol.source.OSM()})
],
view: new ol.View({
// 設置地圖中心範圍
extent: [102, 29, 104, 31],
// 設置成都爲地圖中心
center: [104.06, 30.67],
projection: 'EPSG:4326',
zoom: 10
}),
target: 'map'
});
</script></body>
就只是添加了 extent: [102, 29, 104, 31],這行代碼就實現了功能(仔細看extent參數的說明)。
extent參數類型爲[minX, minY, maxX, maxY]的ol.Extent,很容易記住。
限制地圖縮放級別
<body>
<div id="map" style="width: 100%"></div>
<script>
new ol.Map({
layers: [
new ol.layer.Tile({source: new ol.source.OSM()})
],
view: new ol.View({
// 設置成都爲地圖中心
center: [104.06, 30.67],
projection: 'EPSG:4326',
zoom: 10,
// 限制地圖縮放最大級別爲14,最小級別爲10
minZoom: 10,
maxZoom: 14
}),
target: 'map'
});
</script></body>
自適配區域
<body>
<div id="map" style="width: 100%"></div>
<input type="button" value="顯示成都" onclick="fitToChengdu();" />
<script>
var map = new ol.Map({
layers: [
new ol.layer.Tile({source: new ol.source.OSM()})
],
view: new ol.View({
// 設置成都爲地圖中心
center: [104.06, 30.67],
projection: 'EPSG:4326',
zoom: 10
}),
target: 'map'
});
function fitToChengdu() {
// 讓地圖最大化徹底地顯示區域[104, 30.6, 104.12, 30.74]
map.getView().fit([104, 30.6, 104.12, 30.74], map.getSize());
}
</script></body>
source和Layer部分
// 建立地圖
new
ol.Map({
// 設置地圖圖層
layers: [
// 建立一個使用Open Street Map地圖源的瓦片圖層
new
ol.layer.Tile({source:
new
ol.source.OSM()})
],
// 設置顯示地圖的視圖
view:
new
ol.View({
center: [
0
,
0
],
// 定義地圖顯示中心於經度0度,緯度0度處
zoom:
2
// 而且定義地圖顯示層級爲2
}),
// 讓id爲map的div做爲地圖的容器
target:
'map'
});
//地圖聯動效果
<
p
>
地圖1
</
p
>
<
div
id
=
"map1"
style
=
"width: 100%"
>
</
div
>
<
p
>
地圖2
</
p
>
<
div
id
=
"map2"
style
=
"width: 100%"
>
</
div
>
<
script
>
// 建立一個視圖
var
view =
new
ol.View({
center: [
0
,
0
],
zoom:
2
});
// 建立第一個地圖
new
ol.Map({
layers: [
new
ol.layer.Tile({source:
new
ol.source.OSM()})
],
view: view,
target:
'map1'
});
// 建立第二個地圖
new
ol.Map({
layers: [
new
ol.layer.Tile({source:
new
ol.source.OSM()})
],
view: view,
target:
'map2'
});
代碼只有一點不一樣,即兩個
ol.Map
使用了同一個
view
,就是這麼神奇。
view部分
<
body
>
<
div
id
=
"map"
style
=
"width: 100%, height: 400px"
>
</
div
>
<
div
id
=
"navigate-container"
>
<
input
type
=
"button"
onClick
=
"moveToLeft();"
value
=
"左移"
/>
<
input
type
=
"button"
onClick
=
"moveToRight();"
value
=
"右移"
/>
<
input
type
=
"button"
onClick
=
"moveToUp();"
value
=
"上移"
/>
<
input
type
=
"button"
onClick
=
"moveToDown();"
value
=
"下移"
/>
<
input
type
=
"button"
onClick
=
"moveToChengDu();"
value
=
"移到成都"
/>
<
input
type
=
"button"
onClick
=
"zoomIn();"
value
=
"放大"
/>
<
input
type
=
"button"
onClick
=
"zoomOut();"
value
=
"縮小"
/>
</
div
>
<
script
>
var
map =
new
ol.Map({
layers: [
new
ol.layer.Tile({source:
new
ol.source.OSM()})
],
view:
new
ol.View({
// 設置成都爲地圖中心,此處進行座標轉換, 把EPSG:4326的座標,轉換爲EPSG:3857座標,由於ol默認使用的是EPSG:38 57座標
center: ol.proj.transform([
104.06
,
30.67
],
'EPSG:4326'
,
'EPSG:3857'
),
zoom:
10
}),
target:
'map'
});
// 向左移動地圖
function
moveToLeft
()
{
var
view = map.getView();
var
mapCenter = view.getCenter();
// 讓地圖中心的x值增長,便可使得地圖向左移動,增長的值根據效果可自由設定
mapCenter[
0
] +=
50000
;
view.setCenter(mapCenter);
map.render();
}
// 向右移動地圖
function
moveToRight
()
{
var
view = map.getView();
var
mapCenter = view.getCenter();
// 讓地圖中心的x值減小,便可使得地圖向右移動,減小的值根據效果可自由設定
mapCenter[
0
] -=
50000
;
view.setCenter(mapCenter);
map.render();
}
// 向上移動地圖
function
moveToUp
()
{
var
view = map.getView();
var
mapCenter = view.getCenter();
// 讓地圖中心的y值減小,便可使得地圖向上移動,減小的值根據效果可自由設定
mapCenter[
1
] -=
50000
;
view.setCenter(mapCenter);
map.render();
}
// 向下移動地圖
function
moveToDown
()
{
var
view = map.getView();
var
mapCenter = view.getCenter();
// 讓地圖中心的y值增長,便可使得地圖向下移動,增長的值根據效果可自由設定
mapCenter[
1
] +=
50000
;
view.setCenter(mapCenter);
map.render();
}
// 移動到成都
function
moveToChengDu
()
{
var
view = map.getView();
// 設置地圖中心爲成都的座標,便可讓地圖移動到成都
view.setCenter(ol.proj.transform([
104.06
,
30.67
],
'EPSG:4326'
,
'EPSG:3857'
));
map.render();
}
// 放大地圖
function
zoomIn
()
{
var
view = map.getView();
// 讓地圖的zoom增長1,從而實現地圖放大
view.setZoom(view.getZoom() +
1
);
}
// 縮小地圖
function
zoomOut
()
{
var
view = map.getView();
// 讓地圖的zoom減少1,從而實現地圖縮小
view.setZoom(view.getZoom() -
1
);
}
</
script
>
</
body
>
限制地圖範圍
<
body
>
<
div
id
=
"map"
style
=
"width: 100%"
>
</
div
>
<
script
>
new
ol.Map({
layers: [
new
ol.layer.Tile({source:
new
ol.source.OSM()})
],
view:
new
ol.View({
// 設置地圖中心範圍
extent: [
102
,
29
,
104
,
31
],
// 設置成都爲地圖中心
center: [
104.06
,
30.67
],
projection:
'EPSG:4326'
,
zoom:
10
}),
target:
'map'
});
</
script
>
</
body
>
就只是添加了
extent: [102, 29, 104, 31],
這行代碼就實現了功能(
仔細看
extent
參數的說明
)。
extent
參數類型爲
[minX, minY, maxX, maxY]
的
ol.Extent
,很容易記住。
限制地圖縮放級別
<
body
>
<
div
id
=
"map"
style
=
"width: 100%"
>
</
div
>
<
script
>
new
ol.Map({
layers: [
new
ol.layer.Tile({source:
new
ol.source.OSM()})
],
view:
new
ol.View({
// 設置成都爲地圖中心
center: [
104.06
,
30.67
],
projection:
'EPSG:4326'
,
zoom:
10
,
// 限制地圖縮放最大級別爲14,最小級別爲10
minZoom:
10
,
maxZoom:
14
}),
target:
'map'
});
</
script
>
</
body
>
自適配區域
<
body
>
<
div
id
=
"map"
style
=
"width: 100%"
>
</
div
>
<
input
type
=
"button"
value
=
"顯示成都"
onclick
=
"fitToChengdu();"
/>
<
script
>
var
map =
new
ol.Map({
layers: [
new
ol.layer.Tile({source:
new
ol.source.OSM()})
],
view:
new
ol.View({
// 設置成都爲地圖中心
center: [
104.06
,
30.67
],
projection:
'EPSG:4326'
,
zoom:
10
}),
target:
'map'
});
function
fitToChengdu
()
{
// 讓地圖最大化徹底地顯示區域[104, 30.6, 104.12, 30.74]
map.getView().fit([
104
,
30.6
,
104.12
,
30.74
], map.getSize());
}
</
script
>
</
body
>
source和Layer部分