从零开始学习调用百度地图网页API:三、鼠标点击绘图功能

目录

  • 代码
  • 功能
  • 问题注意
    • addEventListener
    • plot_line

代码

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="viewport" content="initial-scale=1.0, user-scalable=no" /><style type="text/css">body, html, #allmap {width: 100%;height: 100%;overflow: hidden;margin: 0;font-family: "微软雅黑";}ul li {list-style: none;}.btn-wrap {z-index: 999;position: fixed;bottom: 40px;margin-left: 200px;padding: 1rem 1rem;border-radius: .25rem;background-color: #fff;box-shadow: 0 2px 6px 0 rgba(27, 142, 236, 0.5);}.btn {width: 75px;height: 30px;float: left;background-color: #fff;color: rgba(27, 142, 236, 1);font-size: 14px;border: 1px solid rgba(27, 142, 236, 1);border-radius: 5px;margin: 0 5px;text-align: center;line-height: 30px;}.btn:hover {background-color: rgba(27, 142, 236, 0.8);color: #fff;}</style><script type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&ak=你的ak"></script><title>显示坐标</title>
</head>
<body><div id="allmap"></div><ul class="btn-wrap" style="z-index: 999;"><li class="btn" id="plot_button" onclick="draw()">绘图</li><li class="btn" id="clear_button" onclick="clearpoint()">清除</li><li class="btn" id="show_pos_button" onclick="display()">显示坐标</li><li class="btn" id="not_show" onclick="notshow()">不显示</li></ul>
</body>
</html>
<script type="text/javascript">var drawflag = 0;var latline = new Array();var lonline = new Array();var line = new Array();var colorline = "blue";var show_flag = null;// 百度地图API功能var map = new BMap.Map("allmap");  // 创建Map实例map.centerAndZoom("北京", 15);      // 初始化地图,用城市名设置地图中心点var opts = {width: 20,     // 信息窗口宽度height: 5,     // 信息窗口高度}//var a = new Array(BMAP_SATELLITE_MAP,BMAP_NORMAL_MAP);var cursor = map.getDefaultCursor();map.enableScrollWheelZoom();//开启鼠标滚轮缩放var mapControl = new BMap.MapTypeControl({ mapTypes: [BMAP_NORMAL_MAP, BMAP_HYBRID_MAP, BMAP_SATELLITE_MAP] });map.addControl(mapControl);var scaleCtrl = new BMap.ScaleControl();  // 添加比例尺控件map.addControl(scaleCtrl);var cityCtrl = new BMap.CityListControl();  // 添加城市列表控件map.addControl(cityCtrl);//map.getUiSettings().setCompassEnabled(true);map.addEventListener("click", function (e) {addpoint(e.point.lng, e.point.lat);});function setMouse() {if (drawflag == 1)map.setDefaultCursor('crosshair');elsemap.setDefaultCursor(cursor);}function draw() {if (drawflag == 0)drawflag = 1;elsedrawflag = 0;setMouse();}//显示坐标信息窗口槽函数function showinfo(e) {var infoWindow = new BMap.InfoWindow(e.point.lat.toFixed(3) + ", " + e.point.lng.toFixed(3), opts);  // 创建信息窗口对象map.openInfoWindow(infoWindow, e.point);}//添加事件function display() {if (show_flag == null) {map.addEventListener('click', showinfo, false);show_flag = 1;}}//移除事件function notshow() {map.removeEventListener('click', showinfo);map.closeInfoWindow();show_flag = null;}function addpoint(lon, lat) {var k = 0;if (drawflag == 1) {line = new Array();latline.push(lat);lonline.push(lon);for (var i = 0; i < latline.length - 1; i++) {plot_line(lonline[i], latline[i], lonline[i + 1], latline[i + 1])k = i + 1;}var marker = new BMap.Marker(new BMap.Point(lon, lat));var point = new BMap.Point(lon, lat);map.addOverlay(marker);marker.addEventListener('click', function () {var opts = {title: `<font color='blue'>位置信息</font>`,};var info = '名称:坐标点' + k + "</br>坐标:" + point.lat.toFixed(5) + ", " + point.lng.toFixed(5);var infoWindow = new BMap.InfoWindow(info, opts);  // 创建信息窗口对象map.openInfoWindow(infoWindow, point);});}}function plot_line(lon1, lat1, lon2, lat2) {//起始点的经纬度//终止点的经纬度var polyline1 = new BMap.Polyline([new BMap.Point(lon1, lat1),new BMap.Point(lon2, lat2)], {strokeColor: "red",//设置颜色strokeWeight: 5, //宽度strokeOpacity: 1});//透明度map.addOverlay(polyline1);polyline1.addEventListener('click', function () {var opts = {title: `<font color='red'>距离</font>`,};var len_point = new BMap.Point((polyline1.mv.kf.lng + polyline1.mv.nf.lng) / 2.0, (polyline1.mv.kf.lat + polyline1.mv.nf.lat) / 2.0);var infoWindow = new BMap.InfoWindow("长度", opts);map.openInfoWindow(infoWindow, len_point);});polyline1.disableMassClear();line.push(polyline1);}function clearpoint() {var lines = map.getOverlays();//var allOverlay = map.getOverlays();for (var i = 0; i < lines.length; i++) {lines[i].enableMassClear();}map.clearOverlays();latline = new Array();lonline = new Array();line = new Array();}</script>

注:需要将你的ak替换,ak从百度地图官网注册申请,选择浏览器类型api。

功能

绘制线段
在这里插入图片描述
显示对象的位置信息
在这里插入图片描述
在这里插入图片描述

显示任意点坐标
在这里插入图片描述

问题注意

addEventListener

    //添加事件function display() {//alert(e.point.lng + ", " + e.point.lat);map.addEventListener('click', showinfo);}//移除事件function notshow() {map.closeInfoWindow();map.removeEventListener('click', showinfo);}

最初的实现方法,在显示坐标按钮多次被点击后,会导致再点击不显示按钮,无法remove事件。依然会在地图上点击后出现坐标信息。
这是因为addEventListener可以重复添加事件,为了避免重复添加事件,使用全局变量show_flag,通过值来判断是否已经添加过,若已经添加过事件,赋值为1,再次点击显示坐标按钮,不会重复添加事件。

    //添加事件function display() {if (show_flag == null) {map.addEventListener('click', showinfo, false);show_flag = 1;}}//移除事件function notshow() {map.removeEventListener('click', showinfo);map.closeInfoWindow();show_flag = null;}

plot_line

如果将函数内容直接在循环内实现,不使用函数。则polyline1变量在循环结束后调用addEventListener的值,只调用循环结束最后的结果。
不是每个循环都不同的值。
因此,写为函数。每个线段addEventListener为不同的值,在中点显示信息。

            for (var i = 0; i < latline.length - 1; i++) {plot_line(lonline[i], latline[i], lonline[i + 1], latline[i + 1])k = i + 1;}
function plot_line(lon1, lat1, lon2, lat2) {//起始点的经纬度//终止点的经纬度var polyline1 = new BMap.Polyline([new BMap.Point(lon1, lat1),new BMap.Point(lon2, lat2)], {strokeColor: "red",//设置颜色strokeWeight: 5, //宽度strokeOpacity: 1});//透明度map.addOverlay(polyline1);polyline1.addEventListener('click', function () {var opts = {title: `<font color='red'>距离</font>`,};var len_point = new BMap.Point((polyline1.mv.kf.lng + polyline1.mv.nf.lng) / 2.0, (polyline1.mv.kf.lat + polyline1.mv.nf.lat) / 2.0);var infoWindow = new BMap.InfoWindow("长度", opts);map.openInfoWindow(infoWindow, len_point);});polyline1.disableMassClear();line.push(polyline1);}

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

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

相关文章

MySQL 的下载与安装

MySQL 的下载 https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.30-1.el7.x86_64.rpm-bundle.tar 将下载的数据包拉到虚拟机的linux系统的主文件夹下,创建一个MySQL文件存放 安装MySQL 1、解压数据包 tar -xvf mysql-5.7.30-1.el7.x86_64.rpm-bundle.tar -x: 表示解压…

finalshell连接虚拟机中的ubuntu

finalshell下载地址: https://www.finalshell.org/ubuntu设置root密码&#xff1a; sudo passwd rootubuntu关闭防火墙&#xff1a; sudo ufw disable安装ssh # sudo apt update #更新数据(可以不执行) # sudo apt upgrade #更新软件(可以不执行) sudo apt install open…

获取操作系统信息服务器信息JVM信息cpu内存磁盘信息

1.添加依赖 <dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>5.6.0</version> </dependency>

数据结构 二叉树OJ题

数据结构 二叉树OJ题 文章目录 数据结构 二叉树OJ题1. 检查两颗二叉树是否相同2. 判断树是否为另一个树的子树3. 翻转二叉树4. 平衡二叉树5. 对称二叉树6. 二叉树遍历7. 二叉树层序遍历8. 最近公共祖先9. 二叉树创建字符串10. 非递归方式实现前序遍历11. 非递归方式实现中序遍历…

qt创建线程类并实现通信 C++

需求描述&#xff1a; 通过VS创建了一个QT项目&#xff0c;我需要一个线程类去实时获取设备取流的图像&#xff0c;并将图像传给qt的类用于在QLabel上显示。 实现&#xff1a; 头文件&#xff1a; //include ...省略//Qt界面的类Your_Project class Your_Project : public Q…

游戏开发年度报告 | 2023年游戏开发团队最流行的制作和发行的方式

近期&#xff0c;Perforce发布了《2023游戏开发与设计现状报告》。此报告调查了来自全球各地的游戏开发专业人士&#xff0c;了解他们面临的主要开发挑战、使用的工具和流程&#xff0c;以及目前最让他们对这个行业感到兴奋的方面。 龙智作为Perforce授权合作伙伴&#xff0c;将…

wifi指纹室内定位系统 计算机竞赛

简介 今天来介绍一下室内定位相关的原理以及实现方法; WIFI全称WirelessFidelity&#xff0c;在中文里又称作“行动热点”&#xff0c;是Wi-Fi联盟制造商的商标做为产品的品牌认证&#xff0c;是一个创建于IEEE 802.11标准的无线局域网技术。基于两套系统的密切相关&#xff…

接口测试很难?3分钟带你入门接口自动化测试

​1、什么是接口&#xff1f; 接口是连接前台和后台的桥梁&#xff0c;前台通过接口调用后端已完成的功能&#xff0c;而无需关注内部的实现细节。借助于接口&#xff0c;可以实现前后台分离&#xff0c;各自完成开发工作后&#xff0c;进行联调&#xff0c;提高工作效率 2、…

Java中的正则表达式

1、体验正则表达式 import java.util.regex.Matcher; import java.util.regex.Pattern;/*** Description: 体验正则表达式:提取英文单词* Author: yangyongbing* CreateTime: 2023/10/16 08:38* Version: 1.0*/ public class Regexp {public static void main(String[] args)…

PostgreSQL 导出数据为CSV

在SQL脚本中导出数据&#xff0c;可以使用COPY命令。以下是一个示例&#xff1a; COPY (SELECT * FROM your_table) TO path/to/your_file.csv WITH CSV HEADER;请确保将your_table替换为你要导出数据的实际表名&#xff0c;并将path/to/your_file.csv替换为你要保存数据的实际…

NodeMCU ESP8266 基于Arduino IDE的串口图形化调试教程(超详细)

NodeMCU ESP8266 基于Arduino IDE的串口图形化调试教程 文章目录 NodeMCU ESP8266 基于Arduino IDE的串口图形化调试教程前言Serial Plotter测试前期准备打开工具方法 1方法 2 测试代码 总结 前言 在嵌入式的开发过程中&#xff0c;我们经常会采集一些传感器的数据&#xff0c…

【接口测试】接口测试内容

主要内容如下&#xff1a; 一、接口测试的相关基础知识 什么是接口测试&#xff1f; 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间、以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换、传递和控制管理过程&#xff0c;以…

数据结构 - 5(二叉树7000字详解)

一&#xff1a;二叉树的基本概念 1.1树形结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 注意&am…

探秘Socks5代理在跨界电商、爬虫和游戏领域的应用

在当今数字化浪潮中&#xff0c;技术对于各行各业都产生着深远的影响。其中&#xff0c;Socks5代理技术作为一项关键的网络工具&#xff0c;不仅在跨界电商领域提供了便利&#xff0c;还在爬虫数据采集以及游戏体验优化中扮演着重要角色。本文将深入探讨Socks5代理技术在这些领…

js继承的几种方式(原型链继承、构造函数继承、组合式继承、寄生组合式继承、ES6的Class类继承)

1.原型链继承 实现原理&#xff1a;子类的原型指向父类实例。子类在自身实例上找不到属性和方法时去它父类实例&#xff08;父类实例和实例的原型对象&#xff09;上查找&#xff0c;从而实现对父类属性和方法的继承 缺点&#xff1a; 子类创建时不能传参&#xff08;即没有…

探究Socks5代理和代理IP在技术领域的多重应用

随着数字化时代的不断发展&#xff0c;网络工程师在跨界电商、爬虫数据采集、出海业务拓展以及游戏优化等领域扮演着关键角色。而Socks5代理和代理IP作为他们的得力工具&#xff0c;在这些领域中发挥着至关重要的作用。本文将深入探讨这两种技术在技术领域中的应用&#xff0c;…

scrollIntoView使用与属性详解

scrollIntoView 使用与属性详解 效果图如下图所示 如果要想让元素滚动到指定位置 window.onload function () {containerItems[6].scrollIntoView({ behavior: "smooth" }); };js 代码 const containerItems document.querySelectorAll(".container div&…

2 files found with path ‘lib/armeabi-v7a/liblog.so‘ from inputs:

下图两个子模块都用CMakeLists.txt引用了android的log库&#xff0c;编译后&#xff0c;在它们的build目录下都有liblog.so的文件。 四个CPU架构的文件夹下都有。 上层模块app不能决定使用哪一个&#xff0c;因此似乎做了合并&#xff0c;路径就是报错里的哪个路径&#xff0c…

【算法训练-排序算法 一】【手撕排序】快速排序、堆排序、归并排序

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【手撕排序系列】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

【6k字】详解Python装饰器和生成器

文章目录 1 Python装饰器1.1 什么是装饰器&#xff1f;1.1.1 参数化装饰器 1.2 装饰器的工作原理1.2.1 函数签名保持 1.3 装饰器的应用实例1.3.1 日志记录1.3.2 装饰器链1.3.3 自动注册装饰器 1.4 Summary 2 Python生成器2.1 生成器的定义和基本操作2.2 生成器的惰性求值和内存…