vue+mapboxgl 鹰眼展示

一、实现效果

话不多说直接上图,查看了 这个博主地址,openlayers3 自定义鹰眼缩略图_凡事有果必有因-CSDN博客_openlayers鹰眼图  他是用openlayer 写的

二、什么是鹰眼

1、首先要有两个地图 大图,小图,鹰眼范围图(简称鹰眼)

2、大图移动,放大缩小的时候要相应的放大和缩小

3、小图不动,鹰眼图放大和缩小时,大图展示相应的位置

三、实现思路

1、小图比大图的层级小4(我这边设置的是小4,也可以是2和3看需要)

2、获取大图的屏幕四点坐标

3、鹰眼中绘制一个面图层,将2中获取的四点坐标整理面数据

4、大图放大缩小的时候,小图和大图联动

5、大图在移动的时候鹰眼始终保持中的位置并监听大图的四点坐标给鹰眼

6、鹰眼移动的时候将移动的中心点给大图中心点并监听大图的四点坐标给鹰眼

四、代码

<template>
  <div class="hello" style="height:100%;width:100%;position:relative;">
    <div id="map" src style="width: 100%;height: 100%;position: relative;">
      <div
        style="position: absolute;bottom:0px;right: 0px;z-index: 200;width: 308px;height:208px;background-color: #fff;border: 1px solid #555;border-radius: 1px;"
      >
        <div
          id="overview"
          style="background-color: #fff;width:300px;height:200px;margin: 3px 3px 3px 3px;border:1px solid #7b98bc"
        ></div>
      </div>
    </div>

    <!-- <baseMap></baseMap> -->
  </div>
</template>
<script>
//import baseMap from "./baseMap.vue";
export default {
  name: "Map",
  components: { 
    //baseMap 
  },
  data() {
    return {
      map_x: null, //地图的x坐标
      map_y: null, //地图的y坐标
      overview_x: null, //鹰眼的x坐标
      overview_y: null, //鹰眼的y坐标
      map_zoom: null, //地图的比例尺
      overview_zoom: null //鹰眼的比例尺
    };
  },
  methods: {
    initmap(mapId, zoom) {
      if (!window.havevec) {
        window.STYLE.layers.unshift(window.layerVec);
        window.STYLE.layers.unshift(window.layerTer); //地形
        window.STYLE.layers.unshift(window.layerImg); //影像
        window.havevec = true;
      }
      let initMap = new mapboxgl.Map({
        container: mapId,
        style: window.STYLE,
        zoom: zoom,
        center: [116.28076521512813, 39.85685373066069],
        preserveDrawingBuffer: true,
        trackResize: false,
        minZoom: 1,
        maxZoom: 16
      });
      return initMap;
    },
    initextent() {
      console.log(map.getBounds(), " map.getBounds();");
      var extent = map.getBounds();
      var coor = [
        [
          [extent._sw.lng, extent._ne.lat],
          [extent._ne.lng, extent._ne.lat],
          [extent._ne.lng, extent._sw.lat],
          [extent._sw.lng, extent._sw.lat],
          [extent._sw.lng, extent._ne.lat]
        ]
      ];
      var polygon = turf.polygon(coor);
      overview.on("load", function() {
        overview.addSource("maine", {
          type: "geojson",
          data: polygon
        });
        overview.addLayer({
          id: "maine",
          type: "fill",
          source: "maine",
          paint: {
            "fill-color": "red",
            "fill-opacity": 0.2,
            "fill-outline-color": "red"
          },
          layout: {
            visibility: "visible"
          }
        });
      });
    },
    // 拖拽
    mapdrag() {
      this.map_x = map.getCenter().lng;
      this.map_y = map.getCenter().lat;
      overview.setCenter([this.map_x, this.map_y]);
      this.extent();
    },
    // 放大缩小
    mapzoom() {
      this.map_zoom = map.getZoom();
      overview.setZoom(this.map_zoom - 4);
      this.map_x = map.getCenter().lng;
      this.map_y = map.getCenter().lat;
      overview.setCenter([this.map_x, this.map_y]);
      this.extent();
    },
    //移动大图,鹰眼始终在中间
    extent() {
      console.log(map.getBounds(), " map.getBounds();");
      var extent = map.getBounds();
      var coor = [
        [
          [extent._sw.lng, extent._ne.lat],
          [extent._ne.lng, extent._ne.lat],
          [extent._ne.lng, extent._sw.lat],
          [extent._sw.lng, extent._sw.lat],
          [extent._sw.lng, extent._ne.lat]
        ]
      ];
      var polygon = turf.polygon(coor);
      console.log(polygon, "polygon");
      overview.getSource("maine").setData({
        type: "FeatureCollection",
        features: [polygon]
      });
    },
    onMove(e) {
      var coords = e.lngLat;
      var canvas = map.getCanvasContainer();
      canvas.style.cursor = "grab";
      map.setCenter(coords);
      this.extent();
    },
    onUp(e) {
      var coords = e.lngLat;
      var canvas = map.getCanvasContainer();
      overview.off("mousemove", this.onMove);
      overview.off("touchmove", this.onMove);
    }
  },
  mounted() {
    let self = this;
    var map = this.initmap("map", 5);
    var overview = this.initmap("overview", 1);
    overview.scrollZoom.disable();
    overview.dragPan.disable();
    window.map = map;
    window.overview = overview;
    self.initextent();
    map.on("drag", self.mapdrag);
    map.on("zoom", self.mapzoom);
    var canvas = map.getCanvasContainer();
    overview.on("mousedown", "maine", function(e) {
      e.preventDefault();
      canvas.style.cursor = "grab";
      overview.on("mousemove", self.onMove);
      overview.once("mouseup", self.onUp);
    });
  }
};
</script>
<style scoped>
.datalist {
  width: 500px;
  height: 200px;
  position: absolute;
  /* background: pink; */
  left: 5px;
  top: 5px;
}
</style>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Vue.jsMapbox 是两个非常流行的工具,用于构建用户界面和提供强大的地功能。Vue 是一个轻量级的前端框架,以其组件化开发和易于上手的特点受到开发者喜爱。Mapbox 则是一个提供了丰富的地服务、地样式和交互功能的平台。 当你将 VueMapbox 结合使用时,可以实现以下几个关键点: 1. 安装依赖:首先,你需要在 Vue 项目中安装 `@vuegis/vue-mapbox-gl` 或者直接使用 Mapbox GL JS(原生库),这是官方推荐的 Vue 组件化解决方案。 2. 创建地组件:创建一个 Vue 组件,例如 `Map.vue`,引入 Mapbox GL JS,并设置初始化地的方法,包括设置中心位置、比例尺、地样式等。 ```html <template> <div ref="map"></div> </template> <script> import { mapboxgl, Map } from '@vuegis/vue-mapbox-gl' export default { components: { MapboxGL: mapboxgl.Map, }, mounted() { this.createMap() }, methods: { createMap() { this.$refs.map .el .style = 'width: 100%; height: 400px;'; // 设置样式 const map = new Map(this.$refs.map, { center: [51.505, -0.09], // 地中心点 zoom: 13, // 初始缩放级别 style: 'mapbox://styles/mapbox/streets-v11', // 使用预设样式 }); }, }, } </script> ``` 3. 动态数据绑定:Vue 的响应式系统使得地可以根据数据变化动态调整,比如根据用户的输入改变地或添加标记。 4. 层和交互:Mapbox 提供了各种层(如矢量层、影像层等)和交互元素(如点击事件、鼠标悬停事件),可以在 Vue 中轻松使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

侧耳倾听...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值