当前位置: 首页 > 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.xdnf.cn/news/1277443.html

相关文章:

  • Jmeter性能测试之检测服务器CPU/Memory/磁盘IO/网络IO
  • 深度学习-卷积神经网络-AlexNet
  • 【走进Docker的世界】Docker环境搭建
  • 震动马达实现库函数版(STC8)
  • 机器学习——多元线性回归
  • C++移动语义、完美转发及编译器优化零拷贝
  • [创业之路-541]:经营分析会 - 企业的经营分析会,研发负责人负责提供哪些信息?
  • 【RocketMQ 生产者和消费者】- ConsumeMessageOrderlyService 顺序消费消息
  • 不同于传统的简并模分离圆极化天线,基于耦合谐振器的圆极化天线的原理是什么?
  • 如何通过API接口实现批量获取淘宝商品数据?(官方与非官方渠道分享)
  • 代码随想录算法训练营第六十天|图论part10
  • Java 基础编程案例:从输入交互到逻辑处理
  • ATF(TF-A)安全通告 TFV-12(CVE-2024-5660)
  • JDBC的连接过程(超详细)
  • 机器学习——标准化、归一化
  • 从零开始理解百度语音识别API的Python实现
  • nginx 反向代理传递原始域名
  • 前端开发中的常见问题与实战解决方案​
  • PostgreSQL 批量COPY导入优化参数配置
  • GC如何判断对象可以被回收?
  • SpringAI报错:com.github.victools.jsonschema.generator.AnnotationHelper
  • 《设计模式》UML类图
  • Java集合框架、Collection体系的单列集合
  • Elasticsearch QueryDSL 教程
  • Android APK 使用OpenGl 绘制三角形源码
  • Spring Boot 全局异常处理与日志监控实战
  • 智能体革命:网络安全人的角色重塑与突围指南
  • 井字游戏的强化学习
  • 复现论文《基于Retinex理论和深度学习的低照度图像增强算法研究》
  • CompletableFuture实现Excel 多个sheet页批量导出