1 Star 41 Fork 11

st19911224/Vue-Openlayers

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
02.md 5.07 KB
一键复制 编辑 原始数据 按行查看 历史

一、前言

由于最近项目需要,需要在vue项目中使用OpenLayers来进行 GIS 地图的开发,网上对 OpenLayers 文章并不算太大,借此机会分享下自己在项目中实际使用的一些心得。

本系列将陆续分享项目过程中实现的一些功能点。 往期目录:

  1. vue+OpenLayers 项目实践(一):基本绘制与点击弹窗

由于项目需要支持海外用户,需要引入其他地图,上一篇中我们引入的高德地图,现在需要再引入一个 Bing 地图,本文主要介绍如何实现多地图切换功能。

二、具体实现

1、申请 BingMap key

使用 BingMap 需要申请对应的 key,在此不多做展开,大家可以直接去 https://www.bingmapsportal.com/ 申请,方法还是比较简单的。

目前 BingMap,非商业用途是不会收费的,可以放心使用。

2、实现 Bing 地图展示

image.png

在 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 地图了。

image.png

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);
},

image.png

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…

感谢大家阅读

如果能帮助到您,那更是我的万分荣幸。

后面应该会陆续的更新更多的功能使用,以及项目中遇到的一些问题,感兴趣的小伙伴可以点个收藏/关注。

Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
JavaScript
1
https://gitee.com/shtao_056/vue-openlayers.git
git@gitee.com:shtao_056/vue-openlayers.git
shtao_056
vue-openlayers
Vue-Openlayers
master

搜索帮助