利用Leaflet.js创建交互式地图:绘制固定尺寸的长方形

news2025/4/4 17:29:29

        在现代Web开发中,交互式地图已成为展示地理位置数据的重要工具。Leaflet.js是一个轻量级、功能丰富的开源JavaScript库,用于构建移动友好的交互式地图。在本文中,我们将探讨如何利用Leaflet.js在地图上绘制一个固定尺寸的长方形,扩展我们之前实现的单个多边形绘制功能。

背景

        我们已经实现了一个功能,允许用户在地图上绘制任意形状的多边形。现在,我们希望在此基础上增加一个新功能:用户可以通过点击一个按钮,自动在地图上绘制一个固定尺寸的长方形。

实现步骤

1. HTML界面设计

        首先,我们需要在HTML中添加一个按钮,用于触发绘制长方形的操作。我们使用Vue.js框架来处理按钮点击事件。

<div class="polygonStyle" style="right: 500px" v-if="polygonsData.length == 0">
  <el-button @click="drawFixedSizeRectangle">默认矩形</el-button>
</div>

2. 绘制长方形的JavaScript函数

        在Vue组件的方法中,我们定义了drawFixedSizeRectangle函数,该函数负责计算并绘制固定尺寸的长方形。

data() {
  return {
    defaultWidth:150,     // 默认宽
    defaultHeight:50,    // 默认高
  }
},
methods: {
  // 绘制固定尺寸的长方形
  drawFixedSizeRectangle() {
    const center = this.map.getCenter(); // 地图中心点
    const zoom = this.map.getZoom(); // 当前的缩放级别
    // 计算150米和50米在当前缩放级别和中心纬度下的经纬度差值
    const latDistancePerMeter = 1 / 111111; // 纬度每米大约变化0.000009度
    const lngDistancePerMeter = 1 / (111111 * Math.cos(center.lat * Math.PI / 180)); // 经度每米变化的度数
    const heightInDegrees = this.defaultHeight * latDistancePerMeter;
    const widthInDegrees = this.defaultWidth * lngDistancePerMeter;
    // 定义矩形的南西和北东角点
    const southWest = L.latLng(center.lat - heightInDegrees, center.lng - widthInDegrees);
    const northEast = L.latLng(center.lat + heightInDegrees, center.lng + widthInDegrees);
    // 获取四个角的坐标点
    const coordinates = [
      southWest,
      L.latLng(southWest.lat, northEast.lng), // 东南
      northEast, // 东北
      L.latLng(northEast.lat, southWest.lng) // 西北
    ];
    console.log("矩形四个角的坐标点:", coordinates);
    this.polygonsData.push(coordinates);
  },
}

3. 将坐标点添加到地图

        drawFixedSizeRectangle函数中,我们计算出长方形的四个角点坐标,并将这些坐标存储在polygonsData数组中。接下来通过监听polygonsData的变化进行绘制多边形到地图上。

watch: {
  polygonsData: {
    handler(newValue, oldValue) {
      // 当polygonsData变化时执行
      console.log(newValue, oldValue, "当polygonsData变化时执行");
      this.initMap(); // 初始化
      this.autoSize(); // 自动调整大小
      if (this.polygonsData.length > 0) {
        // 绘制多边形图形
        this.initializeLayers();
      }
      // 控制Leaflet工具栏是否可以绘制/编辑和删除按钮
      this.updateDrawControl();
    },
    deep: true, // 如果需要深度观察对象内部变化
  },
},
methods: {
  // 加载已经有数据的多边形
  renderPolygons() {
    console.log(this.polygonsData, "加载已经有数据的多边形");
    this.polygonsData.forEach((polygonCoords, index) => {
      const polygon = L.polygon(polygonCoords, this.polygonStyle).addTo(
        this.drawnItems
      );
      // 确保使用一致的样式
      polygon.setStyle(this.polygonStyle);
      // 添加点击事件监听器
      polygon.on("dblclick", () => {
        this.handlePolygonClick(polygon);
      });
    });
  },
  // 更新地图上的多边形
  initializeLayers() {
    this.drawnItems.clearLayers();
    // 延迟渲染以确保样式一致
    setTimeout(() => {
      this.renderPolygons();
    }, 100);
  },
}

结论

        通过在Leaflet.js地图上添加一个按钮,用户可以轻松地绘制一个固定尺寸的长方形。这不仅增强了地图的交互性,还为用户提供了更多自定义地图内容的能力。随着技术的发展,我们可以继续探索更多创新的方式来提升用户体验。

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

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

相关文章

堆+堆排序+topK问题

目录 堆&#xff1a; 1、堆的概念 2、堆的结构 3、堆的实现 3.1、建堆 3.1.1、向上调整建堆(用于堆的插入) 3.1.2、向下调整建堆 3.2、堆的删除 3.3、堆的代码实现 3.3.1、Heap.h 3.3.2、Heap.c 堆排序&#xff1a;&#xff08;O(N*log(N))&#xff09; 1、排序如何…

接口测试用例的编写

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、接口测试发现的典型问题 接口测试经常遇到的bug和问题&#xff0c;如下&#xff1a; 传入参数处理不当&#xff0c;导致程序crash类型溢出&#xff0c;导…

下载chromedriver驱动

首先进入关于ChromeDriver最新下载地址&#xff1a;Chrome for Testing availability 进入之后找到与自己所匹配的&#xff0c;在浏览器中查看版本号&#xff0c;下载版本号需要一致。 下载即可&#xff0c;解压&#xff0c;找到 直接放在pycharm下即可 因为在环境变量中早已配…

严重干扰的验证码识别系统源码分享

严重干扰的验证码识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

领夹麦克风哪个品牌好?大疆、西圣、博雅无线麦克风在线测评

​随着科技的不断进步&#xff0c;越来越多的专业音频设备出现在大家的视野中&#xff0c;无线领夹麦克风就是其中之一&#xff0c;并且很多人在视频创作、直播等场景中都会进行选购。但是近些年来无线领夹麦克风市场较为复杂&#xff0c;很多质量不佳的产品混杂其中&#xff0…

安全生产许可证的重要性

在现代社会&#xff0c;安全生产许可证对于企业来说&#xff0c;不仅仅是一种法律要求&#xff0c;更是一种社会责任和企业形象的体现。本文将深入探讨安全生产许可证的重要性&#xff0c;以及它如何影响企业的长期发展和社会责任。 一、法律合规性的重要性 安全生产许可证是企…

Windows上指定盘符-安装WSL虚拟机(机械硬盘)

参考来自于教程1&#xff1a;史上最全的WSL安装教程 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/386590591#%E4%B8%80%E3%80%81%E5%AE%89%E8%A3%85WSL2.0 教程2&#xff1a;Windows 10: 将 WSL Linux 实例安装到 D 盘&#xff0c;做成移动硬盘绿色版也不在话下 - 知乎 (z…

那些网站需要使用OV SSL证书?怎么申请?

&#x1f512; 需要OV SSL证书的网站 &#x1f3e2; 企业网站 公司官网&#xff1a;展示公司信息、产品服务&#xff0c;增强信任度。 电子商务网站&#xff1a;处理在线交易&#xff0c;保护用户数据安全。 &#x1f3e6; 金融网站 银行网站&#xff1a;处理金融交易&#x…

SMB流量分析

SMB协议流量主要分为以下几个阶段 1、 tcp三次握手 2、会话建立(Negotiate Protocol)&#xff1a; 客户端发送Negotiate Protocol Request &#xff0c;其中包含客户端支持的smb协议版本列表以及SMB Header信息 服务端发送Negotiate Protocol Response&#xff0c;包含服务…

Springboot中自定义监听器

一、监听器模式图 二、监听器三要素 广播器&#xff1a;用来发布事件 事件&#xff1a;需要被传播的消息 监听器&#xff1a;一个对象对一个事件的发生做出反应&#xff0c;这个对象就是事件监听器 三、监听器的实现方式 1、实现自定义事件 自定义事件需要继承ApplicationEv…

Git学习尚硅谷(005 idea集成git)

尚硅谷Git入门到精通全套教程&#xff08;涵盖GitHub\Gitee码云\GitLab&#xff09; 总时长 4:52:00 共45P 此文章包含第27p-第p32的内容 文章目录 忽略特定文件在家目录里创建这个文件在.gitconfig文件里配置这个文件 配置IDEA定位到git程序进行添加文件初始化本地库添加单个…

yolov1到yolov5的发展

基础概念 1. YOLO简介 YOLO&#xff08;You Only Look Once&#xff09;&#xff1a;是一种基于深度神经网络的对象识别和定位算法&#xff0c;其最大的特点是运行速度很快&#xff0c;可以用于实时系统。 2. 目标检测算法 RCNN&#xff1a;该系列算法实现主要为两个步骤&am…

数据结构排序——归并排序递归与非递归

基本思想&#xff1a; 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个…

CANopen协议的理解

本文的重点是对CANopen协议的理解&#xff0c;不是编程实现 参考链接 canopen快速入门 1cia301协议介绍_哔哩哔哩_bilibili CANopen是什么&#xff1f; CANopen通讯基础&#xff08;上&#xff09;_哔哩哔哩_bilibili CANopen概述 图1. CAN报文标准帧的格式 CAN的报文可简单…

50projects50days案例代码分析学习、效果,Html+CSS+JavaScript小案例

案例来源于&#xff1a;https://github.com/bradtraversy/50projects50days&#xff0c;部分资源需要科学上网加载使用&#xff0c;往后不再赘述。 合集链接&#xff0c;欢迎订阅&#xff1a; https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzkwODY2OTA5NA&actiongetal…

Invoke-Maldaptive:一款针对LDAP SearchFilter的安全分析工具

关于Invoke-Maldaptive MaLDAPtive 是一款针对LDAP SearchFilter的安全分析工具&#xff0c;旨在用于对LDAP SearchFilter 执行安全解析、混淆、反混淆和安全检测。 其基础是 100% 定制的 C# LDAP 解析器&#xff0c;该解析器处理标记化和语法树解析以及众多自定义属性&#x…

35岁失业后:靠这几个AI副业,也能养活自己

最近几年连续的经济下行&#xff0c;到现在已经彻底传导到所有行业&#xff0c;波及到越来越多的人… 这种波及&#xff0c;最集中反映在失业率上&#xff0c;今年又是1179万应届生毕业即失业&#xff0c;加入到庞大的就业漩涡中&#xff0c;35岁裁员已成常态。 大环境确实如此…

RocketMQ 基础入门

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 前言 RocketMQ 特点 RocketMQ 优势 1. RocketMQ 基本概念 1.1 NameServer 1.1.1 NameServer作用 1.1.2 和zk的区别 1.1.3 高可用保障 1.2 Broker 1.2.1 部署方式 1.2.1.1 单 Master 1.2.1.2 …

OpenAI推出o1,一个能够自我事实核查的模型

ChatGPT的开发者OpenAI宣布了其下一次重大产品发布&#xff1a;一个代号为“Strawberry”&#xff08;草莓&#xff09;的生成式AI模型&#xff0c;正式名称为OpenAI o1。 更准确地说&#xff0c;o1实际上是一个模型家族。周四&#xff0c;两个版本将在ChatGPT和OpenAI的API中…

最新kubernetes的安装填坑之旅(新手篇)

Kubernetes&#xff08;常简称为 K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序&#xff0c;lz也不知道哪根脑经秀逗了&#xff0c;竟然妄挑战学习一下&#xff0c;结果折戟沉沙&#xff0c;被折腾的欲仙欲死&#xff0c;不过…