当前位置: 首页 > article >正文

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

        在现代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.kler.cn/a/307063.html

相关文章:

  • 问:MySQL主从同步的机制梳理?
  • 如何线程安全的使用HashMap
  • OSG开发笔记(三十一):OSG中LOD层次细节模型介绍和使用
  • 闯关leetcode——202. Happy Number
  • 闯关leetcode——3206. Alternating Groups I
  • Spring Boot应用开发:从入门到精通
  • uniapp uni-table合并单元格
  • .SUFFIXES:
  • openGemini 社区人才培养计划:助力成长,培养新一代云原生数据库人才
  • Redis面试题整理
  • 信息学奥赛:青少年编程的高光舞台,通向未来科技的敲门砖
  • 冒泡,选择,快速-排序
  • nestjs cache manager 很ioredis配合使用方案
  • Python Pyvis库创建交互式网络图 高级功能详解
  • 设计模式---中介者模式
  • 智能客服 | AI助理与内部知识库如何优化用户体验
  • 机器学习-深度学习数据集之打架斗殴识别数据集
  • Mysql InnoDB 存储引擎简介
  • Python 解析 JSON 数据
  • RabbitMQ高级篇,进阶内容
  • 【题解】AT_arc035_b [ARC035B] アットコーダー王国のコンテスト事情
  • 手势开关灯
  • 宿舍管理系统的设计与实现 (含源码+sql+视频导入教程)
  • 【Kubernetes】常见面试题汇总(十八)
  • git rev-parse
  • Nginx 文件名逻辑漏洞(CVE-2013-4547)