百度地图API 实现多个已知地址的同时展示

2023-10-31

用到的API类:

  • Icon
  • LocalSearch
  • Label
  • Point
  • Marker
  • NavigationControl
  • OverviewMapControl

具体的使用就不赘述了

写这个的背景:

公司要一起出去TB,然后选择了自驾,就要收集大家的住址然后进行分组,就想到把大家的地址点在地图上列出来,这样就很清楚开车的同事与其他人的距离远近;

因为大家上报的都是具体的地址,而地图绘点最好是使用经纬值,所以通过location.search来获取。

写一下遇到的问题:

主要就是多个点搜索时要添加一些额外信息,比如要把搜索地址中加上对应人的姓名;因为local.setSearchCompleteCallback方法的异步比较麻烦,对personAddrs遍历后传入setSearchCompleteCallback的方法中的name总是最后一个人的,闭包也没解决,可能我对闭包的运用不够熟练;最终解决办法:就是对存储信息的personAddrs变量进行遍历时,每次都新建一个location实例:new BMap.LocalSearch(map),然后通过map_init这个方法在地图上绘制所有的点。

还有一个应用是使用Icon类,对司机同事进行特殊标记

下面代码,如果http://api.map.baidu.com/api?v=1.3和http://api.map.baidu.com/img/markers.png一直可用,那就不会有问题,出了问题就只能再找在线资源了,不过看着都是百度api提供的,应该没问题

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>根据地址查询经纬度</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.3"></script>
</head>
<body style="background:#CBE1FF">
    <div
      style="
        position: absolute;
        width: 100%;
        height: 900px;
        background-color: rgba(255, 255, 255, 0.9);
        display: flex;
        justify-content: center;
        align-items: center;
        z-index: 100;
      "
      id="spin"
    >
      Loading...
    </div>
    <div style="width:100%;margin:auto;">
        <div id="container" 
            style="position: absolute;
                margin-top:30px; 
                width: 100%; 
                height: 790px; 
                top: 50; 
                border: 1px solid gray;
                overflow:hidden;">
        </div>
    </div>
</body>
<script type="text/javascript">
  var commonIcon = new BMap.Icon("http://api.map.baidu.com/img/markers.png", new BMap.Size(23, 25), {
      offset: new BMap.Size(10, 25), // 指定定位位置
      imageOffset: new BMap.Size(0, 0 - 0 * 25) // 设置图片偏移使用左侧的图片
    //  imageOffset: new BMap.Size(-20, 0 - 10 * 25) // 设置图片偏移使用右侧的图片0-x*25代表使用第x+1张图片
  });
  var driverIcon = new BMap.Icon("http://api.map.baidu.com/img/markers.png", new BMap.Size(23, 25), {
      offset: new BMap.Size(10, 25), // 指定定位位置
      imageOffset: new BMap.Size(0, 0 - 10 * 25) // 设置图片偏移使用左侧的图片
    //  imageOffset: new BMap.Size(-20, 0 - 10 * 25) // 设置图片偏移使用右侧的图片0-x*25代表使用第x+1张图片
  });
  const personAddrs = [
  {name:"xxx", address:"康桥半岛", isDriver: true},
    {name:"xx", address:"川杨新苑三期"},
                                                                                     
  ];
  const addressArr = personAddrs.map(pr => pr.address);                                                                                                         

  var map = new BMap.Map("container");                                                                                                                          
  map.centerAndZoom("上海", 12);                                                                                                                                
  map.enableScrollWheelZoom();    //启用滚轮放大缩小,默认禁用                                                                                                  
  map.enableContinuousZoom();    //启用地图惯性拖拽,默认禁用                                                                                                   

  map.addControl(new BMap.NavigationControl());  //添加默认缩放平移控件                                                                                         
  map.addControl(new BMap.OverviewMapControl()); //添加默认缩略地图控件                                                                                         
  // map.addControl(new BMap.OverviewMapControl({ isOpen: true, anchor: BMAP_ANCHOR_BOTTOM_RIGHT }));   //右下角,打开                                          

  const addr = [];                                                                                                                                              

  function map_init(markerArr) {                                                                                                                                
    var point = new Array(); //存放标注点经纬信息的数组                                                                                                         
    var marker = new Array(); //存放标注点对象的数组                                                                                                            
    var info = new Array(); //存放提示信息窗口对象的数组                                                                                                        
    for (var i = 0; i < markerArr.length; i++) {                                                                                                                
        var p0 = markerArr[i].point.split(",")[0]; //                                                                                                           
        var p1 = markerArr[i].point.split(",")[1]; //按照原数组的point格式将地图点坐标的经纬度分别提出来                                                        
        point[i] = new window.BMap.Point(p0, p1); //循环生成新的地图点                                                                                          
        marker[i] = new window.BMap.Marker(point[i],  {icon: markerArr[i].isDriver ? driverIcon : commonIcon}); //按照地图点坐标生成标记                        
        // marker[i] = new window.BMap.Marker(point[i]); //按照地图点坐标生成标记                                                                               
        map.addOverlay(marker[i]);                                                                                                                              
        // marker[i].setAnimation(BMAP_ANIMATION_BOUNCE); //跳动的动画                                                                                          
        var label = new window.BMap.Label(`${markerArr[i].title}`, { offset: new window.BMap.Size(20, -10) });                                                  
        marker[i].setLabel(label);                                                                                                                              
    }
  }

  const funcs = [];                                                                                                                                             

  personAddrs.forEach((ad, i) => {                                                                                                                              
    const personName = ad?.name;                                                                                                                                
    const keyword = ad?.address;                                                                                                                                
    const localSearch = new BMap.LocalSearch(map);                                                                                                              

    map.clearOverlays();//清空原来的标注                                                                                                                        
    const cb = (searchResult) => {                                                                                                                              
      const poi = searchResult.getPoi(0);                                                                                                                       
      // console.log(personName, poi)                                                                                                                           
      addr.push(                                                                                                                                                
        { title: `${poi.title}-${personName}`, point: `${poi.point.lng},${poi.point.lat}`, address: `${poi.address}_${personName}`, isDriver: ad.isDriver },    
      )
      if (addr.length === personAddrs.length) {                                                                                                                 
        console.log(addr)                                                                                                                                       
        const spinEl = document.getElementById('spin');                                                                                                         
        spinEl.style.display = 'none'                                                                                                                           
        map_init(addr);                                                                                                                                         
      }
    }
    localSearch.setSearchCompleteCallback(cb)                                                                                                                   
    localSearch.search(keyword);                                                                                                                                

  })
  
</script>
</html>

结果:
蓝色是司机,红色是乘客
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

百度地图API 实现多个已知地址的同时展示 的相关文章

  • 国内外优秀的源码网站

    不管你是初学一门计算机语言或技术 还是想学习别人的经验和创意 做为一个开发人员 都会经常需要到搜索一些代码 下面是7个地方可以帮助你快速寻找到你需要的代码 1 GitHub Code Search http github com searc
  • Python全栈开发【基础-06】垃圾回收机制

    专栏介绍 本专栏为Python全栈开发系列文章 技术包括Python基础 函数 文件 面向对象 网络编程 并发编程 MySQL数据库 HTML JavaScript CSS JQuery bootstrap WSGI Django Flas

随机推荐

  • 解决ScrollView嵌套RecyclerView无法滑动的问题

    通过View事件的拦截方法解决ScrollView嵌套RecyclerView无法滑动的问题 前提 这里先介绍两个View的方法 onInterceptTouchEvent方法 只有ViewGroup才有 返回true 代表对事件进行拦截
  • JavaWeb 使用nginx负载均衡

    Nginx是什么 Nginx是一个轻量级 高性能 稳定性高 并发性好的HTTP和反向代理服务器 核心功能 负载均衡 负载均衡 多在高并发情况下需要使用 其原理就是将数据流量分摊到多个服务器执行 减轻每台服务器的压力 多台服务器 集群 共同完
  • java基础:反射机制

    java反射机制 反射简介 java代码在程序中经历的阶段 如何获取Class对象 如何获取成员变量 如何获取构造方法 如何获取成员方法 如何获类名 反射简介 1 反射是框架设计的灵魂 2 将类的各个组成部分封装为其他对象 这就是反射机制
  • 异地远程访问本地SQL Server数据库【无公网IP内网穿透】

    文章目录 1 前言 2 SeaFile云盘设置 2 1 Owncould的安装环境设置 2 2 SeaFile下载安装 2 3 SeaFile的配置 3 cpolar内网穿透 3 1 Cpolar下载安装 3 2 Cpolar的注册 3 3
  • pandas使用cut分割区间继而用groupby对数据分组

    ages np array 1 5 10 40 36 12 2 2 67 45 90 3 6 8 23 45 12 15 17 22 4 33 28 56 58 62 77 89 100 18 20 25 30 32 年龄数据 quarti
  • sublime text3 主题推荐配色自定义方案

    先使用Ctrl shift p 打开Package Control Install Package 安装Seti UI主题插件 在 首选项 gt 浏览插件目录 进入sublime的插件目录 进入Seti UI目录 使用sublime修改Se
  • selenium中,div弹出提示框,如何定位?

    弹出框是用div模拟出来的 用switch to window和switch to frame是切换不过去的 那么如何去定位到弹框呢 可以这样处理 一般弹出窗口是在最顶层的视图上的 同时mianframe在顶层视图下面 所以这里我通brow
  • GOM登录器配置免费版生成图文教程

    GOM登录器配置生成图文教程 GOM引擎我发布的算比较多了 喜欢的朋友我都分享这款引擎的版本 原因就是这款引擎的版本漂亮 功能系统多 活动和玩法也都非常的丰富 还有很多的功能是其他引擎无法做到的 所以我最近研究的也就比较多了 有很多朋友会问
  • 通过一个链接打开本地app,或者去下载app

    以前支付宝发短信给你手机 然后你点开这个链接的时候会发现它自动的打开了支付宝软件 这个是如何做到的呢 我认为实现的原理就是 这个链接通过浏览器打开 然后自动执行js方法 如果本地有支付宝软件 就去打开这个方法 当然支付宝app也要做对应的处
  • Unity 各个坐标系之间的转换

    Unity 各个坐标系之间的转换 using UnityEngine public class PositionConvert
  • PMD代码规范检测

    PMD插件安装与使用 PMD是一种开源分析Java代码错误的工具 通过静态分析获知代码错误 一 外网安装 安装PMD插件 打开Setting的Plugins窗口 点击Browse repositores 按钮 查找PMD进行安装 插件安装成
  • [转]三极管的集电结反向偏置电压

    转自百度空间 http hi baidu com liujun585 blog item 08fa5160751b2547eaf8f86f html 三极管的集电结反向偏置电压 我先说一下三极管各极名称起名原因 以NPN为例 发射极 发射电
  • mysql中workbench下载

    近日下载完mysql后发现workbench没有下载 研究后发现下载方法 1 在开始里找到这个MySQL Installer Community并打开 2 点击add 3 就可以找到workbanch了 然后就可以下载了
  • 2022数学建模美赛A题详细思路

    已更新 公众号 千千小屋grow 2022 MCM A题 自行车手的能量分布 背景 公路自行车赛有很多种类型 包括标准赛 团体计时赛和个人计时赛 在这些比赛中 骑手成功的机会可能会根据比赛的类型 赛道和骑手的能力而有所不同 在个人计时赛中
  • Ubuntu 16.04.6 搭建FTP服务器

    Ubuntu 16 04 6 搭建FTP服务器 安装vsftpd3 0 3 FTP服务器 配置vsftpd 创建虚拟用户 新建用户例子 安装vsftpd3 0 3 FTP服务器 sudo apt install vsftpd 配置vsftp
  • SpringCloud开发-云效流水线使用

    前言 2018年使用云效的时候 当时功能还不完善 并且有很多流程走不通 因此没有正式使用流水线做CICD工作 后来有幸听了云效产品经理分享 会议上了解到云效将会重构 就等着重构后再来使用 今年刚好需要使用CICD 就再研究了下新版的云效 其
  • 高斯-赛得尔迭代式 c++_高斯ALT 71,一把让你意想不到的机械键盘

    我记得我入坑机械键盘的第一把键盘是108键的 因为我觉得键盘就应该是这样 不完整的键位还叫键盘么 但是我渐渐发现事实上键盘上的好多按键我基本很少用或者不用 那么我有必要把桌面本来就紧凑的空间留给那些我不用的按键么 在想通了这个问题之后 我爱
  • 芭乐BootstrapTable视频组件不同使用方法的效率各有差异

    自己需求处理的问题 需求 设备端批量发送数据过来 数据已依照特定字段进行排序 现在自己需求依照传过来的数据动态更新表格 表格的显示区域有限制 因为一些原因 终究确认运用 Bootstrap Table 组件完成该功能 遇到的问题 问题 运用
  • dw怎么让html使用css样式,dw怎么用css样式?

    dw怎么用css样式 首先介绍一下CSS样式的属性 CSS样式属性被分为八大类 类型 背景 区块 方框 边框 列表 定位 扩展 类型主要定义文本的字体 大小 颜色 行高和修饰等 如图所示 方法一 内联样式可以通过style属性直接套进定义对
  • 百度地图API 实现多个已知地址的同时展示

    用到的API类 Icon LocalSearch Label Point Marker NavigationControl OverviewMapControl 具体的使用就不赘述了 写这个的背景 公司要一起出去TB 然后选择了自驾 就要收