草庐IT

leaflet结合Leaflet-Geoman插件实现绘制以及动态配置样式(附源码下载)

GIS之家 2023-03-28 原文

前言

leaflet 入门开发系列环境知识点了解:

内容概览

leaflet结合Leaflet-Geoman插件实现绘制以及动态配置样式
源代码demo下载

效果图如下:

具体实现思路:
利用Leaflet-Geoman插件绘制点线面,然后结合colorPick颜色带器拾取RGB颜色值,前端leaflet地图动态设置点线面不同样式Style。
Leaflet-Geoman插件

  • 核心代码,完整源码见尾部下载
var weight = 3;
var dashArray = [0,0];
//多边形默认样式
var geoJsonStyle_Polygon = {
color: '#3388ff',
weight: 3,
opacity: 1,
fillColor: '#3388ff',
fillOpacity: 0.2,
//dashArray:[5,5],
fill: true,
stroke: true
};
 
window.colorPick = new DCI.Pick.colorPick();//创建颜色器的对象
colorPick.G2 = 135;
colorPick.B2 = 255;
colorPick.R = 51;
colorPick.G = 135;
colorPick.B = 255;
 
var map = L.map('map');
L.tileLayer('http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}').addTo(map);
var geojsonLayers = L.featureGroup([]).addTo(map);
//监听图层鼠标事件
geojsonLayers.on('click', onClickGeojsonLayers);
map.setView(L.latLng(37.550339, 104.114129), 4); //设置缩放级别及中心点
//绘制工具draw
map.pm.addControls({
position: 'topleft',
drawMarker:true,
drawCircleMarker:false,
drawPolyline:true,
drawRectangle:true,
drawPolygon:true,
drawCircle: true,
editMode:false,
dragMode:false,
cutPolygon:false,
removalMode:true,
});
map.pm.setLang("zh");
map.on('pm:create', e => {
//console.log(e);
switch(e.shape) {
case "Rectangle":
case "Polygon":
case "Circle":
case "Line":
e.layer.options ={...geoJsonStyle_Polygon,shape:e.shape};
break;
}
geojsonLayers.addLayer(e.layer);
});
 
function onClickGeojsonLayers(e){
var layer = e.layer;
var style2 = "solid";
var mWidth = "3px";
var html = "";
switch(layer.options.shape) {
case "Rectangle":
case "Polygon":
case "Circle":
case "Line":
html = "<div style='width:225px; color: rgb(51, 51, 51); font-size:12px; word-wrap: break-word; '>" +
"<div id='infowin' class='pointInfowin'>" +
"<div id='pointInfoP' style='display: block; '>" +
"<div class='style_line_polygon'>" +
"<div class='line_shape'>" +
"<span>线型</span>" +
"<div class='line_shape_list'>" +
"<div id='solid_line_shape' onClick='changelinestyle(" + 0 + ");'></div>" +
"<div id='dashed_line_shape' onClick='changelinestyle(" + 1 + ");'></div>" +
"</div>" +
"</div>" +
"<div class='line_thick'>" +
"<span>线宽</span>" +
"<div id='line_thick_list'>" +
"<div id='thick_line_2' onClick='changelinewidth(" + 2 + ");'></div>" +
"<div id='thick_line_3' onClick='changelinewidth(" + 3 + ");'></div>" +
"<div id='thick_line_4' onClick='changelinewidth(" + 4 + ");'></div>" +
"</div>" +
"</div>" +
"<div class='line_color_opacity'>" +
"<div class='line_color'>" +
"<span>线型颜色</span>" +
"<div class='color_line_selector' onclick='coloropen(\"line\")' id='inputcolor'></div>" +
"<div id='colorpane' style='position:absolute;z-index:999;display:none;'></div>" +
"</div>" +
"<div class='line_opacity'>" +
"<span>透明度</span>" +
"<input id='lAlphaText' type='text' value='100' maxlength='3' id='borderOpacity' class='opacity_line_selector'>%</div>" +
"<div class='clear'></div>" +
"</div>" +
"<div class='fill_color_opacity'>" +
"<div class='fill_color'>" +
"<span>填充颜色</span>" +
"<div class='color_fill_selector' onclick='coloropen(\"fill\")' id='inputcolor2'></div>" +
"<div id='colorpane2' style='position:absolute;z-index:999;display:none;'></div>" +
"</div>" +
"<div class='fill_opacity'>" +
"<span>透明度</span>" +
"<input id='mMAlphaText' type='text' value='20' maxlength='3' id='fillOpacity' class='opacity_fill_selector'>%</div>" +
"</div>" +
"<div class='fill_color_preview'>" +
"<span>填充效果</span>" +
"<div class='preview_fill_selector'>" +
"<div id='fill_preview' style='border-top-color: rgb(" + colorPick.R2 + "," + colorPick.G2 + "," + colorPick.B2 + "); '></div>" +
"</div>" +
"</div>" +
"<div class='line_color_preview' id='line_color_preview'>" +
"<span>边框效果</span>" +
"<div class='preview_line_selector'>" +
"<div id='line_preview' style='border-top-style:" + style2 + "; border-top-width: " + mWidth + "; border-top-color: rgb(" + colorPick.R + "," + colorPick.G + "," + colorPick.B + "); '></div>" +
"</div>" +
"</div>" +
"<button id='PolygonStyle' type='button'>确定</button>"+
"</div></div></div></div></div>";
break;
default: //Marker
html =`<div id="markerIMG">
<img loading="lazy" src="marker-icon.png" alt="" width="25" height="41">
<img loading="lazy" src="gpsRed.png" alt="" width="32" height="32">
<img loading="lazy" src="gpsYellow.png" alt="" width="32" height="32">
<img loading="lazy" src="gpsGreen.png" alt="" width="32" height="32">
</div>`;
}
var elements = html;
layer.bindPopup(elements).openPopup(e.latlng);
//动态修改线和面样式
$("#PolygonStyle").click(function(e){
var style ={
color: "rgb(" + colorPick.R + "," + colorPick.G + "," + colorPick.B + ")",
weight: weight,
opacity: document.getElementById("lAlphaText").value / 100,
fillColor: "rgb(" + colorPick.R2 + "," + colorPick.G2 + "," + colorPick.B2 + ")",
fillOpacity: layer.options.shape === "Line" ? 0 : document.getElementById("mMAlphaText").value / 100,
dashArray:dashArray,
fill: true,
stroke: true
};
layer.setStyle(style);
});
//动态修改点样式
$("#markerIMG img").click(function(e){
console.log('e',e.target.src);
var icon = L.icon({
iconUrl: e.target.src,
iconSize: [e.target.width,e.target.height],
});
layer.setIcon(icon);
});
}
 
/**
* 弹出颜色选择器面板
*/
function coloropen(type) {
//初始化颜色面板
colorPick.init();
colorPick.type = type;
document.getElementById("colorpane").style.display = "";
}
/**
* 更改线型
*/
function changelinestyle(index) {
if (index == "0") {
$("#line_preview").css("border-top-style", "solid");
dashArray = [0,0];
}
else {
$("#line_preview").css("border-top-style", "dashed");
dashArray = [5,5];
}
}
/**
* 更改线宽
*/
function changelinewidth(width) {
if (width == "2") {
$("#line_preview").css("border-top-width", "2px");
}
else if (width == "3") {
$("#line_preview").css("border-top-width", "3px");
}
else if (width == "4") {
$("#line_preview").css("border-top-width", "4px");
}
else {
$("#line_preview").css("border-top-width", "8px");
}
weight = width;
}

完整demo源码见小专栏文章尾部小专栏

文章尾部提供源代码下载,对本专栏感兴趣的话,可以关注一波

有关leaflet结合Leaflet-Geoman插件实现绘制以及动态配置样式(附源码下载)的更多相关文章

  1. ruby-on-rails - 结合 meta_search 与 acts_as_taggable_on - 2

    我在开发的Rails3网站的一些搜索功能上遇到了一个小问题。我有一个简单的Post模型,如下所示:classPost我正在使用acts_as_taggable_on来更轻松地向我的帖子添加标签。当我有一个标记为“rails”的帖子并执行以下操作时,一切正常:@posts=Post.tagged_with("rails")问题是,我还想搜索帖子的标题。当我有一篇标题为“Helloworld”并标记为“rails”的帖子时,我希望能够通过搜索“hello”或“rails”来找到这篇帖子。因此,我希望标题列的LIKE语句与acts_as_taggable_on提供的tagged_with方法

  2. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  3. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  4. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  5. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  6. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  7. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  8. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  9. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  10. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

随机推荐