前言

在开发调试过程当中,如果引入的是公司内部的Gis地图信息或者一些第三方定制来的Gis地图数据,当某一些地图块数据缺失的时候,要打开F12去一个个找那些链接(去找对应的xy与layer)失效、那么你可能需要使用以下插件帮你实现瓦片路径、层级可视化

leaflet-map-block

github 地址

npm 地址

该插件封装了一个 Leaflet 的网格图层 LeafletMapBlockLayer,用于在地图上渲染带有网格和文字标记的瓦片。支持自定义网格线样式和网格文字显示。安装和使用都非常简单,代码如下:

npm i leaflet-map-block

使用:

import {LeafletMapBlockLayer} from 'leaflet-map-block/dist/LeafletMapBlock';map.addLayer(new LeafletMapBlockLayer({lineDash: [2, 2]}));

其中LeafletMapBlockLayer是一个类,他的构造函数可以传递一个对象,这个对象就是对这个插件进行的一个配置

值类型默认值说明
strokeStylestring‘red’线颜色
lineWidthnumber2线宽
lineDashnumber[][5,5]线的虚线样式:[0,0] 为实线
showGridTextbooleantrue是否显示网格文字
gridTextColorstring‘black’网格文字颜色
gridFontstring‘12px Arial’gridFont

比方说我们使用的是天地图的瓦片,那么我们的地图URL就是:http://t1.tianditu.gov.cn/DataServer?T=ter_w&x={x}&y={y}&l={z}&tk=tk
,那么当那一块缺了的时候没有渲染出来就可以拿地图上的xyz放到这个链接的xyz值中就可以快速定位到了

在这里插入图片描述

或者说我们有自己的地图的话,那也是一样的替换URL当中的xyz验证一下是不是真的图片缺失,是的话就去对应的文件系统找这个图片就好了

在这里插入图片描述

源码解析

授人以鱼不如授人以渔,这也是在一次机缘巧合之下发生的问题,使用内部地图但是缺失了一些块不好定位的时候,正好再看leaflet官方文档找的。

也就是这个GridLayer图层,我们知道地图渲染是按照瓦片一块块贴到canvas上面,然后渲染一个canvas实现的

一个冷姿势:在leaflet这个官网里面是英文的,如果想看中文版的,把.com改成.cn就可以了

那么正好:来开始封装吧:

  • 定义一个类,继承L.GridLayer
  • 实现构造,用来传递options配置
  • createTile方法会在map.addLayer()将该图层添加到地图的时候调用,返回一个canvas元素【也就是单个的地图瓦片】
  • 既然可以拿到每一次渲染的地图瓦片,那么我们就可以给它添加一些内容了
  • 创建一个canvas元素,这个canvas元素是和地图瓦片一样的大小
  • 给这个canvas元素添加内容【边框和文字】其中层级和定位信息在coords当中可以取到
  • 最后返回这个canvas对象tile就完成了
import L from 'leaflet';interface CanvasLayerOptions extends L.GridLayerOptions {// 线颜色strokeStyle?: string;// 线宽lineWidth?: number;// 线的虚线样式:[0,0]为实线lineDash?: number[];// 是否显示网格文字showGridText?: boolean;// 网格文字颜色gridTextColor?: string;// 网格文字大小、字体等配置gridFont?: string;
}let options: CanvasLayerOptions = {};export class LeafletMapBlockLayer extends L.GridLayer {constructor(data?: CanvasLayerOptions) {super(data);options = {strokeStyle: 'red',lineWidth: 2,lineDash: [5, 5],showGridText: true,gridTextColor: 'black',gridFont: '12px Arial',...data};}createTile(coords: any): HTMLCanvasElement {const tile = L.DomUtil.create('canvas', 'my-leaflet-tile') as HTMLCanvasElement;const size = this.getTileSize();tile.width = size.x;tile.height = size.y;const ctx = tile.getContext('2d');const {strokeStyle = '',lineWidth = 0,lineDash = [0, 0],showGridText = true,gridTextColor = 'black',gridFont = '12px Arial'} = options;if (ctx) {ctx.strokeStyle = strokeStyle;ctx.lineWidth = lineWidth;ctx?.setLineDash(lineDash);ctx?.strokeRect(0, 0, tile.width, tile.height);if (showGridText) {ctx.fillStyle = gridTextColor;ctx.font = gridFont;ctx.fillText(`x:${coords.x}, y:${coords.y}, z:${coords.z}`, 5, 15);}}return tile;}
}

npm publish

既然封装好了,那么也打包发布到npm上吧

  • 修改package.json文件,需要指定
    • name:项目名
    • version:版本号
    • description:项目描述
    • main:入口文件
    • module:es6模块入口文件
    • types:ts类型声明文件
    • keywords:关键字
    • author:作者
    • license:协议
    • scripts:打包脚本
  • 执行打包命令:npm run build-lib,打包完成之后会生成dist目录
  • 登录npm:npm login
  • 发布到npm:npm publish

就这样也就发布到了npm上。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES6从入门到精通:模块化

ES6 模块化基础概念ES6 模块化是 JavaScript 官方标准,通过 import 和 export 语法实现代码拆分与复用。模块化特点包括:每个文件是一个独立模块,作用域隔离。支持静态分析,依赖关系在编译时确定。输出的是值的引用(动…

stm32 USART串口协议与外设——江协教程踩坑经验分享

江协stm32学习:9-1~9-3 USART串口协议与外设 一、串口通信基础知识 1、通信类型: 全双工通信:通信双方能够同时进行双向通信。一般有两根通信线,如USART中的TX(发送)和RX(接收)线&am…

深度学习中的一些名词

向前传播 forward pass 在机器学习中,输入的feature, 通过预测模型,输出预测值,此过程称之为向前传播; 向后传播 backward pass 为了将预测与真实值的产值减小,需要根据差值,更新模型中的参数,此…

鸿蒙系统(HarmonyOS)应用开发之手势锁屏密码锁(PatternLock)

项目概述 基于鸿蒙(OpenHarmony)平台开发的手势密码锁应用,旨在为用户提供安全、便捷且具有良好交互体验的身份验证方式。通过手势图案输入,用户可以轻松设置和验证密码,提升设备的安全性和个性化体验。 功能特点 手…

vue文本插值

好的,我们来详细讲解 Vue 中最基础的数据展示方式:文本插值和在其内部使用的 JavaScript 表达式。 1. 文本插值 (Text Interpolation) 知识点: 文本插值是 Vue 中最基本的数据绑定形式。它使用“Mustache”语法(双大括号 {{ }})…

Python:线性代数,向量内积谐音记忆。

目录1 先说结论2 解释3 欢迎纠错4 论文写作/Python 学习智能体------以下关于 Markdown 编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、…

小程序导航设置更多内容的实现方法

在小程序中实现导航栏设置更多内容,可以通过以下几种方式实现: 1. 使用原生导航栏自定义按钮 javascript // app.json 或页面.json中配置 {"navigationBarTitleText": "首页","navigationBarTextStyle": "black&q…

SpringBoot 解决配置文件有黄色波浪线

在application.properties配置文件中有黄色波浪线,是警告!! 原因:编码格式不一致!! 解决:Settings| Editor | File Encodings | 选择UTF-8

在 Vue 3 中全局使用 Suspense 组件

Suspense 是 Vue 3 引入的一个内置组件,不需要引用可以直接用。用于处理异步依赖的等待状态。虽然 Suspense 主要用于异步组件,但你也可以全局地使用它来管理整个应用的加载状态。 全局 Suspense 的基本用法 1. 在根组件中使用 Suspense // main.js 或…

笔记/计算机网络

Content 计算机网络部分核心概念十大网络协议一览 计算机网络部分核心概念 1. 什么是计算机网络?它最基本的功能是什么? 计算机网络是指通过某种传输介质将多台独立的计算机或设备连接起来,实现数据交换和资源共享的系统。其最基本的功能是数…

时频图数据集更正程序,去除坐标轴白边及调整对应的标签值

当数据集是时频图时可能有一个尴尬的问题,就是数据集制作好后,发现有白边。 其实这也不影响训练模型,可能对模型训练效果的影响也是微乎其微的,于是大多数情况我会选择直接用整张图片训练模型。但是,有的情况下&#x…

mv重命名报错:bash:未预期的符号 ‘(‘附近有语法错误

文章目录 一、报错背景二、解决方法2.1、方法一:文件名加引号2.2、方法二:特殊字符前加\进行转义 一、报错背景 在linux上对一文件执行重命名时报错。原因是该文件名包含空格与括号。 文件名如下: aa (1).txt执行命令及报错如下…

Unity-MMORPG内容笔记-其三

继续之前的内容: 战斗系统 无需多言,整个项目中最复杂的部分,也是代码量最大的部分。 属性系统 首先我们要定义一系列属性,毕竟所谓的战斗就是不断地扣血对吧。 属性系统是战斗系统的核心模块,负责管理角色的所有…

Linux入门篇学习——Linux 帮助手册

目录 一、Linux 帮助手册 1.怎么打开帮助手册 2.安装依赖 3.使用手册查看命令 一、Linux 帮助手册 1.怎么打开帮助手册 打开 ubuntu ,输入 man 命令打开帮助手册,直接在控制台输入 man 就可以了, man 手册一共有 9 页&#xff0c…

2025年后端主流框架对比和竞争格局及趋势发展

2025年的后端开发呈现出云原生主导、性能革命、AI深度融合的技术格局,主流框架在细分领域持续分化,新兴技术快速渗透关键场景。以下是基于行业实践与技术演进的深度解析: 一、主流框架竞争态势与核心能力 1. Java生态:企业级市场的…

bRPC简介

bRPC基础介绍。 什么是RPC? 互联网上的机器大都通过TCP/IP协议相互访问,但TCP/IP只是往远端发送了一段二进制数据,为了建立服务还有很多问题需要抽象: 数据以什么格式传输?不同机器间,网络间可能是不同的字节序&am…

力扣网C语言编程题:在数组中查找目标值位置之二分查找法

一. 简介 上一篇文章对力扣网上"有序数组中查找目标值范围"题目进行了普通的解法。文章如下: 力扣网C语言编程题:在数组中查找目标值位置之暴力解法-CSDN博客 本文使用二分查找法进行实现,因为二分查找法符合题目要求&#xff0…

前端查询条件加密传输方案(SM2加解密)

一、需求背景 控台项目甲方进行安全测试,测试报告其中一条:敏感信息明文传输 1 敏感信息明文传输 中危 查询接口传输手机号、银行卡号等敏感信息时未加密/脱敏处理。 二、解决方案 讨论出的方案是通过前端查询条件加密,后端对加密的…

【Python】Flask网页

Flask第三方库安装命令:pip install flask代码:from flask import Flask app Flask(__name__)app.route("/") def hello():return "Hello world!"if __name__ "__main__":app.run()其中的"Hello world!"可以改…

数字资产革命中的信任之锚:RWA法律架构的隐形密码

首席数据官高鹏团队律师创作,AI辅助 在数字经济的浪潮中,资产的边界正在被重新定义。当一块地产、一笔应收账款、甚至一份碳配额被转化为链上的数字代币时,技术的光芒固然耀眼,但真正决定其生命力的,是背后隐匿的“信…