接着上一篇文章。地圖加載成功以後,接下來要開始對對地圖的常見功能的實現,一個地圖的基本功能包括:地圖顯示,平移,放大,縮小,定位 等功能。javascript
一般 WebGIS 中地圖平移是最爲基本且經常使用的功能,地圖會默認開啓平移功能。一般狀況下都不須要開發者本身去實現 平移的功能。vue
放大,縮小也同樣,地圖一般會默認開啓此項功能。而大多數狀況下,WebGIS 庫會提供一些如圖所示的控件來實現一級一級地放大的功能。所以, 放大與縮小實現的辦法有兩種。java
自帶的控件git
L.map('map', {
zoomControl: true,
scrollWheelZoom:true //默認開啓鼠標滾輪縮放
});
複製代碼
經過地圖的API實現github
// 逐級放大, delta 默認 1
map.zoomIn( ?delta )
// 逐級縮小, delta 默認 1
map.zoomOut( ?delta )
複製代碼
實現很簡單,默認狀況下 Leaflet地圖對象的 zoomControl
是開啓的。一般狀況下時須要將 zoomControl
關閉。在咱們的工程中則應該工程的這個位置去控制:bash
// src/views/Map.vue
<template>
<div class="map-container" id="map-container"></div>
</template>
<script>
// @ is an alias to /src
export default {
name: "mapView",
components: {},
data() {
return {
map: null,
OSMUrl: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
};
},
mounted() {
this.map = this.$utils.map.createMap("map-container", {
zoomControl: true
});
this.$utils.map.createTileLayer(this.map, this.OSMUrl, {});
this.map.setView([51.505, -0.09], 13);
}
};
</script>
<style lang="less">
.map-container {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
</style>
複製代碼
大多數時候,項目中爲了配合總體的UI風格,須要實現自定義控件的樣式來實現縮放工。所以,這裏結合Vuejs的特性,我自定義了一個縮放功能的組件。組件的功能包括,放大,縮小,以及回到初始化點。less
// src/components/NavigationCtrl.vue
<template>
<div class="map-navigation">
<ul>
<li @click="$emit('zoomIn')">+</i>
<li @click="$emit('resetMap')">·</i>
<li @click="$emit('zoomOut')">-</i>
</ul>
</div>
</template>
<script>
export default {
name: "mapNavigation"
};
</script>
<style lang="less">
.map-navigation {
position: absolute;
left: 15px;
top: 15px;
z-index: 999;
width: 30px;
box-shadow: 0px 0px 50px 2px rgba(0, 0, 0, 0.35);
background-color: #fff;
ul {
padding: 0;
margin: 0;
list-style: none;
li {
width: 30px;
height: 28px;
font-size: 16px;
line-height: 28px;
cursor: pointer;
}
li:hover {
background-color: rgb(212, 224, 246);
}
}
}
</style>
複製代碼
而後在 map.vue
引用組件,這裏須要注意 Vuejs 中父組件與子組件之間的事件綁定:post
// src/views/Map.vue
<template>
<div class="map-container">
<div id="map-container"></div>
<NavigationCtrl @zoomIn="zoomIn" @zoomOut="zoomOut" @resetMap="resetMap"></NavigationCtrl>
</div>
</template>
<script>
// @ is an alias to /src
import NavigationCtrl from "@/components/NavigationCtrl.vue";
export default {
name: "mapView",
components: { NavigationCtrl },
data() {
return {
map: null,
OSMUrl: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
};
},
mounted() {
this.map = this.$utils.map.createMap("map-container", {
zoomControl: false
});
this.$utils.map.createTileLayer(this.map, this.OSMUrl, {});
this.map.setView([51.505, -0.09], 13);
},
methods: {
zoomIn() {
this.map.zoomIn();
},
zoomOut() {
this.map.zoomOut();
},
resetMap() {
//
this.map.setView([51.505, -0.09], 13);
}
}
};
</script>
<style lang="less">
.map-container {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
#map-container {
width: 100%;
height: 100%;
}
</style>
複製代碼
這樣基本上開始提到的 地圖顯示,平移,放大,縮小,定位 就算都完成了。最後一個定位除了使用 setView
方法以外,也可用根據具體的需求採用panTo
, flyTo
等方法得到更好的交互效果。ui
panTo | flyTo |
---|---|
以上就是第二章的所有內容,這些功能過度簡單基礎,顯得有點無聊。可WebGIS地圖中不少實際業務中的功能都是一些簡單的功能組合而成。後續的博文中也會涉及到部分複雜的功能,請看到的各位不吝賜教。this
(一) Vue-CLI and Leaflet:起步 - 在 Vue-CLI 中使用 Leaflet
(二) Vue-CLI and Leaflet:地圖基本操做(放大,縮小,平移,定位等)
(三) Vue-CLI and Leaflet: 添加 marker, polyline, polygon
(四) Vue-CLI and Leaflet: 添加 tooltips 和 popup
(七) Vue-CLI and Leaflet: 面 繪 制
(八) Vue-CLI and Leaflet :加載 Esri ArcGIS Map Service
(九) Vue-CLI and Leaflet: 圖層控制基本功能的實現
(十) Vue-CLI and Leaflet: AGS 屬性查詢與點圖查詢
(十一)Vue-CLI and Leaflet: 點聚合 Leaflet.markercluster
源碼請參看 個人GitHub,因爲文章是一邊coding,一邊寫的因此 Github 裏面的源碼可能有點亂,能夠根據功能來找對應的代碼。後面會陸續整理完善。