在Leaflet中使用divIcon进行自定义标绘实战

前言

        之前在一些地理信息和旅游博主的信息介绍中,对于一些景点的信息时空分布。总是被他们的地图制作所深深吸引。与常规的地图文字标绘不同的是,在传统的地图标绘中,我们习惯于将文字信息直接标注到对应的位置点旁边。当然,这样其实也是没有什么问题的。只是觉得在哪些博主的制作中,他们喜欢在标注点附件不直接标记文字,而是类似于拉一条牵引线,然后在牵引线的末端再进行中文解释的展示。类似于下面的效果。

        为了在地图中凸出一些重点需要表达的城市,它目标区域内的重要点位标注出来。比如上图中的汕尾、漳州、福州、台湾省的台中市、同富村、高雄市、日本的丰原等地名。围绕这之前的演习区域,将重点城市展示出来,不仅提升了整体的标注效果,更提升了整体的效果。

        但是以上效果直接在Leaflet当中是没有直接的效果展示的,也没有可以直接借鉴的例子(本人在Leaflet的相关插件中寻找了一番,均没有收获)。因此本文以Leaflet为例,主要讲解如何在Leaflet实现上面的标绘场景。首先讲解Leaflet中divicon的相关属性和方法,然后讲解如何在Leaflet中基于divicon进行效果标绘。如果您也是这种标绘效果有兴趣,不妨来这里看看。

一、Divicon简介

        在这里,我们首先来看,要实现上面的效果,包含两个方面。第一个是可以实现根据坐标点进行坐标标定的要求。其次,与常规的标绘方法不同,为了突出展示需要。我们在目标标绘点上进行了类似拉线和拖尾的实现,然后在连接线的尾部进行中文名称的标记填充。为了实现这个需求,我们来看一下如何在Leaflet当中进行实现呢?要想实现下面的功能,就需要用到divicon。因此这里需要对divicon的相关知识进行介绍。

1、什么是divicon

        要在leaflet当中实现上述的功能,需要对展示的html进行个性化处理。因此,这里先读divicon的相关知识进行介绍。在Leaflet的官网中,可以找到其相关介绍,这里方便大家直接学习,将官网的知识进行摘录。

        然后点击divicon,跳转到更详细的描述信息。DivIcon代表一个轻量级的标记图标,使用一个简单的<div> 元素而不是图片。继承自 Icon ,但忽略了 iconUrl 和 shadow 选项。默认情况下,它有一个 'leaflet-div-icon' CSS类,并被设计成一个带有阴影的白色小方块。

2、相关属性和方法介绍

        为了了解DivIcon的具体使用方法,下面结合官网来介绍一下其相关的属性和方法。在后面的实战过程中会使用到。

构造函数说明
L.divIcon(<DivIcon options> options)用给定的选项创建一个 DivIcon 实例。

        本类中的DivIcon属性如下:

选项类型默认值说明
htmlString|HTMLElement''自定义 HTML 代码,放在 div 元素内,默认为空。或者,一个 HTMLElement 的实例。
bgPosPoint[0, 0]可选的背景的相对位置,单位是像素

         其它选项是继承至Icon对象,在DivIcon中也是可以正常使用的。

选项类型默认值说明
iconUrlStringnull(必填) 图标图像的URL(绝对路径或目前脚本所在的相对路径)。
iconRetinaUrlStringnull图标图像的视网膜尺寸版本的URL(绝对路径或目前脚本所在的相对路径), 用于视网膜屏幕设备。
iconSizePointnull图标图像的尺寸,单位是像素。
iconAnchorPointnull图标 "tip" 的坐标(相对于其左上角)。图标将被对齐,使该点位于标记的地理位置。如果指定了尺寸,默认为居中,也可以在CSS中设置负的边距。
popupAnchorPoint[0, 0]弹出窗口(popup)的坐标,相对于图标锚点而言,将从该点打开。
tooltipAnchorPoint[0, 0]工具提示(tooltip)的坐标,相对于图标锚点而言,将从该点打开。
shadowUrlStringnull图标阴影图像的URL。如果不指定,将不会创建阴影图像。
shadowRetinaUrlStringnull
shadowSizePointnull阴影图像的大小,单位是像素。
shadowAnchorPointnull阴影 "tip" 的坐标(相对于其左上角)(如果没有指定,则与iconAnchor相同)。
classNameString''用户给图标和阴影图像指定自定义类名,默认为空
crossOriginBoolean|Stringfalse是否将 crossOrigin 属性添加到瓦片中。 如果提供了字符串,则所有瓦片的 crossOrigin 属性都将设置为提供的字符串。 如果您想访问平铺像素数据,则需要这样做。 有关有效的字符串值,请参阅 CORS 设置。

        以上就是在Leaflet中关于DivIcon对象的简要介绍和相关的属性和方法的介绍。在上面的文档中可以很清晰的看到,在DivIcon中可以传入一个自定义的网页元素,以及可以自己控制展示的元素的样式。下面将结合具体的例子来进行介绍。

二、DivIcon标绘实战

        本小节将从实战出发,重点介绍如何使用DivIcon来实现一个自定义的自由标绘。主要的效果在文章的开始已经进行了介绍,在此不再进行赘述。闲言少叙,下面直接进入正题。

1、定义标绘点

        为了演示创建的相关代码,这里提供演示的标绘点。是一个json数组,json对象包括经纬度和文本标绘名称。关键代码如下所示:

// 待标绘的点
var dataJson = [{lat:24.251973,lon:123.873596,name:"日本丰原23"},{lat:24.497146,lon:117.91626,name:"福建省漳州市20"},{lat:24.116675,lon:120.695801,name:"中国台湾省台中市18"},{lat:22.634293,lon:120.300293,name:"中国台湾省高雄市25"},{lat:26.046913,lon:119.245605,name:"中国福建省福州市23"},{lat:23.58979,lon:120.880508,name:"中国台湾省同富村24.5"},{lat:22.745789,lon:115.378418,name:"中国广东省汕尾市23"}
];

        接着我们使用Leaflet当中循环进行点创建,关键代码如下:

for(var i=0;i<dataJson.length;i++){L.marker([dataJson[i].lat, dataJson[i].lon], {icon: L.divIcon({iconSize: null,className: '',popupAnchor:[5,5],shadowAnchor:[5,5],html: "<div class='marsBlackPanel'  animation-spaceInDown><div class='marsBlackPanel-text' style=''>"+dataJson[i].name+"<span class='temperature'></span> ℃</div></div>"})}).addTo(map);
}

        到这里其实我们已经实现了循环添加DivIcon对象,也使用html对象将一个html对象传入到页面中。于此同时,我们也设置了DivIcon对象的一些属性。请注意,在这里也可以同时传入一个div的className,传入一个外部的样式。接下来就是文章的重点,即如何进行样式的控制。

2、样式的控制

        刚开始拿到需求的时候,原来想着动态划线,但是这样的成本有点高,而且很多动态的计算。换一个思路来实现,我们可以使用网页的样式来实现上述的效果。下面分享一个css样式,大家可以直接复制去使用。

.marsBlackPanel {min-width: 90px;min-height: 35px;position: absolute;left: 16px;bottom: 31px;cursor: default;border-radius: 4px;opacity: 0.96;border: 1px solid #14171c;box-shadow: 0px 2px 21px 0px rgba(33, 34, 39, 0.55);border-radius: 4px;box-sizing: border-box;background: linear-gradient(0deg, #1e202a 0%, #60c720 100%);
}.marsBlackPanel::before {content: "";width: calc(100% + 22px);height: 39px;position: absolute;bottom: -39px;left: -22px;background: url(/2d/images/popupLbl.png) 0px 0px no-repeat;background-position: 0px 0px;
}.marsBlackPanel-text {width: 100%;height: 100%;min-height: 33px;text-align: center;padding: 5px 5px 0 5px;margin: 0;font-size: 14px;font-weight: 400;color: #ffffff;border: 1px solid #ffffff4f;-webkit-box-sizing: border-box;box-sizing: border-box;white-space: nowrap;
}

        需要注意的是,这里用到了一个图片。图片地址为:

http://mars2d.cn/img/marker/popupLbl.png

        同时,在进行颜色控制时,使用了渐变色的效果控制,实现css如下:

background: linear-gradient(0deg, #1e202a 0%, #60c720 100%);

        还有一个宽度的动态计算,可以支持根据传入的文字的宽度来动态计算。这样就能样式的自动计算来扩展了。不需要手动指定宽度,相关代码如下:

width: calc(100% + 22px);

        经过以上的步骤,我们就可以在地图上展示出以下的页面效果:

         以上就已经完整的实现基于DivIcon的自定义标绘的可视化功能。

三、总结

        以上就是本文的主要内容,本文以Leaflet为例,主要讲解如何在Leaflet实现上面的标绘场景。首先讲解Leaflet中divicon的相关属性和方法,然后讲解如何在Leaflet中基于divicon进行效果标绘。行文仓促,定有许多不足之处,如有发现不足,还恳请各位专家博主在评论区留下真知灼见,不胜感激。博文编写的过程参考了Mars2d网站的相关实现,大家可以搜索相关网站示例学习使用。

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

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

相关文章

电脑快速切换IP地址命令是什么?详解与实践

有时&#xff0c;出于安全考虑或测试需要&#xff0c;我们可能需要快速切换电脑的IP地址。虽然这一过程在初学者看来可能略显复杂&#xff0c;但通过简单的命令和步骤&#xff0c; 即使是普通用户也能轻松实现。本文将详细介绍在Windows系统中快速切换IP地址的几种方法&#xf…

基于Jenkins+K8S构建DevOps自动化运维管理平台

目录 1.k8s助力DevOps在企业落地实践 1.1 传统方式部署项目为什么发布慢&#xff0c;效率低&#xff1f; 1.2 上线一个功能&#xff0c;有多少时间被浪费了&#xff1f; 1.3 如何解决发布慢&#xff0c;效率低的问题呢&#xff1f; 1.5 什么是DevOps&#xff1f; 1.5.1 敏…

潜水打捞系统助力,破解汽车打捞难题

随着人类活动的不断扩展&#xff0c;汽车落水事故频发&#xff0c;成为救援工作中的一大难题。汽车因其重量和结构特性&#xff0c;一旦沉入水体&#xff0c;打捞工作将面临巨大挑战。传统的打捞方法往往效率低下&#xff0c;且在操作过程中可能会对汽车造成进一步的损害&#…

Windows 下纯手工打造 QT 开发环境

用过 QtCreator 和 VS QT 插件&#xff0c;都觉得不是很理想。所以有了这个想法。 手工打造的 QT 的开发环境&#xff0c;是不需要安装上面两个程序的。 1、下载 vcpkg&#xff0c;编译 QT6 下载地址&#xff1a;https://github.com/microsoft/vcpkg.git 进入到 …

comfyui提示没有anything everywhere节点

错误信息说明 在使用comfyUI导入工作流的时候&#xff0c;提示没有Anything Everywhere节点 解决办法 进入到ComfyUI的custom_nodes目录下&#xff0c;执行以下命令 git clone https://github.com/chrisgoringe/cg-use-everywhere.git重启ComfyUI即可

顶会论文复现:PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

文章目录 1 资料2 我的总结3 复现源码首先你需要有gpt的api接口安装&#xff1a;数据集执行指令源码 4 结果 1 资料 我复现的源码:https://github.com/Whiffe/test_set_contamination 官网源码&#xff1a;https://github.com/tatsu-lab/test_set_contamination 论文&#x…

禁用微软的windos安全中心

目录 一、为什么禁用 二、WDControl_1.5.0程序禁用windows安全中心 步骤1--- 步骤2--- 三、禁用widows安全中心成功 一、为什么禁用 描述&#xff1a;下载第三方软件常常会收到病毒防护秒杀&#xff0c; 第1---直接无法下载 第2---提前下载在U盘解压会被干掉程序文件 …

Spark第一天

MapReduce过程复习 Spark由五部分组成 RDD五大特征 1、 Spark -- 代替MapReduce <<<<< scala是单机的&#xff0c;spark是分布式的。>>>>> 开源的分布式计算引擎 可以快速做计算 -- 因为可以利用内存来做一些计算 (1) 分为5个库(模块) : 1、…

【hot100-java】排序链表

链表题。 使用归并排序法。 一图解决。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; thi…

网络安全之XXE攻击

0x01 什么是 XXE 个人认为&#xff0c;XXE 可以归结为一句话&#xff1a;构造恶意 DTD 介绍 XXE 之前&#xff0c;我先来说一下普通的 XML 注入&#xff0c;这个的利用面比较狭窄&#xff0c;如果有的话应该也是逻辑漏洞。 既然能插入 XML 代码&#xff0c;那我们肯定不能善罢…

C++之String类模拟实现(下)

片头 哈喽~小伙伴们&#xff0c;在上一篇中&#xff0c;我们讲解了C的string类的相关函数&#xff0c;这一章中&#xff0c;我们将继续深入学习string类函数&#xff0c;准备好了吗&#xff1f;咱们开始咯~ 五、对内容进行修改 ⑤insert函数 在指定位置插入字符或者字符串 …

docker安装elasticsearch(es)+kibana

目录 docker安装elasticsearch 一.准备工作 1.打开docker目录 2.创建elasticsearch目录 3.打开elasticsearch目录 4.拉取elasticsearch镜像 5.检查镜像 二.挂载目录 1.创建数据挂载目录 2.创建配置挂载目录 3.创建插件挂载目录 4.权限授权 三.编辑配置 1.打开con…

重学SpringBoot3-集成Spring Boot Actuator

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Spring Boot Actuator 1. 什么是 Spring Boot Actuator&#xff1f;2. Spring Boot Actuator 的核心功能3. Spring Boot 3 中集成 Actuator3.1 添加…

Thread类的基本用法

一.线程创建 继承Thread来创建一个线程 实现 Runnable 接⼝ 匿名内部类创建 Thread ⼦类对象 匿名内部类创建 Runnable ⼦类对象 lambda 表达式创建 Runnable ⼦类对象 二.线程中断 ⽬前常⻅的有以下两种⽅式&#xff1a; 1. 通过共享的标记来进⾏沟通 2. 调⽤ interrup…

计算机网络(以Linux讲解)

计算机网络 网络协议初识协议分层OSI七层模型TCP/IP五层模型--初识 网络中的地址管理IP地址MAC地址 网络传输基本流程网络编程套接字预备知识网络字节序socket编程UDP socketTCP socket地址转换函数Jsoncpp 进程间关系与守护进程进程组会话控制终端作业控制守护进程 网络命令TC…

数学建模算法与应用 第15章 预测方法

目录 15.1 微分方程模型 Matlab代码示例&#xff1a;求解简单的微分方程 15.2 灰色预测模型&#xff08;GM&#xff09; Matlab代码示例&#xff1a;灰色预测模型 15.3 自回归模型&#xff08;AR&#xff09; Matlab代码示例&#xff1a;AR模型的预测 15.4 指数平滑法 M…

openrtp ps流和纯rtp流

改进openrtp 程序 OpenRtp 以RTP协议为主&#xff0c;发送音视频&#xff0c;因为工作量比较大&#xff0c;所以耽误了一些时间&#xff0c;前面一直没有时间来修改这个程序&#xff0c;也有一些人提了意见&#xff0c;现在重视一下&#xff0c;把这个程序做好&#xff0c;让学…

NirCmd-sendkeysendkeypress

引入script [Script File] This command allows you to execute a sequence of commands stored inside the file specified in [Script File] parameter. Example: script "c:\temp\msg.ncl" Example for a script:infobox "Hello !" "This is the …

大型生物制药企业如何实现安全又高效地跨网域数据传输?

大型生物制药企业由于组织结构庞大、业务覆盖研发、生产及销售&#xff0c;因此内部会再细分为多个管理单位&#xff0c;包括研发部门、生产部门、质量控制部门、供应链管理部门及营销部和日常业务支撑部门等。在物理区域划分上&#xff0c;大型生物制药企业会设立实验室、研发…

下载相应版本的PyTorch

1、前置条件 下载某个版本的Python&#xff0c;本文涉及的Python版本为3.10 2、查看该Python版本可以下载的whl文件格式 pip debug --verbose 从上图可以发现python3.10可以下载格式为cp310-cp310-win_amd64的whl文件 PyTorch各稳定版本下载链接&#xff1a;https://downloa…