Leaflet+Leaflet-Geoman绘制天地图

news2024/12/24 20:19:38

在这里插入图片描述
安装所需依赖

yarn add leaflet @geoman-io/leaflet-geoman-free

文档地址
https://leafletjs.cn/
https://geoman.io/

<template>
  <div id="map"></div>
  <div class="handle">
    <button @click="drawMap">绘制区块</button>
    <button @click="cancelDrawMap">取消绘制</button>
    <button @click="editMap">编辑区块</button>
    <button @click="cancelEditMap">取消编辑区块</button>
    <button @click="deleteMap">删除区块</button>
    <button @click="cancelDeleteMap">取消删除区块</button>
    <button @click="getDrawData">获取区块数据</button>
  </div>

</template>
<script setup lang='ts'>
import { onMounted, ref, toRaw } from 'vue'
import * as L from 'leaflet'
import 'leaflet/dist/leaflet.css'
import "@geoman-io/leaflet-geoman-free"
import "@geoman-io/leaflet-geoman-free/dist/leaflet-geoman.css"

const mapTk = import.meta.env.VITE_BASE_MAPTK

onMounted(() => {
  initMap()
})

const map = ref()
const initMap = () => {
  map.value = L.map('map', {
    center: [22.542800, 114.058000], //地图中心显示
    zoom: 16, //缩放等级
    minZoom: 3, // 最小缩放
    maxZoom: 18, // 最大缩放
    attributionControl: false, // 隐藏leaflet图标
    zoomControl: false, //隐藏缩放控件
    preferCanvas: true //使用canvas渲染,性能比svg更好
  })
  L.layerGroup([
    // 影像底图
    L.tileLayer(`http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${mapTk}`),
    // 地形注记
    L.tileLayer(`http://t0.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=${mapTk}`),
  ]).addTo(map.value)

  requireMarker()
  requirePolygon()

  map.value.pm.setLang('zh')

  watchFunc()
}

// 绘制锚点
const requireMarker = () => {
  const arr = [
    { id: 1, marker: [22.542800, 114.058000] },
    { id: 2, marker: [22.54, 114.05] }
  ]
  const markerIcon = L.icon({
    iconUrl: '../src/assets/imgs/qf.png',
    iconSize: [40, 40]
  })
  for (let item of arr) {
    const marker = L.marker(item.marker as unknown as L.LatLngExpression, { icon: markerIcon }).addTo(map.value)
    L.Util.extend(marker, { params: { ...item } })
    marker.on('click', markerClick)
  }
}
const markerClick = (e: L.LeafletEvent) => {
  console.log(e.target.params)
}


// 绘制区块
const requirePolygon = () => {
  const arr = [
    {
      id: 1,
      polygon: [[22.548728, 114.061196], [22.546925, 114.059222], [22.540107, 114.064929], [22.546806, 114.068127], [22.548728, 114.061196]]
    },
    {
      id: 2,
      polygon: [[22.550096, 114.056904], [22.548986, 114.056818], [22.549937, 114.058599], [22.550096, 114.056904]]
    }
  ]
  for (let item of arr) {
    // 使用 toRaw 处理popup关闭后伸缩地图报错:Cannot read properties of null (reading '_latLngToNewLayerPoint')
    const polygon = new L.Polygon(item.polygon as unknown as L.LatLngExpression[][], { color: "#19a7d8" }).addTo(toRaw(map.value))
    L.Util.extend(polygon, { params: { ...item } }) //携带自定义参数
  }
}


const watchFunc = () => {
  map.value.on('pm:remove', (e: any) => {
    console.log("监听删除", e)
  })

  map.value.on('pm:create', (e: any) => {
    console.log("监听创建", e)
  })
}

const drawMap = () => {
  map.value.pm.enableDraw('Polygon', {
    allowSelfIntersection: false, //不允许自相交
  })
}

const cancelDrawMap = () => {
  map.value.pm.disableDraw()
}

const editMap = () => {
  map.value.pm.enableGlobalEditMode({ allowSelfIntersection: false })
}

const cancelEditMap = () => {
  map.value.pm.disableGlobalEditMode()
}

const deleteMap = () => {
  map.value.pm.enableGlobalRemovalMode()
}

const cancelDeleteMap = () => {
  map.value.pm.disableGlobalRemovalMode()
}

const getDrawData = () => {
  const newLayers = map.value.pm.getGeomanDrawLayers() //获取新绘制图层
  console.log(newLayers)
  const allLayers = map.value.pm.getGeomanLayers() // 获取所有的图层
  console.log(allLayers)
}
</script>
<style lang='scss' scoped>
#map {
  width: 100vw;
  height: 100vh;
}

.handle {
  position: absolute;
  top: 10px;
  right: 50px;
  z-index: 401;
}
</style>

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

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

相关文章

什么是生信分析?深入探讨生物信息学的技术、方法与广泛应用

介绍 生物信息学分析&#xff0c;简称生信分析&#xff0c;是一个结合了生物学、计算机科学、信息学和统计学的多学科领域&#xff0c;旨在处理、分析和解释海量的生物数据。随着现代生物技术的发展&#xff0c;尤其是高通量测序&#xff08;Next-Generation Sequencing, NGS&…

ArcGIS热点分析 (Getis-Ord Gi*)——七普地级市人口普查数据的热点与冷点分析

先了解什么是热点分析 ? 热点分析 (Getis-Ord Gi*) 是一种用于空间数据分析的技术&#xff0c;主要用于识别地理空间数据中值的聚集模式&#xff0c;可以帮助我们理解哪些区域存在高值或低值的聚集&#xff0c;这些聚集通常被称为“热点”或“冷点”&#xff0c;Gi* 统计量为…

LSI-9361阵列卡笔记

背景 要将raid0更改为JBOD直通模式 注意的点是要先将raid模式调整为JBOD之后重启机器&#xff0c;即可 备注&#xff1a;转换过程中硬盘中的数据未丢失。 步骤贴图 refer https://zhiliao.h3c.com/questions/dispcont/123250 https://blog.csdn.net/GreapFruit_J/article/…

Debian12安装jdk8环境

下载JDK8 下载页面&#xff1a;https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/ 笔者下载的是8u202&#xff1a; #wget https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz 解压安装 1、使用命令将压缩包复…

Golang | Leetcode Golang题解之第354题俄罗斯套娃信封问题

题目&#xff1a; 题解&#xff1a; func maxEnvelopes(envelopes [][]int) int {n : len(envelopes)if n 0 {return 0}sort.Slice(envelopes, func(i, j int) bool {a, b : envelopes[i], envelopes[j]return a[0] < b[0] || a[0] b[0] && a[1] > b[1]})f : …

旅游网站

TOC springboot281旅游网站 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行业&#xff0…

【今夕是何年】雅达利发布Atari 7800+游戏主机:配备无线手柄、HDMI接口

雅达利&#xff08;Atari&#xff09;发布了Atari 7800游戏主机&#xff0c;目前这款主机在其官方商城接受预定&#xff0c;售价129.99美元。Atari 7800游戏主机&#xff0c;作为Atari 7800系列的革新升级版本&#xff0c;搭载了高效的Rockchip 3128处理器&#xff0c;不仅确保…

Q*算法深度猜想:从Q-learning优化到智能决策

Q*算法深度猜想&#xff1a;从Q-learning优化到智能决策 引言 在强化学习&#xff08;Reinforcement Learning&#xff09;中&#xff0c;Q-learning算法作为一种无模型的学习方法&#xff0c;被广泛应用于解决各种决策优化问题。然而&#xff0c;尽管Q-learning在许多场景下…

基于YOLOv8的船舶目标检测与分割(ONNX模型)

项目背景 需求分析&#xff1a;在海洋监控、港口管理、海事安全等领域&#xff0c;自动化的船只检测与分割技术对于提高效率和安全性至关重要。技术选型&#xff1a;YOLOv8是YOLO系列的一个较新版本&#xff0c;以其速度快、准确率高而著称。使用ONNX&#xff08;Open Neural …

深入理解Softmax:从“Hard”到“Soft”的转变

深入理解Softmax&#xff1a;从“Hard”到“Soft”的转变 在机器学习的分类任务中&#xff0c;Softmax 函数是一个极其重要的工具。它不仅将神经网络的输出转化为概率分布&#xff0c;还能有效处理多分类问题。然而&#xff0c;为了更好地理解Softmax&#xff0c;我们可以先将…

漫画小程序源码全开源商业版

介绍&#xff1a; 漫画小程序源码全开源商业版 带漫画资源&#xff0c;带简单安装说明&#xff0c;可以快速发布一个漫画小程序。 代码下载

秋招力扣Hot100刷题总结——链表

1. 反转链表题目连接 题目要求&#xff1a;给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 代码及思路 遍历所有节点&#xff0c;将所有节点的next指向前一个节点由于要改变节点的next指向&#xff0c;而链表是单向的&#xff0c;因此需要…

Spring MVC域对象共享数据

在Spring MVC中&#xff0c;域对象&#xff08;Domain Object&#xff09;通常指的是与业务逻辑相关的模型对象&#xff0c;它们代表了应用程序中的核心数据结构。例如&#xff0c;在一个电商应用中&#xff0c;Product、User、Order等类可以被视为域对象。这些对象通常与数据库…

Pod基础使用

POD基本操作 1.Pod生命周期 在Kubernetes中&#xff0c;Pod的生命周期经历了几个重要的阶段。下面是Pod生命周期的详细介绍&#xff1a; Pending&#xff08;待处理&#xff09;: 调度: Pod被创建后&#xff0c;首先进入“Pending”状态。此时&#xff0c;Kubernetes的调度器…

设计模式24-命令模式

设计模式24-命令模式 写在前面行为变化模式 命令模式的动机定义与结构定义结构 C 代码推导优缺点应用场景总结补充函数对象&#xff08;Functors&#xff09;定义具体例子示例&#xff1a;使用函数对象进行自定义排序代码说明输出结果具体应用 优缺点应用场景 命令模式&#xf…

查看 CUDA 和 cuDNN 版本

在安装 onnxruntime-gpu 选择版本时需要查看本机 CUDA 和 cuDNN 版本。 查看 CUDA 和 cuDNN 版本 import platform import torchprint("python.version:", platform.python_version()) print("torch.version:", torch.__version__) print("CUDA.vers…

汽车管理 API 接口:开启高效车辆运营新时代

API&#xff08;Application Programming Interface&#xff09;是一种接口&#xff0c;用于不同软件之间的通信。在汽车管理领域&#xff0c;API的应用可以帮助提升车辆运营的效率&#xff0c;让车主和车辆管理者更方便地获取车辆相关信息&#xff0c;进行保养和维修等工作。本…

fastadmin api中无法获取用户信息

控制器使用_initialize方法时&#xff0c;要增加 parent::_initialize(); 这行代码&#xff0c;否则会出现获取不到用户信息的问题&#xff1a; public function _initialize() {// 你的逻辑内容// ...// endparent::_initialize(); }

Chapter 01 Vue入门

前言 Vue 是一个框架&#xff0c;也是一个生态&#xff0c;其功能覆盖了大部分前端开发常见的需求。本文详细讲解了 Vue 的基本概念以及 Vue 开发者工具的安装。 一、Vue简介 ①定义 Vue 是一款用于构建用户界面的渐进式框架。它基于标准 HTML、CSS 和 JavaScript 构建&…

基于RDMA技术的Mayastor解决方案

1. 方案背景和挑战 1.1. Mayastor简介 OpenEBS是一个广受欢迎的开源云原生存储解决方案&#xff0c;托管于CNCF&#xff08;云原生计算基金会&#xff09;之下&#xff0c;旨在通过扩展Kubernetes的能力&#xff0c;为有状态应用提供灵活的持久性存储。Mayastor是OpenEBS项目…