由于最近项目需要,需要在vue项目中使用OpenLayers来进行 GIS 地图的开发,网上对 OpenLayers 文章并不算太大,借此机会分享下自己在项目中实际使用的一些心得。
本系列将陆续分享项目过程中实现的一些功能点。 往期目录:
由于项目需要支持海外用户,需要引入其他地图,上一篇中我们引入的高德地图,现在需要再引入一个 Bing 地图,本文主要介绍如何实现多地图切换功能。
使用 BingMap 需要申请对应的 key,在此不多做展开,大家可以直接去 https://www.bingmapsportal.com/ 申请,方法还是比较简单的。
目前 BingMap,非商业用途是不会收费的,可以放心使用。
在 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 地图了。
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);
},
使用过程中往往需要将选择的地图样式存储到本地,这里我们将 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…
感谢大家阅读
如果能帮助到您,那更是我的万分荣幸。
后面应该会陆续的更新更多的功能使用,以及项目中遇到的一些问题,感兴趣的小伙伴可以点个收藏/关注。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。