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

更新日志:
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=0
    var i=null
    var 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=null
        r=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 rectangle
    let tmprec
    const 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()
}
  • 25
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 31
    评论
要在 Leaflet 中实现动态绘制多边形并且在绘制完成后双击多边形末尾闭合多边形,你可以使用 Leaflet.draw 插件。这个插件可以让你很方便地添加编辑工具栏,支持绘制多种几何图形,包括多边形线条和形等。在绘制多边形时,你可以通过设置 `allowIntersection` 选项来控制多边形是否允许交叉。同时,你可以添加一个事件监听器,当用户双击多边形时触发闭合操作。 以下是一个示例代码,你可以将其添加到你的 Leaflet 应用程序中: ``` // 定义绘制控件 var drawControl = new L.Control.Draw({ edit: { featureGroup: drawnItems }, draw: { polyline: false, circle: false, marker: false, polygon: { allowIntersection: false, showArea: true } } }); // 添加绘制控件到地图上 map.addControl(drawControl); // 定义多边形绘制完成事件 map.on(L.Draw.Event.CREATED, function(event) { var layer = event.layer; drawnItems.addLayer(layer); }); // 定义多边形双击事件 map.on('dblclick', function(event) { var layer = event.target; if (layer instanceof L.Polygon) { var latlngs = layer.getLatLngs(); var lastPoint = latlngs[0][latlngs[0].length - 1]; if (event.latlng.equals(lastPoint)) { layer.closePopup(); layer.closeTooltip(); layer._latlngs.push(layer._latlngs[0]); layer.redraw(); } } }); ``` 在这个例子中,`drawnItems` 是一个 `L.FeatureGroup` 对象,用于存储绘制多边形。当用户完成绘制一个多边形时,会触发 `L.Draw.Event.CREATED` 事件,你可以在这个事件处理程序中将多边形添加到 `drawnItems` 中。当用户双击一个多边形时,会触发 `dblclick` 事件,你可以在这个事件处理程序中将多边形闭合。注意,这里我们要判断双击事件的位置是否等于多边形的末尾,只有在这种情况下才会闭合多边形

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

裘千仞不会水上漂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值