vue3 + 百度地图 实现多坐标生成轨迹的两种种方式

news2024/11/22 15:48:38

本次依然是关于百度地图中常见的一个问题,此次共使用了两种方式并做了一些分析及处理,希望有所帮助。如有问题可以评论或私信。

一、便捷方式

优点:便捷,所用的api方法是根据坐标进行计算后绘制路线,所以路线相对准确。

缺点:当坐标点多于10个之后,无法加载出来(即坐标过多无法使用)。

1.api文档

百度地图JSAPI 2.0类参考 (baidu.com)

2.部分代码(主要部分是driving.search中所传递的参数)

// start:起点坐标 end:终点坐标 way:途经点坐标数组
driving.search(start, end, {
    waypoints: way,
});

3.全部代码

function init() {
    // 地图初始化部分
    // DOM元素记得修改
    let map = new BMap.Map("allmap");
    // 初始化地图,设置中心点坐标和地图级别
    map.centerAndZoom(new BMap.Point(116.385306, 39.884902), 19)
    // 开启鼠标滚轮缩放
    map.enableScrollWheelZoom(true)
    // 初始化结束

    // 多个坐标(模拟数据)
    var path = [
        { lng: 116.385306, lat: 39.884902 },
        { lng: 116.408675, lat: 39.87078 },
        { lng: 116.410723, lat: 39.868717 },
        { lng: 116.412641, lat: 39.866834 },
        { lng: 116.424907, lat: 39.863241 }
    ];
    // 创建路线实例化
    var driving = new BMap.DrivingRouteLine(map, {
        renderOptions: {
            map: map
        }
    })
    // 设置起点、终点和途经点数组
    var start = new BMap.Point(path[0].lng, path[0].lat);
    var end = new BMap.Point(path[path.length - 1].lng, path[path.length - 1].lat);
    var way = []
    path.map((item, index) => {
        if (index != 0 && index != path.length - 1) {
            way.push(new BMap.Point(item.lng, item.lat))
        }
    })
    driving.search(start, end, {
        waypoints: way,
    });
}

二、复杂方式(由于最终使用了本方案,所以同时配备了弹框信息的处理)

优点:解决了点坐标过多问题

缺点:绘制路线准确度较差

1.实现思路,由于点坐标过多,或者说多的太多了,于是拿到坐标数组后,先添加点标记,然后两点标记之间连线。

如果点与点之间比较近或者说点比较密集可以使用此方法

2.代码

// 初始化地图
let BMap
let map = ref()
function init() {
    // 初始化内容省略
    BMap = window.BMap; 
    map.value = new BMap.Map("allmap", { enableMapClick: false }); 
    //初始显示
    map.value.centerAndZoom(new BMap.Point(103.388611, 35.563611), 5); 
    // 添加滚轮效果
    map.value.enableScrollWheelZoom(true);
    // 模拟数据
    var path = [
        { lng: 116.385306, lat: 39.884902 },
        { lng: 116.408675, lat: 39.87078 },
        { lng: 116.410723, lat: 39.868717 },
        { lng: 116.412641, lat: 39.866834 },
        { lng: 116.424907, lat: 39.863241 }
    ];
    
    // 插入点坐标
    initData(path)
}

// 初始化数据
function initData(data) {
    // 判断是否为空数组
    if (data.length > 0){
        var list = []
        var start = new BMap.Ponit(data[0].lng, data[0].lat)
        // 如果数组中的数据大于1个则绘制线路
        if (data.length != 1) {
            data.map((item, index) => {
                // 把途经点放入数组(即不是重点和起点的坐标)
                if (index != 0 && index != data.length - 1) {
                    list.push(new BMap.Ponit(item.lng, item.lat)
                }
            })
            var end =new BMap.Ponit(data[data.length - 1].lng, data[data.length - 1].lat)
            // 绘制线路
            drawLine(start, end, list)
        }
        // 添加弹框和点标记
        addPopPoint(start, end, list)
    }
}

// 绘制线路
function drawLine(start, end, list) {
    // 绘制线路所需要的参数为一个数组,所以又需要将三个参数放入一块
    var lineArr = []
    lineArr.push(start)
    if (list.length > 0) {
        list.map(item => {
            lineArr.push(item)
        })
    }
    lineArr.push(end)
    // 折线样式
    var sy = new BMap.Symbol(window.BMap_Symbol_SHAPE_BACKWARD_OPEN_ARROW, {
        scale: 0.6,// 图标缩放大小
        strokeColor: '#fff',// 设置矢量图标的线填充颜色
        strokeWeight: '2',// 设置线宽
    });
    var icons = new BMap.IconSequence(sy, '100%', '10%', false);
    var polyline = new BMap.Polyline(lineArr, {
        enableEditing: false,// 是否启用线编辑,默认为false
        enableClicking: false,// 是否响应点击事件,默认为true
        icons: [icons],
        strokeWeight: '6',// 折线的宽度,以像素为单位
        strokeOpacity: 0.8,// 折线的透明度,取值范围0 - 1
        strokeColor: "#18a45b" // 折线颜色
    });
    // 增加折线
    map.value.addOverlay(polyline);
}

// 添加弹框和点标记
function addPopPoint(start, end, list) {
    // 修改可视范围数组
    var pointArr = []
    pointArr.push(start)
    // 弹框大小(可自己修改)
    var opts = {
        width: 250,
        height: 130,
    }
    // 起点终点弹框
    var startIcon = new BMap.Icon("http://api.map.baidu.com/images/dest_markers.png", new BMap.Size(32, 32), {
                anchor: new BMap.Size(18, 30)
    });
    var startMk = new BMap.Marker(start, { icon: startIcon });
    var startInfoWindow = new BMap.InfoWindow(`<p class="markContent">起点</p><p class="content">横坐标:${start.lng}</p><p class="content">纵坐标:${start.lat}</p>`, opts);
    startMk.addEventListener("click", function () {
        map.value.openInfoWindow(startInfoWindow, start); //开启信息窗口
    });
    map.value.addOverlay(startMk);
    if (end) {
        pointArr.push(end)
        var endIcon = new BMap.Icon("http://api.map.baidu.com/images/dest_markers.png", new BMap.Size(32, 32), {
            // 精灵图的偏移
            imageOffset: new BMap.Size(0, -32),
            anchor: new BMap.Size(15, 30)
        });
        var endMk = new BMap.Marker(end, { icon: endIcon });
        var endInfoWindow = new BMap.InfoWindow(`<p class="markContent">终点</p><p class="content">横坐标:${end.lng}</p><p class="content">纵坐标:${end.lat}</p>`, opts);
        endMk.addEventListener("click", function () {
            map.value.openInfoWindow(endInfoWindow, end); //开启信息窗口
        });
        map.value.addOverlay(endMk);
        mapList.map(item => {
            list.push(item)
        })
        list.push(end)
    }
    // 途经点弹框
    if (mapList.length > 0) {
        mapList.map((item, index) => {
            pointArr.push(item)
            var infoWindow = new BMap.InfoWindow(`<p class="markContent">途经点${index + 1}</p><p class="content"><p class="content">横坐标:${item.lng}</p><p class="content">纵坐标:${item.lat}</p>`, opts);
            var marker = new BMap.Marker(item)
            marker.addEventListener("click", function () {
                map.value.openInfoWindow(infoWindow, item); //开启信息窗口
            });
            map.value.addOverlay(marker)
        })
    }
    // 获取合适视野
    const view = map.value.getViewport(list);
    map.value.setViewport(view);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1898988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UML用户指南】-29-对体系结构建模-协作

目录 1、概念 1.1、名称 1.2、结构 1.3、行为 1.4、组织协作 2、常用建模技术 2.1、对角色建模 2.2、对用例的实现建模 2.3、对操作的实现建模 2.4、对机制建模 在UML中&#xff0c;用协作来对机制建模。协作为系统中的交互构造块指定一个名称&#xff0c;其中既包含…

Aigtek电压放大器参数有哪些

电压放大器是广泛应用于电子电路中的一种重要电路元件&#xff0c;它主要用于将输入信号的电压放大到所需的输出电压水平。在设计和使用电压放大器时&#xff0c;我们需要了解并考虑一系列的参数和特性。本文将详细介绍电压放大器的主要参数&#xff0c;包括放大倍数、带宽、输…

JAVA 对象存储OSS工具类(腾讯云)

对象存储OSS工具类 import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.model.PutObj…

机器学习之模型训练

前言 模型训练一般分为四个步骤&#xff1a; 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 有了数据集和模型后&#xff0c;可以进行模型的训练与评估。 构建数据集 定义神经网络模型 class Network(nn.Cell):def __init__(sel…

第一篇——导论:数学通识课的体系和学习攻略

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 数学的认知大厦&#xff1b;之前听的时候就觉得很重要&#xff0c;本次又…

性能压测 -优化 Nginx的动静分离

两件事情 1.以后将所有的项目的静态资源都应该放在nginx里面 2.nginx 规则&#xff1a;/static/***所有请求都有nginx直接返回 nginx 配置一下配置文件&#xff0c;然后把html 的静态资源&#xff0c;绑定好是Nginx优先级高的静态资源路径&#xff0c;就去交给nginx静态资源…

h5 video 标签播放经过 java 使用 ws.schild( jave、ffmpeg ) 压缩后的 mp4 视频只有声音无画面的问题排查记录

1. 引入 ws.schild MAVEN 依赖&#xff1a; <dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>3.5.0</version></dependency><dependency><groupId>ws.schild</grou…

基于Spring Boot框架的EAM系统设计与实现

摘 要&#xff1a;文章设计并实现一个基于Spring Boot框架的EAM系统&#xff0c;以应对传统人工管理模式存在的低效与信息管理难题。系统利用Java语言、JSP技术、MySQL数据库等技术栈&#xff0c;构建了一个B/S架构的高效管理平台&#xff0c;提升了资产管理的信息化水平。该系…

分班查询系统怎么制作?

新学年的临近&#xff0c;教师们的工作清单再次膨胀&#xff0c;充满各种任务。开学前的准备总是让人忙碌不已&#xff0c;从课程规划到教室布置&#xff0c;再到与家长的沟通&#xff0c;每一个环节都至关重要。尤其是分班结果的公布&#xff0c;这项工作虽然看起来简单&#…

Qwen1.5-1.8b部署

仿照ChatGLM3部署&#xff0c;参考了Qwen模型的文档&#xff0c;模型地址https://modelscope.cn/models/qwen/Qwen1.5-1.8B-Chat/summary http接口 服务端代码api.py from fastapi import FastAPI, Request from transformers import AutoTokenizer, AutoModelForCausalLM, …

强化学习后的数学原理:随机近似与梯度下降

概述 这节课的作用&#xff1a; 本节课大纲如下&#xff1a; Motivating examples 先回顾一下 mean estimation &#xff1a; 为什么总数反复提到这个 mean estimation&#xff0c;就是因为 RL 当中有非常多的 expectation&#xff0c;后面就会知道除了 state value 这些定义…

PySide6 实现资源的加载:深入解析与实战案例

目录 1. 引言 2. 加载内置资源 3. 使用自定义资源文件&#xff08;.qrc&#xff09; 创建.qrc文件 编译.qrc文件 加载资源 4. 动态加载UI文件 使用Qt Designer设计UI 加载UI文件 5. 注意事项与最佳实践 6. 结论 在开发基于PySide6的桌面应用程序时&…

博途通讯笔记1:1200与1200之间S7通讯

目录 一、添加子网连接二、创建PUT GET三、各个参数的意义 一、添加子网连接 二、创建PUT GET 三、各个参数的意义

新手高效指南:电子元器件BOM表创建/制作及配单全教程

在科技日新月异的今天&#xff0c;电子产品设计与制造不仅是创新精神的展现&#xff0c;更是对精确度与效率的不懈追求。在这个过程中&#xff0c;一份精细且全面的BOM&#xff08;物料清单&#xff09;犹如一座桥梁&#xff0c;连接着创意与现实世界。BOM不仅细致记录了产品所…

如何优化圆柱晶振32.768KHz的外壳接地?

圆柱晶振32.768KHz在电子设备中扮演着重要的角色&#xff0c;其精确的时钟信号对于许多应用至关重要。为了确保晶振的稳定性和准确性&#xff0c;外壳接地是一个关键步骤。 一、外壳接地的目的 外壳接地的主要目的是为了防止信号干扰。当晶振的外壳接地后&#xff0c;它相当于…

16-JS封装:extend方法

目录 一、封装需求 二、实现1&#xff1a;jQuery.extend 三、实现2&#xff1a;通过原型jQuery.fn.extend 四、优化 一、封装需求 封装需求&#xff1a; $.extend&#xff1a; var obj{ name:"xxx",age:18} var obj3{ gender:"女"} var obj2{}; 将obj、…

S7-1200PLC学习记录

文章目录 前言一、S7-12001.数字量输入模块2. PNP接法和NPN接法 二、博图软件1. 位逻辑运算Part1. 添加新设备&#xff08;添加PLC&#xff09;Part2. 添加信号模块Part3. 添加信号板中模块Part4. 添加新块Part5. Main编程文件案例1案例2 -( S )- 和 -( R )-完整操作过程&#…

ERROR | Web server failed to start. Port 8080 was already in use.

错误提示&#xff1a; *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 8080 was already in use.Action:Identify and stop the process thats listening on port 8080 or configure thi…

C++——模板详解(下篇)

一、非类型模板参数 模板参数分为类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之后的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类&#xff08;函数&#xff09;模板的一个参数&#xff0c;在类&#…

Swift 中的方法调用机制

Swift 方法调用详解&#xff1a;与 Objective-C 的对比、V-Table 机制、Witness Table 机制 在 iOS 开发中&#xff0c;Swift 和 Objective-C 是两种常用的编程语言。尽管它们都能用于开发应用程序&#xff0c;但在方法调用的底层机制上存在显著差异。本文将详细介绍 Swift 的…