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

Leaflet地图高亮与编辑功能实现

功能概述

本文介绍如何在Leaflet地图中实现要素高亮显示和交互式编辑功能,主要包括:

  1. 清除高亮要素
  2. 同时高亮图形和点要素
  3. 切换编辑模式
  4. 相关UI组件实现
    在这里插入图片描述

核心代码实现

1. 清除高亮功能

const clearHighlights = () => {const mapInstance = map.value?.leafletObject;if (!mapInstance || !highlightState.value.layers) return;// 如果正在编辑,先退出编辑模式if (isEditing.value) {cancelEdit();return;}mapInstance.removeLayer(highlightState.value.layers);highlightState.value = {feature: null,points: null,layers: null};
};

2. 高亮图形和点要素

const highlightBoth = async (feature, points) => {const mapInstance = await map.value?.leafletObject;if (!mapInstance) return;// 清除之前的高亮clearHighlights();// 创建图层组存放所有高亮要素const highlightGroup = L.featureGroup();// 高亮多边形if (feature?.geometry?.type === 'Polygon') {const polygon = mapInstance.editTools.createPolygon(feature.geometry.coordinates[0].map(coord => [coord[1], coord[0]]),{ fillColor: '#00ffff',color: '#00ffff',fillOpacity: 0.2,weight: 5});highlightGroup.addLayer(polygon);}// 高亮点要素if (points?.length > 0) {points.forEach(point => {const marker = L.marker([point.geometry.coordinates[1], point.geometry.coordinates[0]], {icon: L.icon({iconUrl: flightIcon,iconSize: [20, 20],iconAnchor: [10, 10],iconRotate: point.properties.direction || 0}),zIndexOffset: 1000});highlightGroup.addLayer(marker);});}// 添加到地图highlightState.value.layers = highlightGroup;mapInstance.addLayer(highlightGroup);
};

3. 编辑模式切换

const toggleEditMode = async () => {const mapInstance = await map.value?.leafletObject;if (!mapInstance) return;if (isEditing.value) {cancelEdit();return;}// 检查是否有可编辑的图层if (!highlightState.value.layers?.getLayers().length) {ElMessage.warning('没有可编辑的图形');return;}isEditing.value = true;originalGeoJSON.value = JSON.parse(JSON.stringify(highlightState.value.feature));highlightState.value.layers.eachLayer(layer => {if (layer instanceof L.Polygon || layer instanceof L.Polyline) {layer.enableEdit();layer.on('edit', () => {console.log('图形被编辑', layer.toGeoJSON());});}});
};

UI组件实现

<div class="top-bar"><el-tooltip content="图形编辑" placement="left"><div class="icon-bar" @click.stop="toggleEditMode"><el-icon size="30" color="#939393"><Edit /></el-icon></div></el-tooltip>
</div><!-- 编辑状态提示 -->
<div v-if="isEditing" class="edit-status"><div class="edit-indicator">编辑模式</div><el-button type="success" @click="saveEdits">保存修改</el-button><el-button type="warning" @click="cancelEdit">取消编辑</el-button>
</div>

样式优化

/* 编辑状态提示 */
.edit-status {position: absolute;top: 65px;left: 50%;transform: translateX(-50%);z-index: 1000;background-color: rgba(255, 255, 255, 0.9);padding: 10px 20px;border-radius: 20px;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}/* 顶点样式增强 */
:deep(.leaflet-vertex-icon) {width: 12px !important;height: 12px !important;background-color: #FF5722;border: 2px solid white;border-radius: 50%;
}

初始化注意事项

onMounted(async () => {const mapInstance = await map.value?.leafletObject;if (!mapInstance) return;// 初始化编辑选项mapInstance.editOptions = {polygon: {allowIntersection: false,  // 不允许自相交drawError: {color: '#FF0000',message: '不能创建自相交的多边形'}}};
});
http://www.dtcms.com/a/324748.html

相关文章:

  • 【最后203篇系列】031 构建MCP尝试
  • signed 和 unsigned 类型说明符
  • 嵌套-列表存储字典,字典存储列表,字典存储字典
  • Linux 路由子系统深度分析:框架、实现与代码路径
  • web刷题3
  • 商业解决方案技术栈总结
  • Python 获取对象信息的所有方法
  • 基于Spring Boot和SSE的实时消息推送系统
  • 三数之和 Java
  • 人工智能系列(7)人工神经网络中的无监督学习
  • C语言-数组和指针练习题合集(一)
  • C语言深度剖析
  • 网页五子棋测试
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-关于我们
  • 2025最新免费的大模型和免费的大模型API有哪些?(202508更新)
  • 秋招春招实习百度笔试百度管培生笔试题库百度非技术岗笔试|笔试解析和攻略|题库分享
  • 冒泡排序实现以及优化
  • WebSocket集群方案解析与实现
  • My APK 安卓版:高效管理手机应用的工具软件
  • windows的cmd命令【持续更新】
  • Linux应用软件编程---文件操作1(fopen、fclose、fgetc/fputc、fgets/fputs)
  • 什么是浏览器标识?
  • 【Docker进阶实战】从多容器编排到集群部署
  • TSF应用开发与运维部署
  • 个人笔记Mybatis2
  • 医学统计(现况调查的统计分析策略1)
  • 电脑使用“碎片整理”程序的作用
  • 基于ECharts的智慧社区数据可视化
  • 【npm、yarn、pnpm】特点对比,按需选择
  • Java设计模式之开闭原则介绍与说明