利用Leaflet.js创建交互式地图:添加Popup

news2025/1/12 15:48:46

        在现代Web开发中,交互式地图已成为展示地理位置数据的强大工具。Leaflet.js是一个开源的JavaScript库,它提供了一个简单易用的界面来创建这样的地图。在本文中,我们将探讨如何使用Leaflet.js创建一个交互式地图,并添加Popup来显示额外的信息。

概述

        Leaflet.js允许开发者通过简单的API来添加各种地图层和控件。Popup是Leaflet.js中一个非常实用的功能,它可以在地图上的特定位置显示额外的信息。这在需要向用户展示地点详细信息时非常有用,比如地点的描述、图片或其他数据。

实现步骤

1. 初始化地图

首先,我们需要创建一个基础地图实例。这通常涉及到设置地图的初始视图和缩放级别。

var map = L.map('mapid').setView([51.505, -0.09], 13);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    maxZoom: 19,
    attribution: '© OpenStreetMap contributors'
}).addTo(map);

2. 定义多边形数据

        在本例中,我们假设已经有了一个包含多边形数据的数组。

data() {
  return {
    drawnItems: null,
    map: null,
    polygonsData:[],
    detailForm: {},
  };
},

3. 渲染多边形和Popup

        接下来,我们将遍历数据数组,为每个多边形创建一个Leaflet多边形对象,并为其添加Popup。

methods: {
  renderPolygons() {
    console.log("加载多边形", this.polygonsData);
    this.drawnItems.clearLayers(); // 清空之前的图层
    this.polygonsData.forEach((item, index) => {
      // 确保coord不是null
      const polygonCoords = item.polygonsDataItem.map((coord, coordIndex) => {
        if (!coord || typeof coord.lat === "undefined" || typeof coord.lng === "undefined") {
          console.error(`无效的坐标点在索引 ${index}, 坐标点索引 ${coordIndex}:`, coord);
          return null;
        }
        return L.latLng(coord.lat, coord.lng);
      });
      // 过滤掉null的坐标点
      const validCoords = polygonCoords.filter((coord) => coord !== null);
      // 根据onStatus获取对应的样式
      const polygonStyle = this.getPolygonStyleByStatus(item.onStatus);
      const polygon = L.polygon(validCoords, polygonStyle);
      // 计算多边形的中心点
      const center = polygon.getBounds().getCenter();
      // 创建Popup内容
      const popupContent = `
        <div class="content">
          <div class="item">泊位编号:${item.berthNo}</div>
          <div class="item">泊位类型:${item.berthType}</div>
          <div class="item">泊位长度:${item.berthLength ? item.berthLength : '-'}米</div>
          <div class="item">泊位宽度:${item.berthWidth ? item.berthWidth : '-'}米</div>
          <div class="item">泊位水深:${item.berthDepth ? item.berthDepth : '-'}米</div>
          <div class="item">泊位状态:${item.onStatus}</div>
          <div class="btn" id="berthUsageBtn">泊位使用情况</div>
        </div>
      `;
      // 创建Popup
      const popup = L.popup({
        closeButton: false,
        autoClose: true,
        closeOnClick: true,
        className: 'my-custom-popup'
      }).setContent(popupContent);
      // 绑定Popup事件
      this.bindPopupEvents(polygon, item);
      // 绑定Popup到多边形
      polygon.bindPopup(popup);
      this.drawnItems.addLayer(polygon);
    });
  },
  // 触发点击事件
  bindPopupEvents(layer, item) {
    layer.on("popupopen", function (e) {
      const popup = e.popup;
      const container = popup._container;
      const berthUsageBtn = container.querySelector('#berthUsageBtn');
      if (berthUsageBtn) {
        berthUsageBtn.onclick = function () {
          console.log('点击了', item);
          this.detailForm = item;
        }.bind(this);
      }
    }.bind(this));
    layer.on("popupclose", function (e) {
      const popup = e.popup;
      const container = popup._container;
      const berthUsageBtn = container.querySelector('#berthUsageBtn');
      if (berthUsageBtn) {
        berthUsageBtn.onclick = null;
      }
    });
  }
}

4. 自定义Popup样式

为了使Popup更加美观,我们可以通过CSS来自定义其样式。

::v-deep .leaflet-popup-content {
  width: 200px;
  padding: 24px 10px;
  box-sizing: border-box;
  margin: 0;
}
::v-deep .leaflet-popup-tip {
  background: #2F4C79;
}
::v-deep .leaflet-popup-content-wrapper {
  background: #2F4C79;
  box-shadow: 0px 0px 12px 0px rgba(0, 0, 0, 0.12);
  .content {
    display: flex;
    flex-direction: column;
    font-weight: 500;
    font-size: 16px;
    .item {
      color: #FFFFFF;
      margin-bottom: 10px;
    }
    .btn {
      display: flex;
      align-items: center;
      justify-content: center;
      cursor: pointer;
      width: 100%;
      color: #EBF2FF;
      line-height: 16px;
      text-align: left;
      font-style: normal;
      text-decoration-line: underline;
    }
  }
}

结论

        通过上述步骤,我们成功地在Leaflet.js地图上添加了交互式的多边形和Popup。这种方法不仅提高了地图的交互性,还增强了用户体验。Leaflet.js的强大功能和灵活性使其成为创建交互式地图的理想选择。

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

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

相关文章

配置WSL(单纯记录

[参考链接(https://blog.csdn.net/mustuo/article/details/133960230) 1.开始相关功能 在控制面板-启用或关闭windows功能中 勾选适用于Linux的Windows子系统和虚拟机平台 重启后用管理员权限打开Powershell dism.exe /Online /Enable-Feature /FeatureName:VirtualMachinePl…

js TypeError: Cannot read property ‘initialize’ of undefined

js TypeError: Cannot read property ‘initialize’ of undefined 在JavaScript开发旅程中&#xff0c;遇到TypeError: Cannot read property ‘initialize’ of undefined这样的错误提示&#xff0c;无疑是令人沮丧的。这个错误通常意味着你试图访问一个未定义对象的initiali…

Mac 电脑 git credential osxkeychain问题之一

git credential osxkeychain问题&#xff0c;无法拉取最新代码&#xff0c;failed to get:-128 1.问题描述 不知道是系统还是brew进行了更新&#xff0c;启动项目后 git pull 无法拉取最新代码&#xff0c;git项目git pull 操作时突然提示&#xff1a;git credential osxkeych…

NPU 与 GPU 相比,有什么差别?| 技术速览

编者按&#xff1a; 随着2024年被业界誉为“AI PC元年”&#xff0c;各大笔记本电脑厂商纷纷推出搭载NPU的全新AI PC&#xff0c;而在介绍产品性能时&#xff0c;“NPU”一词频频被提及。但NPU和我们所熟知的GPU之间的区别究竟是什么&#xff1f; 我们今天为大家分享的这篇文章…

RS485隔离方案对比

RS485总线作为一种通用串口通信总线,在工业智能仪表、通讯设备等领域中应用广泛,得益于其优秀的抗干扰能力、长距离传输能力以及高数据传输速率。然而,在实际应用中,RS485总线在面临复杂电磁环境和远距离通信时,可能会受到各种电气干扰,导致信号传输不稳定,甚至可能损坏…

STM32G474读写FLASH

STM32G474读写FLASH主要用来将FLASH的部分页用来存储用户数据&#xff0c;以及分析是如何将“主FLASH存储器”作为引导区。 1、FLASH说明 STM32片内的FLASH分成两部分&#xff1a;主存储块、信息块。 “主FLASH存储器”用来存放用户程序,也就是我们写的程序,都存放在这里。 “…

LabVIEW编程快速提升的技术

在LabVIEW程序员的成长过程中&#xff0c;很多技术和概念看似简单、常用&#xff0c;但真正掌握并能熟练运用&#xff0c;往往需要踏踏实实的实践与积累。没有什么是能够一蹴而就的&#xff0c;唯有通过不断的专注与深入&#xff0c;才能获得显著的提升。要想在LabVIEW开发上取…

Maven 常见问题以及常用命令

常见问题 &#xff1a; 1. 识别不了maven项目 mvn clean install -Dmaven.test.skiptrue //构建 2. 打jar包时报异常 指定下jdk版本 常用命令&#xff1a; mvn clean mvn package mvn install mvn deploy

电气负载模拟器

电气负载仿真的概念涉及控制电力电子转换器&#xff0c;使其行为类似于实际电气负载。例如&#xff0c;电压源逆变器 (VSI) 可以仿真感应电机。在不同情况下&#xff0c;负载仿真器的使用至关重要。它有助于分析在各种负载条件和环境下将多台机器连接到电网的可行性。的部分是&…

【数据结构初阶】栈接口实现及经典OJ题超详解

文章目录 1. 概念与结构1. 1 栈底层结构选型 2. 栈实现2. 1 栈的定义2. 2 栈的初始化2. 3 入栈2. 4 判空2. 5 出栈2. 6 取栈顶元素2. 7 栈大小2. 8 栈销毁2. 9 打印 3. 经典OJ题3. 1 有效的括号 1. 概念与结构 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和…

IMS 注册流程(详细)

目录 业务模型 图1 EPC 网络附着示意图 图2 IMS 网络注册示意图 注册信令流程 图3 基本注册流程&#xff08;EPC网络-融合HLR/HSS&#xff09; IMS 注册流程 01&#xff1a;UE->P-CSCF 02&#xff1a;P-CSCF->I-CSCF 03&#xff1a;I-CSCF 处理 04&#xff1a;…

组成原理:体系结构,CPU,存储器,Cache

1&#xff0c;系统架构 1.1&#xff0c;组成结构 【硬件】是指计算机的实体部分&#xff0c;它由看得见摸得着的各种电子元件&#xff0c;各类光、电、机设备的实物组成。所有硬件通过总线和接口连接在一起&#xff0c;构成一台完整的计算机。 &#xff08;1&#xff09;运算器…

Spark的介绍

一、分布式的思想 不管是数据也好&#xff0c;计算也好&#xff0c;都没有最大的电脑&#xff0c;而是多个小电脑组合而成。 存储&#xff1a;将3T的文件拆分成若干个小文件&#xff0c;例如每500M一个小文件&#xff0c;将这些小文件存储在不同的机器上 。 -- HDFS 计算&#…

LeetCode_sql_day21(1440.计算布尔表达式的值)

描述&#xff1a; 表 Variables: ------------------------ | Column Name | Type | ------------------------ | name | varchar | | value | int | ------------------------ 在 SQL 中&#xff0c;name 是该表主键. 该表包含了存储的变量及其对应…

2024年华为9月4日秋招笔试真题题解

2024年华为0904秋招笔试真题 二叉树消消乐好友推荐系统维修工力扣上类似的题--K站中转内最便宜的航班 二叉树消消乐 题目描述 给定原始二叉树和参照二叉树(输入的二叉树均为满二叉树&#xff0c;二叉树节点的值范围为[1,1000]&#xff0c;二叉树的深度不超过1000)&#xff0c…

智汇云舟斩获创客北京2024鲲鹏应用创新大赛北京区总决赛一等奖

近日&#xff0c;创客北京2024鲲鹏应用创新大赛华鲲振宇北京赛区总决赛在北京鲲鹏联合创新中心圆满举办。智汇云舟团队的参赛作品“视频孪生&#xff0c;把数字孪生升级为虚实共生”斩获鲲鹏原生开发赛道&#xff08;泛政府&#xff09;一等奖。 面向全球开发者的顶级赛事&…

python去除非页眉页脚,非背景非正式的图片、文字水印代码

import fitz import os import shutildef remove_watermarks_by_sizes(pdf_path, output_path, watermark_sizes, watermark_rects, watermark_texts):"""从PDF中删除特定大小的图片&#xff08;水印&#xff09;和特定的文字。参数:pdf_path (str): 输入PDF文件…

现金检测系统源码分享

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

草莓大模型(o1 )同步——实战2024国赛数学建模C题

模型介绍 这是一系列全新AI模型&#xff0c;能推理复杂的任务&#xff0c;解决比以前科学、编程、数学模型更难的问题。o1 模型(草莓&#xff09;与 GPT-4o 的主要区别在于:它能够比前代更好地处理复杂的编程和数学问题&#xff0c;并能解释其推理过程.以往模型不同的是&#…

引用和指针的区别(面试概念性题型)

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 概念概述 内存占用&#xff1a; 引用&#xff1a;引用一个变量时&#xff0c;实际上并不占用额外的内存空间&#xff0c;它就是原始变量的别名。指针&#xf…