leaflet动态绘制图形

  • 动态绘点
  • 动态绘线
  • 动态绘多边形
  • 动态绘制矩形
  • 2020.3.16更新
更新日志:
2019.1.14:更新了绘制多边形时tmpline没有移除的问题
2019.1.15:添加绘制矩形的代码

首先定义一个地图:
map = L.map("map-container").setView([51.505, -0.09], 8);

动态绘点

动态绘点就是在鼠标点击位置添加一个固定半径的圆

map.on('click',function(e){L.circle(e.latlng,{radius:100,color:'red',fillColor:'red',fillOpacity:1}).addTo(map)
})

如果要绘制一个任意半径的圆,整个过程分为三步:

  1. 鼠标按下:确定圆心
  2. 按住拖动鼠标:确定半径
  3. 松开鼠标:绘制
    代码如下:
    var r=0var i=nullvar tempCircle=new L.circle()map.on('mousedown', onmouseDown);map.on('mouseup',onmouseUp);map.on('mousemove',onMove)//map.off(....) 关闭该事件function onmouseDown(e){i=e.latlng//确定圆心}function onMove(e) {if(i) {r = L.latLng(e.latlng).distanceTo(i)tempCircle.setLatLng(i)tempCircle.setRadius(r)tempCircle.setStyle({color:'#ff0000',fillColor:'#ff0000',fillOpacity:1})map.addLayer(tempCircle)}}function onmouseUp(e){r = L.latLng(e.latlng).distanceTo(i)//计算半径L.circle(i,{radius:r,color:'#ff0000',fillColor:'#ff0000',fillOpacity:1}).addTo(map)i=nullr=0}

动态绘线

动态绘线主要涉及到三个事件:click,dbclick,mousemove
click确定线的折点,dbclick确定线的终点,mousemove绘制鼠标移动过程中图形的变化。如果我们有一个地图map,动态绘线的代码如下:

    var points = [],geometry=[]var lines = new L.polyline(points)var tempLines = new L.polyline([])map.on('click', onClick);    //点击地图map.on('dblclick', onDoubleClick);//map.off(....) 关闭该事件function onClick(e) {points.push([e.latlng.lat, e.latlng.lng])lines.addLatLng(e.latlng)map.addLayer(lines)const node=L.circle(e.latlng, { color: '#ff0000', fillColor: 'ff0000', fillOpacity: 1 })map.addLayer(node)geometry.push(node)map.on('mousemove', onMove)//双击地图}function onMove(e) {if (points.length > 0) {ls = [points[points.length - 1], [e.latlng.lat, e.latlng.lng]]tempLines.setLatLngs(ls)map.addLayer(tempLines)}}function onDoubleClick(e) {geometry.push(L.polyline(points).addTo(map))points = []lines.remove();            map.off('mousemove')tempLines.remove();}

动态绘多边形

动态绘多边形同样涉及到三个事件:click,dbclick,mousemove,如果我们有一个地图map,动态绘制多边形的代码如下

        var points = [], geometry = []var lines = new L.polyline([])var tempLines = new L.polyline([], { dashArray: 5 })map.on('click', onClick);    //点击地图map.on('dblclick', onDoubleClick);map.on('mousemove', onMove)//双击地图//map.off(....) 关闭该事件function onClick(e) {points.push([e.latlng.lat, e.latlng.lng])lines.addLatLng(e.latlng)map.addLayer(tempLines)map.addLayer(lines)const node=L.circle(e.latlng, { color: '#ff0000', fillColor: 'ff0000', fillOpacity: 1 })map.addLayer(node)geometry.push(node)}function onMove(e) {if (points.length > 0) {ls = [points[points.length - 1], [e.latlng.lat, e.latlng.lng], points[0]]tempLines.setLatLngs(ls)// map.addLayer(tempLines)}}function onDoubleClick(e) {geometry.push(L.polygon(points).addTo(map))points = []//map.removeLayer(tempLines)//tempLines.remove()lines.remove()tempLines.remove()lines = new L.polyline([])

动态绘制矩形

 let rectanglelet tmprecconst latlngs=[]map.on('mousedown', onClick);    //点击地图map.on('mouseup',onDoubleClick);//map.off(....) 关闭该事件function onClick(e){if (typeof tmprec !='undefined'){tmprec.remove()}//左上角坐标latlngs[0]=[e.latlng.lat,e.latlng.lng]//开始绘制,监听鼠标移动事件map.on('mousemove',onMove)}function onMove(e) {latlngs[1]=[e.latlng.lat,e.latlng.lng]//删除临时矩形if (typeof tmprect!='undefined'){tmprect.remove()}//添加临时矩形tmprect=L.rectangle(latlngs,{dashArray:5}).addTo(map)}function onDoubleClick(e){//矩形绘制完成,移除临时矩形,并停止监听鼠标移动事件tmprect.remove()map.off('mousemove')//右下角坐标latlngs[1]=[e.latlng.lat,e.latlng.lng]rectangle=L.rectangle(latlngs,{color:'#3300ff',fillOpacity:0,weight:2})rectangle.addTo(map)//调整view范围map.fitBounds(latlngs)}

后记:关于leaflet的学习文档可能短时间不会再更新了,基本的知识大家在文档中都可以找到,更深奥的东西我现在也不会,以后在工作过程中学到我认为有用的新内容还会继续更新,接下来我要学习另一个库openlayers。

2020.3.16更新

一直有人说画的线移除不了,这根本不是什么难事,我想说你压根就没搞清除你添加的图形是哪一个,最笨的办法你可以把map._layers打印出来看。废话我就不说了,针对线和多边形我修改了代码,如果你要移除它们,请这样做:

for(let geo of geometry){geo.remove()
}

Leaflet学习之路五——动态绘制图形(点、线、圆、多边形)相关推荐

  1. esri-leaflet入门教程(5)- 动态绘制图形

    esri-leaflet入门教程(5)- 动态绘制图形 by 李远祥 在上一章节中已经说明了esr-leaflet是如何加载ArcGIS Server提供的各种服务,这些都是服务本身来决定的,API脚 ...

  2. OpenCV-Python实战(番外篇)——OpenCV中利用鼠标事件动态绘制图形

    OpenCV-Python实战(番外篇)--OpenCV中利用鼠标事件动态绘制图形 使用鼠标事件动态绘制 动态绘制图形 动态绘制图形和文本 相关链接 使用鼠标事件动态绘制 我们已经在<OpenC ...

  3. java 设置年轻代堆大小,[JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配...

    [JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配 [JVM学习之路]五.堆(一)堆的内存结构.参数设置.分代思想.内存分配策略及TLAB 一.堆的核心概述 堆的特点: 1.一个jvm实 ...

  4. css svg做动图,用svg动态绘制图形

    以此前对svg的了解,就是通过rect/circle/line--等绘制规则图形,或者利用path路径来绘制更复杂的图形.但是这种绘制是,当我们写好svg的xml文件嵌入html代码,页面载入的时候, ...

  5. 【OpenCV 例程300篇】216. 绘制多段线和多边形

    专栏地址:『youcans 的 OpenCV 例程200篇』 文章目录:『youcans 的 OpenCV 例程200篇-总目录』 [youcans 的 OpenCV 例程300篇]216. 绘制多段 ...

  6. c++ dll发消息到主窗口_PyQt5学习笔记(五)窗口图形绘制

    PyQt5提供了绘制图形的API,支持绘制: 文本 各种图形(直线,点,椭圆,弧,扇形,多边形等) 图像 绘制图形需要一个类QPainter.基本的绘制过程: # 创建QPainter对象 paint ...

  7. 鼠标移动框选动态绘制图形,基于zrender

    本文只介绍根据鼠标事件动态绘制矩形方法 zrender实现简易画板功能可绘制大部分常用图形在文章末尾可参考 像下图这样,可随心所欲绘制你想绘制的矩形: 完整代码:(有详细注释,有任何疑问欢迎留言) & ...

  8. Android SurfaceFlinger 学习之路(五)----VSync 工作原理

    原址 VSync信号的科普我们上一篇已经介绍过了,这篇我们要分析在SurfaceFlinger中的作用.(愈发觉得做笔记对自己记忆模块巩固有很多帮助,整理文章不一定是用来给别人看的,但一定是为加强自己 ...

  9. 动态绘制图形的基本思路

    动态图形绘制的基本思路是,创建一个类继承View类(或者继承SurfaceView类).覆盖onCreate()方法,使用Canvas对象在界面上绘制不同的图形,使用invalidate()方法刷新界 ...

最新文章

  1. python爬虫抓取信息_python爬虫爬取网上药品信息并且存入数据库
  2. 4蓝图遍历actor_【虚幻4笔记15】浮动平台
  3. sql优化常用的几种方法_MySQL常用30种SQL查询语句优化方法
  4. 【cJSon】cJSON学习笔记(一)
  5. TTL怎么计算拉电流和灌电流_UPS输入输出电流如何计算?电缆如何选择?
  6. Android程序运行时出现java.lang.OutOfMemoryError 错误
  7. 高并发负载均衡(三):LVS的DR模型试验搭建
  8. 远洋整站下载器不能用https_最后下载个喜马拉雅
  9. Class.forName()和ClassLoader.getSystemClassLoader().loadClass()区别
  10. LeetCode 879. 盈利计划(动态规划)
  11. contab 手动可以 java_crontab 定时执行脚本出错,但手动执行脚本正常
  12. 机器学习recall含义_机器学习的业务含义
  13. 在后台Service中直接启动Activity
  14. Webrtc之源码结构
  15. matlab调用com组件出现错误求解决,matlab在生成COM组件编译时出现错误
  16. VMWARE 之 分布式网络交换机
  17. 运动控制器的自定义G代码编程应用
  18. 中央气象台气象监测数据爬取Python实战分析
  19. 高德地图又出逆天黑科技!全国各大城市模型直接获取
  20. 前端工作总结187-json校验工具

热门文章

  1. 计算机网络RIP实验
  2. 唯品会翻牌ClickHouse后,实现百亿级数据自助分析
  3. 计算机JAVA相关说课稿_七年级信息技术Windows资源管理器说课稿
  4. 使用scrapy抓取传智播客c/c++讲师信息
  5. 80后的我们都奔三了,说好了,只许看,不许哭! 美好的回忆!
  6. Mac 没有管理员账户 或 当前账户没有管理员权限 解决方案
  7. Java泛型的协变与逆变
  8. C++软件开发面试题总结
  9. WMware虚拟机新建虚拟机(Ubuntu)
  10. 网易云音乐 源码(有图)