基于CanvasLabel的Leaflet矢量数据免切片属性标注实践

目录

前言

一、Leaflet.CanvasLabel 

1、开源地址

2、设置参数说明 

二、组件集成

1、新建html文件

2、声明样式

3、定义矢量文本渲染器

4、定义地图

5、添加矢量数据

6、最终效果

 总结


前言

        在一般的业务场景中,针对小量的矢量数据,比如POI兴趣点、线数据、面数据等,可以直接以空间图形的方式之间展示,以Leaflet为例,采用Point,PolyLine等,但是一般的地图组件是不带中文标注的。除了采用原生渲染组件外,可以采用矢量瓦片、png瓦片等方式。关于矢量瓦片和png瓦片的技术生成方案,可以采用具体的技术。具体的生成技术,以后可以专门写一些相应博客进行阐述。

        本文使用的组件的使用场景是,在矢量数据免切片的情况下,将点数据进行点地图展示,同时将矢量数据的属性作为标注在地图上展示出来。这都可以是动态配置的,相对于静态预切技术,使用这种方式可以实现最大的用户灵活度,根据业务场景需要灵活定制。

        本文将重点介绍Leaflet.CanvasLabel插件,然后介绍插件的属性,其次讲解和Leaflet进行结合使用生成一个可展示的例子,通过实例结合代码的方式进行讲解,让您更好的掌握这款插件。

一、Leaflet.CanvasLabel 

        Leaflet-CanvasLabel 用于在矢量数据上显示标签,样式设置基于Canvas标准,还提供了偏移,缩放,旋转,指定显示位置等设置参数。同时为了避免标签重叠,插件隐藏了一些标签,通过参数`collisionFlg`为`false`禁用碰撞检测。显示顺序为 collisionFlg=false优先collisionFlg=true,zIndex大的优先zIndex小的。

1、开源地址

        Leaflet.CanvasLabel的开源地址为leaflet-canvas-label。

2、设置参数说明 

名称类型描述
canvas参数https://www.runoob.com/tags/ref-canvas.html
font="10px sans-serif"标注文字属性
fillStyle="rgba(0,0,0,1)"
strokeStyle="rgba(0,0,0,1)"
textAlign="center"文本对其方式,默认居中
textBaseline="middle"
lineWidth=1Number线宽,默认1
其他参数
offsetX=0Number横坐标偏移(像素)
offsetY=0Number纵坐标偏移(像素)
scale=1Number放大比例
rotation=0Number旋转角度(弧度),可能会导致碰撞检测不准确
text=nullString标注文本内容
minZoom=nullNumber最小显示级别
maxZoom=nullNumber最大显示级别
collisionFlg=trueBoolean碰撞检测
center=null[lat,lng]|L.LatLng标注位置,默认为null,会自动计算几何中心
zIndex=0Number排序
defaultHeight=20Number文本高度,无法自动计算,所以直接传参手动调整

二、组件集成

        这里将详细说明Leaflet.CanvasLabel控件如何在Leaflet中进行使用,这里主要演示线数据和模拟点数据。

1、新建html文件

        新建index2.htm资源文件,在代码中需要引入Leaflet及Leaflet.CanvasLabel控件的js组件。关键源代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Leaflet.CanvasLabel插件,用于显示矢量文本标注</title><link rel="stylesheet" href="/2d/leaflet/leaflet.css" /><script src="/2d/leaflet/leaflet.js?v=1.0.0"></script>
</head><body><div class="container"><div class="map" id="map"></div></div><script src="../dist/leaflet.canvaslabel.js"></script>
</body></html>

2、声明样式

<style>body {font-family: Arial, Helvetica, sans-serif;}.container {margin: 0 auto;max-width: 100%;}.map {width: 100%;height: 608px;}.header {padding-top: 5px;}</style>

3、定义矢量文本渲染器

 //矢量文本标签渲染器var canvasLabel = new L.CanvasLabel({defaultLabelStyle: {collisionFlg: true,scale: 1,strokeStyle: "#000",fillStyle: "#fff",lineWidth:3}});

4、定义地图

        定义地图时尤其要注意,与之前的定义地图方式不一样,这里在创建地图对象时需要设置渲染对象,如果不定义将看不到效果, renderer: canvasLabel就是关键之处。

//定义地图var map = L.map('map', {renderer: canvasLabel}).setView([29.40, 117.40], 6);

5、添加矢量数据

        首先添加一些线数据,

//添加矢量数据var p = L.polyline([[[34.252676, 108.962402],[33.83392, 109.929199],[32.657876, 109.050293],[31.877558, 106.787109],[31.428663, 104.655762],[30.600094, 104.040527],[29.97397, 103.842773],[28.690588, 104.589844],[28.825425, 105.424805],[29.53523, 106.589355],[27.605671, 106.984863],[26.568877, 106.611328],[26.39187, 108.786621],[27.44979, 110.039063]]], {labelStyle: {text: '西部环线',zIndex: 0,collisionFlg: false,textAlign:'right'},color: '#fe57a1',}).addTo(map);

        再来添加点数据,这里仅演示功能,点坐标采取随机生成1000个点的方式。

for (let i = 0; i < 3000; i++) {let latlng = L.latLng(23.95 + Math.random() * 10, 112.40034 + Math.random() * 15);var title = "重要城市" + Math.random();let c = L.circleMarker(latlng, {radius: 5,labelStyle: {text: title,rotation: 0,zIndex: i,//minZoom : 6,//strokeStyle: "#000",strokeStyle: "red",}}).addTo(map);var content = "【名称】:"+title;c.bindPopup(content);}

6、最终效果

 总结

        以上就是本文的主要内容,  本文将重点介绍Leaflet.CanvasLabel插件,然后介绍插件的属性,其次讲解和Leaflet进行结合使用生成一个可展示的例子,通过实例结合代码的方式进行讲解,让您更好的掌握这款插件。行文仓促,如有不当之处,还请各位专家朋友批评指正。

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

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

相关文章

java现在就业环境怎么样?

java现在就业环境怎么样&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#…

运用多媒体辅助教学的好处

在教育信息化的大背景下&#xff0c;运用多媒体辅助教学已经成为了当今课堂的标配。但很多老师或许只是盲目地追求形式&#xff0c;而未能深入体会到其真正的价值。那么&#xff0c;运用多媒体辅助教学究竟有哪些好处呢&#xff1f; 多媒体辅助教学能够提起学生的学习兴趣。传统…

机械设计-哈工大课程学习-螺纹连接

圆柱螺纹主要几何参数螺纹参数 ①外径&#xff08;大径&#xff09;&#xff0c;与外螺纹牙顶或内螺纹牙底相重合的假想圆柱体直径。螺纹的公称直径即大径。 ②内径&#xff08;小径&#xff09;&#xff0c;与外螺纹牙底或内螺纹牙顶相重合的假想圆柱体直径。 ③中径&#xff…

Ubuntu重设root的密码

重设root的密码 未重设密码之前&#xff0c;Ubuntu 中默认的 root 密码是随机的&#xff0c;即每次开机都会有一个新的root 密码&#xff0c;所以此时的 root 用户密码并不确定&#xff1b; 重设root 密码&#xff0c;使用安装时创建的用户登录后sudo su切换至root用户&#…

MES管理系统为何成为汽配企业的刚需

随着经济全球化、产品定制化及安全法规的严格化&#xff0c;汽配企业的经营环境变得越来越复杂。中国劳动力资源和原辅料成本的持续上升&#xff0c;导致行业利润率不断下滑。为了应对这些挑战&#xff0c;汽配企业需要引入一种精益制造和管理的工具&#xff0c;而MES管理系统正…

gdb调试工具详解

一、知识铺垫 1、程序的发布方式有两种&#xff0c;debug模式和release模式 2、gcc/g形成的可执行程序默认是release模式 3、要使用gdb调试&#xff0c;必须在源代码生成可执行程序的时候, 加上 -g 选项 命令&#xff1a;gcc test.c -o test -g 很明显可以看出debug模式下的…

DBA技术栈MongoDB: 数据增改删除

该博文主要介绍mongoDB对文档数据的增加、更新、删除操作。 1.插入数据 以下案例演示了插入单个文档、多个文档、指定_id、指定多个索引以及插入大量文档的情况。在实际使用中&#xff0c;根据需求选择适合的插入方式。 案例1&#xff1a;插入单个文档 db.visitor.insert({…

深度解析 Compose 的 Modifier 原理 -- PointerInputModifier

" Jetpack Compose - - Modifier 系列文章 " &#x1f4d1; 《 深入解析 Compose 的 Modifier 原理 - - Modifier、CombinedModifier 》 &#x1f4d1; 《 深度解析 Compose 的 Modifier 原理 - - Modifier.composed()、ComposedModifier 》 &#x1f4d1; 《 深入解…

智慧文旅运营综合平台:重塑文化旅游产业的新引擎

目录 一、建设意义 二、包含内容 三、功能架构 四、典型案例 五、智慧文旅全套解决方案 - 210份下载 在数字化浪潮席卷全球的今天&#xff0c;智慧文旅运营综合平台作为文化旅游产业与信息技术深度融合的产物&#xff0c;正逐渐显现出其强大的生命力和广阔的发展前景。 该…

JAVA RPC Thrift基操实现与微服务间调用

一、Thrift 基操实现 1.1 thrift文件 namespace java com.zn.opit.thrift.helloworldservice HelloWorldService {string sayHello(1:string username) }1.2 执行命令生成Java文件 thrift -r --gen java helloworld.thrift生成代码HelloWorldService接口如下 /*** Autogene…

Android OpenGL EGL使用——自定义相机

如果要使用OpenGl来自定义相机&#xff0c;EGL还是需要了解下的。 可能大多数开发者使用过OpengGL但是不知道EGL是什么&#xff1f;EGL的作用是什么&#xff1f;这其实一点都不奇怪&#xff0c;因为Android中的GlSurfaceView已经将EGL环境都给配置好了&#xff0c;你一直在使用…

数据操作——Column 对象

Column 对象 1. 什么是Column对象 Column 表示了 Dataset 中的一个列, 并且可以持有一个表达式, 这个表达式作用于每一条数据, 对每条数据都生成一个值 2.Column对象如何创建 ’ 单引号 ’ 在 Scala 中是一个特殊的符号, 通过 ’ 会生成一个 Symbol 对象, Symbol 对象可以理…