「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」。
一、前言
由于最近项目需要,需要在vue项目中使用OpenLayers来进行 GIS 地图的开发,网上对 OpenLayers 文章并不算太大,借此机会分享下自己在项目中实际使用的一些心得。
本系列将陆续分享项目过程中实现的一些功能点。 往期目录:
由于项目需要支持海外用户,需要引入其他地图,上一篇中我们引入的高德地图,现在需要再引入一个Bing地图,本文主要介绍如何实现多地图切换功能。
二、具体实现
1、申请BingMap key
使用BingMap需要申请对应的key,在此不多做展开,大家可以直接去 www.bingmapsportal.com/ 申请,方法还是比较简单的。
目前BingMap,非商业用途是不会收费的,可以放心使用。
2、实现Bing地图展示
在src目录下添加utils常用工具函数文件夹,在utils内添加openlayers文件夹,后续openlayers相关的工具函数都放在此目录下。
openlayers目录下新建maptype.js
// maptype.js
import { XYZ, BingMaps } from "ol/source";
let list = [
{
name: "高德地图",
value: new XYZ({
url: "https://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}",
}),
id: "0",
},
{
name: "必应地图",
value: new BingMaps({
key: "BingMap key",
imagerySet: "RoadOnDemand",
}),
id: "1",
},
];
export default list;
将之前Home.vue里配置的高德瓦片地图source跟BingMap的封装成list,后期需要添加其他地图也可直接在此文件中修改。
new BingMaps()为Openlayers提供的api,其他api可查阅官方文档。
接下来修改Home.vue:
// import
import mapType from "@/utils/openlayers/maptype";
// data
data() {
return {
tileLayer: null, // 地图层
mapList: null, // 地图列表
locaMap: "1",
};
},
mounted() {
this.mapList = mapType;
this.tileLayer = new TileLayer({
source: mapType.find((e) => e.id === this.locaMap).value,
});
this.initMap();
},
// methods
initMap() {
this.openMap = new Map({
target: "map",
layers: [this.tileLayer],
view: new View({
center: olProj.fromLonLat([108.945951, 34.465262]),
zoom: 1,
}),
controls: [],
});
...
},
当将locaMap改成"1"时,可以看到地图已经变成了Bing地图了。
3、切换按钮
ok,咱们切换地图的基本功能已经实现,现在我们在页面上实现一个按钮去触发切换地图变换。
这里直接使用element-ui的选择器做,引入element-ui,按需引入Select, Option,然后在页面右下角实现个下拉选择,属于前端基操了,不过多说明 直接贴代码:
// main.js
import "element-ui/lib/theme-chalk/index.css";
import { Select, Option } from "element-ui";
Vue.use(Select);
Vue.use(Option);
// Home.vue
// template
<div class="map-toolbar">
<!-- 地图选择 -->
<el-select v-model="locaMap" style="width: 150px">
<el-option
v-for="item in mapList"
:label="item.name"
:value="item.id"
:key="item.id"
@click.native="setMapSource(item)"
></el-option>
</el-select>
</div>
// methods添加切换地图方法
setMapSource(e) {
this.tileLayer.setSource(e.value);
},
4、存储地图选择
使用过程中往往需要将选择的地图样式存储到本地,这里我们将locaMap存储到localStorage中。
在utils目录下新增webStorage.js
// webStorage.js
const locaMap = "locaMap";
export function getMap() {
return localStorage.getItem(locaMap);
}
export function setMap(e) {
return localStorage.setItem(locaMap, e);
}
暴露存储方法添加到Home.vue中
import { getMap, setMap } from "@/utils/webStorage";
data() {
return {
locaMap: getMap() || "0",
};
},
// 切换地图
setMapSource(e) {
this.tileLayer.setSource(e.value);
setMap(e.id)
},
当然,你也可以同时添加到Vuex,这个可以自行去完成。我这里就不去添加了。
最后
gitee地址:gitee.com/shtao_056/v…
感谢大家阅读
如果能帮助到您,那更是我的万分荣幸。
后面应该会陆续的更新更多的功能使用,以及项目中遇到的一些问题,感兴趣的小伙伴可以点个收藏/关注。