利用Leaflet.js和turf.js创建交互式地图:航道路线绘制

news2024/9/20 16:44:12

引言

        在现代Web应用中,地图的交互性是提供丰富用户体验的关键。Leaflet.js是一个轻量级的开源JavaScript库,它提供了简单易用的API来构建交云的地图。与此同时,turf.js作为一个强大的地理空间分析库,能够处理复杂的地理数据操作。本文将介绍如何将这两个库结合起来,创建一个交互式的地图组件,专门用于绘制和编辑航道。

准备工作

首先,确保你已经安装了turf.js库。在你的项目中,可以通过npm来安装

npm install @turf/turf

在你的入口文件(例如main.jsapp.js)中,引入turf.js

import * as turf from '@turf/turf'

组件设计

        我们的目标是设计一个用户友好的组件,使用户能够在地图上绘制航道,并且能够实时地调整航道的样式,包括颜色和宽度。组件将包括以下核心功能:

  • 地图初始化
  • 初始渲染航道
  • 开启航道绘制
  • 清除航道图层
  • 动态更改航道样式

实现步骤与代码示例

1. 地图初始化

地图初始化是构建任何地图应用的第一步。我们需要设置地图的中心点、缩放级别,并添加底图。

// 初始化加载
initMap() {
    // 实例
    this.map = L.map("mapRef", {
        center: [21.582007, 111.824558], // 地图中心
        zoom: 15, // 缩放比列
        zoomControl: false, // 是否显示 + - 按钮
        doubleClickZoom: false, // 是否双击放大
        // scrollWheelZoom: false, // 是否可以通过滑轮缩放
        attributionControl: false, // 是否显示右下角leaflet标识
        minZoom: 3, // 最小缩放级别,可以根据需要调整
    });
    // 加载出地图
    const tiandiKey = "YOUR_API_KEY";  // 替换为实际API密钥
    const mapUrl =
        "http://t0.tianditu.gov.cn/vec_w/wmts?" +
        "SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles" +
        "&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" +
        "&tk=" +
        tiandiKey;
    const cvaLayer = L.tileLayer(
        "http://t0.tianditu.gov.cn/cva_w/wmts?" +
        "SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles" +
        "&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" +
        "&tk=" +
        tiandiKey
    );
    this.name = L.tileLayer(mapUrl).addTo(this.map);
    cvaLayer.addTo(this.map);
    if (!this.drawnItems) {
        this.drawnItems = new L.FeatureGroup().addTo(this.map);
    }
    noPageList().then(res=>{
        console.log(res,'获取全部航道');
        let arrData = res.data.filter(
            (item) => item.id !== this.fairwayId
        );
        this.setAlreadyArea(arrData);
    })
    this.$nextTick(res=>{
        if (this.fairwayRoute) {
            this.renderRegion();
            this.isDraw = false;
        }
    })
},

2. 初始渲染航道

在地图初始化之后,我们可以根据传入的航道数据来渲染初始已有的航道,这是为了在后续新增绘制航道的过程中便于进行对比绘制,以免绘制出来的航道跟之前的重合了。

// 渲染路线
renderRegion() {
    console.log(this.polygonStyle,this.drawnItems, "this.polygonStyle数据");
    // 解析经纬度字符串
    const latLongs = this.polygonStyle.fairwayRoute
    .split(";")
    .map((coord) => {
        const [lat, lng] = coord.split(",").map(Number);
        return L.latLng(lat, lng);
    });
    console.log(latLongs,'latLongs');
    let layer = null;
    layer = L.polyline(latLongs, {
        color: '#DD19AC',
        weight: 1,
        dashArray: '10,10',
    });
    console.log(layer,'layer');
    // 将图层添加到地图上
    this.drawnItems.addLayer(layer);
    this.createBufferedRoute(layer, this.polygonStyle);
},
// 创建航道缓冲区
createBufferedRoute(layer, polygonStyle) {
    if(this.fairwayLayer){
        // 这样子把航道图层删掉才能防止出现连续绘制样式叠加的情况(比如航道越画透明度越深)
        this.map.removeLayer(this.fairwayLayer)
    }
    const buffered = turf.buffer(layer.toGeoJSON(), polygonStyle.weight, {
        units: 'meters'
    });
    console.log(buffered,'buffered');
    this.fairwayLayer = L.geoJSON(buffered, {
        style: function(feature) {
            return {
                color: polygonStyle.color,
                fillOpacity: 0.3,
            };
        }
    }).addTo(this.drawnItems);
},

3. 开启航道绘制

用户可以通过点击工具栏的按钮来开启绘制模式,绘制自己的航道。

// 开启绘制路线图层
startDrawRoute() {
    if (this.polygonStyle.weight && this.polygonStyle.color) {
        console.log('开始绘制');
        if (!this.drawnItems) {
            var drawnItems = new L.FeatureGroup();
            this.drawnItems = drawnItems;
            this.map.addLayer(this.drawnItems);
        }
        // 清除之前的绘制
        this.drawnItems.clearLayers();
        console.log(this.polylineOptions,'this.polylineOptions');
        
        // 路线绘制开启
        this.polyline = new L.Draw.Polyline(this.map,this.polylineOptions).enable();
        // 启用绘制路线模式
        this.map.on(L.Draw.Event.CREATED, (event) => {
            console.log(event, "绘制事件");
            var layer = event.layer;
            if (layer instanceof L.Polyline) {
                this.polygonStyle.fairwayRoute = this.convertPolygonsData(layer._latlngs);
                // 添加到地图上(航道路线)
                this.drawnItems.addLayer(layer);
                // 添加到地图上(航道区域)
                this.createBufferedRoute(layer, this.polygonStyle);
                console.log(this.polygonStyle,'最终的');
                this.isDraw = false;
                this.$emit("draw-finished", this.polygonStyle); // 触发事件,传递绘制路线数据
            }
        });
    } else {
        this.$message({
            message: "请输入航道宽度和颜色",
            type: "warning",
        });
    }
},

4. 清除航道图层

用户可以随时清除已绘制的航道,重新开始绘制。

// 清除绘制的路线
clearDrawnItems() {
    console.log('清除绘制的路线');
    // 清空图层组中的所有图层
    if (this.drawnItems) {
        this.drawnItems.clearLayers();
    }
    this.drawnItems = null; // 重置drawnItems
    this.isDraw = true;
    this.polygonStyle.fairwayRoute = ""
    this.$emit("draw-finished", this.polygonStyle); 
},

5. 动态更改航道样式

用户可以通过界面上的控件动态更改航道的宽度和颜色。

watch: {
    "polygonStyle.weight"(newVal, oldVal) {
        if (this.drawnItems) {
            this.drawnItems.clearLayers();
            this.renderRegion();
            this.$emit("draw-finished", this.polygonStyle);
        }
    },
    "polygonStyle.color"(newVal, oldVal) {
        if (this.drawnItems) {
            this.drawnItems.clearLayers();
            this.renderRegion();
            this.$emit("draw-finished", this.polygonStyle);
        }
    },
}

结语

        通过结合Leaflet.js和turf.js,我们成功创建了一个功能丰富的交互式地图组件,专门用于绘制和编辑航道。这种类型的组件可以广泛应用于航海、城市规划和地理信息系统等领域,为用户提供了一种直观且强大的工具来可视化和分析地理数据。

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

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

相关文章

Broadcast:Android中实现组件及进程间通信

目录 一,Broadcast和BroadcastReceiver 1,简介 2,广播使用 二,静态注册和动态注册 三,无序广播和有序广播 1,有序广播的使用 2,有序广播的截断 3,有序广播的信息传递 四&am…

AI产品经理面试100问,三天看完一周拿4个offer

AI产品经理面试100问 Attention(重点掌握) 1.什么是 Attention?为什么要用 Attention?它有什么作用? 2.Attention的流程是什么样的? 3.普通的Attention和Transformer的Self-attention之间有什么关系? 4.什么是Self-attention? Transformer(重点掌握) 1.Transformer是什…

[Linux]:信号(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 信号的引入 1.1 信号的概念 在Linux系统中,信号(…

在泰国旅游不会口语怎么办?求推荐翻译软件!!!

如果在泰国旅游时遇到语言障碍,可以采取以下措施:学习一些基础的泰语短语,使用翻译应用程序,携带翻译卡片,利用身体语言,参加有导游的旅行团,选择提供中文服务的酒店和旅行社,使用地…

【leetcode】字典 哈希表习题

1.两数之和(查找表法-哈希表) 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次…

【人工智能学习笔记】7_智能语音技术基础

智能语音技术概述 智能语音技术通过对语音进行分析、理解和合成,是计算机设备实现“能听会说”、具备自然语音交流的技术能力。其涉及的范围主要有: 语音合成技术语音识别技术语音测评技术语音降噪与增强技术…智能语音技术的研究内容 智能语音技术的研究难点 智能语音技术…

旅行社区应该如何规划?

近年来,旅游行业逐渐恢复,包括微度假、精致露营、康养旅游、乡村民宿等旅游模式。用户旅游支出、旅游人次逐渐恢复,旅游收入仍待提升。 那么旅游社区应该如何搭建,内容如何规划呢? 我们了解到,很多旅游网…

哪个快?用300万个图斑测试ArcGIS Pro的成对叠加与经典叠加

​​​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 在使用ArcGIS Pro的过程中,很多朋友发现,Pro有个成对叠加工具集。很多…

PSG3D V2024 注册机 蓝天大数据三维测绘系统

PSG3D2024三维测绘系统是基于 AutoCAD 平台开发的,以“智能、 专业、高效、易学”为设计目标开发的全新一代地理数据采集、编辑 和联动的专业软件。 系统集成了三维测图、坐标转换、地形处理、数字地模、无人机 辅助、不动产调查、土地确权、部件普查和数据转换等专…

数字产业中心:技术赋能产业,如何重塑行业格局!

在数字化浪潮的推动下,数字产业中心正逐步成为推动经济转型升级的重要引擎。这里,技术不仅仅是工具,更是重塑行业格局、引领未来发展的核心力量。 一、技术融合创新,打破传统边界 数字产业中心通过云计算、大数据、人工智能等前沿…

【Python】练习:控制语句(二)第1关

第1关:分支结构基础实训 第一题第二题第三题第四题(※)第五题(※)第六题第七题 第一题 #第一题 for temp in [-280, -100, 0, 20, 120, 200]:#请在下面编写代码# ********** Begin ********** #if temp>-273.15:F9/…

【Git 操作】Git 的基本操作

文章目录 1. Git 的配置2. 工作区、暂存区、版本库 1. Git 的配置 🐧①首先要新建一个目录,该目录用于放项目代码,在该目录下执行git init命令,用于创建一个 Git的本地仓库。 .git ⽬录是 Git 来跟踪管理仓库的。🐧②…

原生+jquery写自动消失的提示框

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>自动消失消息提示</title> <style>/…

linux内核 devtmpfs介绍

文章目录 概要整体架构流程技术细节 概要 提示&#xff1a;这里可以添加技术概要 linux内核中 devtmpfs实现介绍 内核版本&#xff1a;5.10 Devtmpfs在Linux中是一个特殊的设备文件系统&#xff0c;主要用来linux内核中加速启动过程和管理设备节点。高版本的linux基本都是使用…

25届计算机专业毕设选题推荐-基于python的二手电子设备交易平台【源码+文档+讲解】

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的二手电子设备交…

【渗透测试】——VulnHub靶机渗透实战 | HA:Joker

&#x1f4d6; 前言&#xff1a;Vulnhub 是一个漏洞靶场平台&#xff0c;里面含有大量的靶场镜像&#xff0c;只需要下载虚拟机镜像&#xff0c;导入 VMWare 或者 VirtualBox 即可启动靶场。本文将从环境搭建、端口扫描、目录扫描到信息提取和突破8080端口&#xff0c;尽可能排…

Cesium Shader 广告牌纹理动画

Cesium Shader 广告牌纹理动画 Cesium 在广告牌, 自定义shader实现播放spritesheet. 图片资源: https://www.codeandweb.com/free-sprite-sheet-packer Cesium Shader 广告牌纹理动画

MySQL高阶1843-可疑银行账户

目录 题目 准备数据 ​分析数据 实现 总结 题目 如果一个账户在 连续两个及以上 月份的 总收入 超过最大收入&#xff08;max_income&#xff09;&#xff0c;那么认为这个账户 可疑。 账户当月 总收入 是当月存入资金总数&#xff08;即 transactions 表中 type 字段的…

Vivado FIR IP 详解 (一)

FIR滤波器是数字信号处理中常用的滤波器&#xff0c;除了通过Verilog代码自己实现外&#xff0c;Vivado提供了一个FIR滤波器 IP&#xff0c;可以直接调用。 一、什么是 Vivado FIR IP 核 FIR&#xff08;Finite Impulse Response&#xff09;滤波器即有限长单位冲激响应滤波器…

兔子检测系统源码分享

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