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

news2024/11/26 20:30:28

目录

  • 代码
  • 功能
  • 问题注意
    • 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');
        else
            map.setDefaultCursor(cursor);
    }

    function draw() {
        if (drawflag == 0)
            drawflag = 1;
        else
            drawflag = 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.coloradmin.cn/o/1097166.html

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

相关文章

WordPress 常规设置页面调用媒体中心上传图片插入URL(新版可用)

首先&#xff0c;我们需要在主题或插件文件夹中创建一个 JavaScript 文件&#xff08;如&#xff1a;media-uploader.js&#xff09;&#xff0c;该文件中包含如下代码。 /*** 媒体中心上传 js **/ jQuery(document).ready(function($){var mediaUploader;$(#upload_image_but…

AUTOSAR介绍

AUTOSAR产生背景 车辆功能的创新导致车辆E/E架构日益复杂。与此同时&#xff0c;开发要求通常自相矛盾&#xff1a;例如要求驾驶域辅助系统支持关键性驾驶操控&#xff0c;提高燃油经济性同时符合环境标准。信息娱乐和通信系统与实时车辆环境和在线服务的不断深入整合带来了更…

MASA MAUI 预览Office文件

文章目录 背景介绍1、新建MAUI Blazor项目2、创建OfficeViewer.razor组件3、使用安卓模拟器运行4、兼容iOS 总结 背景 接到一个在Maui中预览Office文件的需求&#xff0c;包含excel、word、PDF三种常见的文件&#xff0c;经过技术选型&#xff0c;最后选择了微软原生支持的off…

如何避免输入中文拼音时触发input事件

如何避免输入中文拼音时触发 input 事件 html 结构 <input type"text" name"" id"" />js 定义了一个输入框并添加了三个事件监听器。以下是每个部分的解释&#xff1a; const input document.querySelector("input"); let i…

记一次U8登录异常问题

最近陆续有同事反映U8系统登录切换不同用户&#xff0c;在选择账套时U8长时间无反应。 一开始在经历二十多秒的等待后还会出现账套下拉列表选项&#xff0c;后来经历更长的时间等待后提示连接SQL服务器错误&#xff0c;如下图&#xff1a; 因为不切换用户时直接登录使用是没有…

leetcode-1.两数之和

1. 题目 2. 解答 遍历数组元素之和&#xff0c;由于只有唯一答案&#xff0c;并且数组中同一个元素不能重复出现&#xff0c; 因此可以使用双重遍历方式来计算所有可能&#xff1b; #include <stdio.h>void solve(int num[], int len, int target) {for (int i 0; i …

spring 注解: 更加简单的存储 Bean

目录 1. 更加简单的存储 Bean 1.1 添加注解 1.1.1 Controller【控制器存储】 1.1.2 Service【服务存储】 1.1.3 Repository【仓库存储】 1.1.4 Component【组件存储】 1.1.5 Configuration【配置存储】 1.1.6 类注解存储 Bean 的命名规则&#xff08;默认命名规则&…

浅谈精密配电多回路监控装置在轨道交通项目上的应用

安科瑞 须静燕 行业背景 轨道交通作为城市公共交通系统的一部分&#xff0c;在过去几十年中得到了广泛的发展和扩张。它在解决城市交通拥堵、减少环境污染、提高城市可持续性等方面发挥了重要作用。随着科技的进步&#xff0c;轨道交通系统也在不断引入新的技术和创新&#xff…

外汇天眼:本周监管警告名单更新,远离以下平台!

监管信息早知道&#xff01;外汇天眼将每周定期公布监管牌照状态发生变化的交易商&#xff0c;以供投资者参考&#xff0c;规避投资风险。如果平台天眼评分过高&#xff0c;建议投资者谨慎选择&#xff0c;因为在外汇天眼评分高不代表平台没问题&#xff01; 以下是监管牌照发生…

出差学知识No4:ubuntu vim中的各种必须掌握的经典操作(持续更新......)

1、给vim模式下打开的文档内容每行之前加上行号&#xff0c;便于问题定位 1、给vim模式下打开的文档内容每行之前加上行号&#xff0c;便于问题定位 摁一下Esc之后输入&#xff1a;set number

CentoS7 安装篇十二:mysql主从搭建(xtrackbackup不停机搭建)

一、mysql主从搭建使用mysql自身自己做&#xff0c;需要停止mysql服务进行&#xff0c;这种情况下面临以下问题 1.影响客户正在运行的软件&#xff0c;数据库比较大的情况下耗时时间长 2.如果不想影响客户使用体验&#xff0c;就是晚上加班搞 为了更好软件体验及避免加班情况&a…

Stm32_标准库_14_串口蓝牙模块_解决手机与蓝牙模块数据传输的不完整性

由手机向蓝牙模块传输时间信息&#xff0c;Stm32获取信息并将已存在信息修改为传入信息 测试代码&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Serial.h"uint16_t num…

可能是入门高阶数学的好通道 —— 很直观易记,又很难判断的真假的数学命题们

1. 有理数和无理数 实数轴上&#xff0c;2.0右侧的第一个实数b&#xff0c;b是无理数&#xff1b;&#xff08;么&#xff1f;&#xff09; 2. 点的个数 实数轴上0.0到2.0之间距离&#xff0c;是0.0到1.0之间距离的2倍&#xff0c;所以&#xff0c;显然&#xff0c;0.0到2.0之…

【LeetCode刷题(数据结构与算法)】:上下翻转二叉树

给你一个二叉树的根节点 root &#xff0c;请你将此二叉树上下翻转&#xff0c;并返回新的根节点 你可以按下面的步骤翻转一棵二叉树&#xff1a; 原来的左子节点变成新的根节点 原来的根节点变成新的右子节点 原来的右子节点变成新的左子节点 上面的步骤逐层进行。题目数据保…

大数据中间件——Kafka

Kafka安装配置 首先我们把kafka的安装包上传到虚拟机中&#xff1a; 解压到对应的目录并修改对应的文件名&#xff1a; 首先我们来到kafka的config目录&#xff0c;我们第一个要修改的文件就是server.properties文件&#xff0c;修改内容如下&#xff1a; # Licensed to the …

【每日一题】只出现一次的数字 III

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;位运算 其他语言cpython3 写在最后 Tag 【位运算】【数组】【2023-10-16】 题目来源 260. 只出现一次的数字 III 题目解读 找出数组中恰好只出现一次的连个元素&#xff0c;其余的所有元素均出现两次。要求算法的时间…

获取Steam余额的几种方式,及Steam余额被红锁的几种情况

今天就跟大家聊聊买余额的话题&#xff0c;获取Steam余额的几种方式&#xff0c;及Steam余额被红锁的几种情况。 什么是买余额呢&#xff1f; 指的就是卖家通过steam市场里面的饰品出售功能&#xff0c;把steam账号里的余额转移到买家账号中。 大家都知道&#xff0c;自从充值…

【前段基础入门之】=>CSS3新特性 2D 变换

导语&#xff1a; CSS3新特性&#xff0c;给我们带来了很多的丰富的过渡变换效果&#xff0c;这些效果使我们的页面效果变得更加的生动&#xff0c;这一章节&#xff0c;就给大家带来CSS3中的第一个变换效果&#xff1a;2D 变换 在正式了解2D 变换之前,我们需要了解&#xff0c…

啥?PS一秒成图?Adobe的逆天黑科技大公开

在日前举行的 Adobe MAX 创意大会上&#xff0c;Adobe Adobe Firefly Image 2&#xff08;萤火虫二代成像模型&#xff09;、Firefly Vector Model&#xff08;萤火虫矢量模型&#xff09;和Firefly Design Model&#xff08;萤火虫设计模型&#xff09;。 Firefly矢量模型是世…

155M传输分析仪 优劣势分析

D240S SDH测试模块&#xff0c;是FT100智能网络测试平台产品家族的一部分&#xff0c;是一个坚固耐用、锂电池超长供电的传统PDH/SDH测试解决方案&#xff0c;支持155Mbps到2.048Mbps速率的传输链路测试。支持在线和离线的传输链路的安装、维护和故障排除应用测试。 同时为经验…