vue接入高德地图绘制扇形效果的案例详解

 更新时间:2022年04月20日 14:32:23   作者:秦浩铖  
这篇文章主要介绍了vue接入高德地图绘制扇形,需求是有一个列表,列表的数据就是一个基站信息,包含基站的经纬度信息和名字,基站下面又分扇区,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下

vue接入高德地图绘制扇形

为什么又写这一篇呢,主要是因为这个功能高德不支持,只能自己实现,但是呢,我估计很多人会用到这玩意儿。所以说呢,就简单的实现一下,如果有需要的话直接超过去就行,之前写过天地图绘制扇形区域的,如果使用天地图的话可以翻一下我之前的博客,百度地图和这个方法类似,可能就是使用的类不同,这样的话只要原理流程理解的差不多,直接把各个地图的类名替换一下就可以了。

需求

需求简单说一下,就是有一个列表,列表的数据就是一个基站信息,包含基站的经纬度信息和名字,基站下面又分扇区,比如有两个扇区或者一个扇区,扇区的覆盖范围是多少,也就是围绕基站的半径长度,以及扇形的角度,这个案例我角度是写死的哈,默认30度做的,如果需要动态设置的话,可以根据自己的需求稍作修改。

下面是基站列表的数据格式:

let sectorList = [{
          name: '第一个基站',    // 基站名称
          x: 116.3470390,       // 基站经度
          y: 40.481888,         // 基站纬度
          data: [{              // 基站包含扇区列表
            msg: '第一个基站的第一个扇区',   // 扇区名称
            r: 0						  // 基站初始角度
          }]
        }, {
          name: '第二个基站',
          x: 117.3470,
          y: 39.48188,
          data: [{
            msg: '第二个基站的第一个扇区',
            r: 0
          }, {
            msg: '第二个基站的第二个扇区',
            r: 120
          }]
        }]

预想效果

最后想要实现的效果就是这个样子的哈!

就是扇区直接覆盖在地图上,和标注点不一样,这个绘制的扇区会根据地图的缩放进行等比例缩放,不想标注点一样大小不变,但是呢,我在基站的顶点还是是用了一个圆形标注点,主要是怕地图缩小到全国找不到那些地方有扇区展示,所以说用来覆盖物和标注点配合展示,然后呢,这个代码没有优化,仅仅作为实现用,具体根据自己项目需求进行优化处理。

代码实现

绘制基站第一步

drawSite(mapPoint) {
        let point = new AMap.LngLat(mapPoint.x, mapPoint.y);
        for (var i = 0; i < mapPoint.data.length; i++) {
          let radian1 = 90 - mapPoint.data[i].r - 30
          let radian2 = 90 - mapPoint.data[i].r
          let oval = new AMap.Polygon({
            path: this.sector(point, 500, radian1, radian2),
            strokeColor: '#ff8400',
            strokeOpacity: '1',
            strokeWeight: 1,
            fillColor: '#ff8400',
            fillOpacity: '0.3',
          })
          let info = [];
          info.push("<b>基站名称:</b>" + mapPoint.name);
          info.push("<b>扇区名称:</b>" + mapPoint.data[i].msg);
          let content = info.join("<br/>");
          oval.content = content
          oval.on('click', this.polygonClick);
          map.add(oval);
        }
        let marker = new AMap.CircleMarker({
          center: point,
          radius: 7,
          strokeWeight: 0,
          fillColor: "#ff8400",
          fillOpacity: 1,
        });
        marker.on('click', this.markerClick);
        map.add(marker);
      },

绘制基站第二步 - 计算扇形形状

sector(center, len, radian1, radian2) {
        let points = [];
        let step = ((radian2 - radian1) / 10) || 10; //根据扇形的总夹角确定每步夹角度数,最大为10  
        points.push(center);
        for (let i = radian1; i < radian2 + 0.001; i += step) { //循环获取每步的圆弧上点的坐标,存入点数组 
          points.push(this.eOffsetBearing(center, len, i));
        }
        points.push(center);
        return points;
      },

计算扇形坐标

eOffsetBearing(center, len, bearing) {
        let lngConv = center.distance(new AMap.LngLat(center.getLng() + 0.1, center.getLat())) * 10
        let latConv = center.distance(new AMap.LngLat(center.getLng(), center.getLat() + 0.1)) * 10 //计算1纬度与原点的距离
        let lat = len * Math.sin(bearing * Math.PI / 180) / latConv; //正弦计算待获取的点的纬度与原点纬度差
        let lng = len * Math.cos(bearing * Math.PI / 180) / lngConv; //余弦计算待获取的点的经度与原点经度差
        return new AMap.LngLat(center.getLng() + lng, center.getLat() + lat);
      },

扇区点击事件

polygonClick(e) {
        infoWindow.setContent(e.target.content);
        infoWindow.open(map, [e.lnglat.getLng(), e.lnglat.getLat()]);
      },

原点点击事件

markerClick(e) {
        infoWindow.setContent(e.target.content);
        map.setZoomAndCenter(17, e.target.getCenter());
        infoWindow.open(map, e.target.getCenter());
      },

然后就可以了。

补充: // 信息弹窗

infoWindow = new AMap.InfoWindow({ offset: new AMap.Pixel(0, -20) });

对象要循环,代码是关键代码,没有循环

到此这篇关于vue接入高德地图绘制扇形的文章就介绍到这了,更多相关vue高德地图扇形内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue 计时器组件的实现代码

    vue 计时器组件的实现代码

    本篇文章主要介绍了vue 计时器组件的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • FastApi+Vue+LayUI实现前后端分离的示例代码

    FastApi+Vue+LayUI实现前后端分离的示例代码

    本文主要介绍了FastApi+Vue+LayUI实现前后端分离的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 深入了解Vue中单向数据流的原理与管理

    深入了解Vue中单向数据流的原理与管理

    在Vue中,数据流是指数据的传递和管理方式,而Vue采用的是单向数据流,所以这篇文章就来就来和大家讲讲什么是Vue的数据流以及如何进行数据流管理,感兴趣的可以了解一下
    2023-06-06
  • Vue实现动态查询规则生成组件

    Vue实现动态查询规则生成组件

    今天我们来给大家介绍下在Vue开发中我们经常会碰到的一种需求场景,本文主要介绍了Vue动态查询规则生成组件,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Vue内联处理器中访问方法和访问事件参数详解

    Vue内联处理器中访问方法和访问事件参数详解

    在 Vue 3 中,使用组合式 API 时,可以通过内联事件处理器来直接在模板中编写事件处理逻辑,内联事件处理器不仅可以直接执行简单的操作,还可以调用组件中的方法,并访问事件参数,下面将详细讲解如何在内联事件处理器中调用方法以及访问事件参数,需要的朋友可以参考下
    2024-12-12
  • vue实现动态列表点击各行换色的方法

    vue实现动态列表点击各行换色的方法

    今天小编就为大家分享一篇vue实现动态列表点击各行换色的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue3.2+ts实现在方法中可调用的拟态框弹窗(类el-MessageBox)

    vue3.2+ts实现在方法中可调用的拟态框弹窗(类el-MessageBox)

    这篇文章主要介绍了vue3.2+ts实现在方法中可调用的拟态框弹窗(类el-MessageBox),这个需求最主要的是要通过方法去调用,为了像el-messagebox使用那样方便,需要的朋友可以参考下
    2022-12-12
  • 可控制缓存销毁的 keepAlive 组件实现详解

    可控制缓存销毁的 keepAlive 组件实现详解

    这篇文章主要为大家介绍了可控制缓存销毁的 keepAlive 组件实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 在vue中使用Echarts利用watch做动态数据渲染操作

    在vue中使用Echarts利用watch做动态数据渲染操作

    这篇文章主要介绍了在vue中使用Echarts利用watch做动态数据渲染操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • Vue SSR 即时编译技术的实现

    Vue SSR 即时编译技术的实现

    这篇文章主要介绍了Vue SSR 即时编译技术的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论