1. <tfoot id='trs8Y'></tfoot>
    • <bdo id='trs8Y'></bdo><ul id='trs8Y'></ul>

    1. <legend id='trs8Y'><style id='trs8Y'><dir id='trs8Y'><q id='trs8Y'></q></dir></style></legend>
      <i id='trs8Y'><tr id='trs8Y'><dt id='trs8Y'><q id='trs8Y'><span id='trs8Y'><b id='trs8Y'><form id='trs8Y'><ins id='trs8Y'></ins><ul id='trs8Y'></ul><sub id='trs8Y'></sub></form><legend id='trs8Y'></legend><bdo id='trs8Y'><pre id='trs8Y'><center id='trs8Y'></center></pre></bdo></b><th id='trs8Y'></th></span></q></dt></tr></i><div id='trs8Y'><tfoot id='trs8Y'></tfoot><dl id='trs8Y'><fieldset id='trs8Y'></fieldset></dl></div>

    2. <small id='trs8Y'></small><noframes id='trs8Y'>

      如何使用 Leaflet.draw 抓取一系列标记?

      时间:2023-08-09
        • <bdo id='KjDGh'></bdo><ul id='KjDGh'></ul>
                <legend id='KjDGh'><style id='KjDGh'><dir id='KjDGh'><q id='KjDGh'></q></dir></style></legend>
              • <tfoot id='KjDGh'></tfoot>

                <small id='KjDGh'></small><noframes id='KjDGh'>

                  <tbody id='KjDGh'></tbody>

                <i id='KjDGh'><tr id='KjDGh'><dt id='KjDGh'><q id='KjDGh'><span id='KjDGh'><b id='KjDGh'><form id='KjDGh'><ins id='KjDGh'></ins><ul id='KjDGh'></ul><sub id='KjDGh'></sub></form><legend id='KjDGh'></legend><bdo id='KjDGh'><pre id='KjDGh'><center id='KjDGh'></center></pre></bdo></b><th id='KjDGh'></th></span></q></dt></tr></i><div id='KjDGh'><tfoot id='KjDGh'></tfoot><dl id='KjDGh'><fieldset id='KjDGh'></fieldset></dl></div>
                本文介绍了如何使用 Leaflet.draw 抓取一系列标记?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                问题描述

                上下文:

                我制作了一张地图,并在其中填充了大约 300 个随机标记.我可以通过单击弹出窗口中的链接来选择"标记并激活选择以显示数据.我还有 Leaflet.draw 插件来绘制圆形、矩形和自定义形状等形状,我想用它来选择"几个标记.

                I've made a map, and populated it with around 300 random markers. I can 'select' the markers by clicking on a link in the popup and activate a selection to display data from. I also have the Leaflet.draw plugin to draw shapes like circles, rectangles and custom shapes, and I would like to use it to 'select' a couple of markers.

                问题

                如何获取落入已绘制的 leaflet.draw 形状内的标记的传单标记对象,以便编辑它们?我似乎无法进行选择,它要么不选择任何标记,要么全部选择.

                How can I grab the leaflet marker object of the markers that fall inside a drawn leaflet.draw shape so I can edit them? I cannot seem to make a selection, It either selects none of the markers, or all of them.

                代码片段,从不必要的代码中剥离:

                Code snippet, stripped from unnecessary code:

                const drawControl = new L.Control.Draw({
                    draw: {
                        marker   : false,
                        polygon  : true,
                        polyline : false,
                        rectangle: true,
                        circle   : {
                            metric: 'metric'
                        }
                    },
                    edit: false
                });
                
                const map = L.map('map', {
                    layers: [streets, light]
                }).setView([CONFIG.MAP.LATITUDE, CONFIG.MAP.LONGITUDE], CONFIG.MAP.ZOOMLEVEL)
                
                map.addControl(drawControl);
                
                map.on(L.Draw.Event.DRAWSTOP, e => {
                
                    const hello = e.target;
                
                    console.log(hello);
                    e.target.eachLayer(layer => {
                        if (layer.options.icon) {
                            console.log(layer);
                        }
                    });
                
                });
                

                推荐答案

                使用 Leaflet 的实用方法可以很容易地完成大部分您想要的事情.如果你想用像 L.Polygon 这样的复杂形状来做到这一点,你需要像 TurfJS 这样的东西

                Most of what you want can quite easily be done using Leaflet's utility methods. If you want to do this with a complex shape like L.Polygon you're going to need something like TurfJS

                对于L.Circle,您需要计算圆心之间的距离并将其与半径进行比较:

                For L.Circle you need to calculate the distance between the circle's center and compare it to the radius:

                var marker = new L.Marker(...),
                    circle = new L.Circle(...);
                
                var contains = circle.getLatLng().distanceTo(marker.getLatLng()) < circle.getRadius();
                

                对于 L.Rectangle 你需要获取它的边界对象并使用 contains 方法:

                For L.Rectangle you need to fetch it's bounds object and use the contains method:

                var marker = new L.Marker(...),
                    rectangle = new L.Rectangle(...);
                
                var contains = rectangle.getBounds().contains(marker.getLatLng());
                

                正如对于复杂多边形所说,我使用的是 Turf,但那里有更多的库和插件.这是一个使用 Turf 的 inside 方法的示例.它采用 GeoJSON 点和多边形特征作为参数,因此请注意转换:

                As said for complex polygons i'de use Turf but there are more libraries and plugins out there. Here's an example using Turf's inside method. It take a GeoJSON point and polygon feature as parameters so mind the conversion:

                var marker = new L.Marker(...),
                    polygon = new L.Polygon(...);
                
                var contains = turf.inside(marker.toGeoJSON(), polygon.toGeoJSON());
                

                您可以将它们包装到每个相应类的便利方法中:

                You could wrap those into convenience methods for each respective class:

                L.Polygon.include({
                    contains: function (latLng) {
                        return turf.inside(new L.Marker(latLng).toGeoJSON(), this.toGeoJSON());
                    } 
                });
                
                L.Rectangle.include({
                    contains: function (latLng) {
                        return this.getBounds().contains(latLng);
                    }
                });
                
                L.Circle.include({
                    contains: function (latLng) {
                        return this.getLatLng().distanceTo(latLng) < this.getRadius();
                    }
                });
                
                var marker = new L.Marker(...),
                    polygon = new L.Polygon(...),
                    rectangle = new L.Rectangle(...),
                    circle = new L.Circle(...);
                
                polygon.contains(marker.getLatLng());
                rectangle.contains(marker.getLatLng());
                circle.contains(marker.getLatLng());
                

                请注意,如果您实现了多边形方法,则不需要矩形方法.由于矩形是从多边形扩展而来的,它将继承该方法.我把它放在那里是为了完成.

                Note that if you implement the polygon method that there is no need for the rectangle method. Since rectangle is extended from polygon it will inherit the method. I left it in there to be complete.

                现在迭代你的标记并比较它们很容易:

                Now iterating your markers and comparing them is easy:

                map.on(L.Draw.Event.CREATED, function (e) {
                    markers.eachLayer(function (marker) {
                        if (!e.layer.contains(marker.getLatLng())) {
                            marker.remove();
                        }
                    });
                });
                

                希望对您有所帮助,这是一个有效的片段:

                Hope that helps, here's a working snippet:

                var map = new L.Map('leaflet', {
                    'center': [0, 0],
                    'zoom': 0
                });
                
                var markers = new L.LayerGroup().addTo(map);
                
                for (var i = 0; i < 300; i++) {
                    var marker = new L.Marker([
                        (Math.random() * (90 - -90) + -90).toFixed(5) * 1,
                        (Math.random() * (180 - -180) + -180).toFixed(5) * 1
                    ]).addTo(markers);
                }
                
                new L.Control.Draw({
                    draw: {
                        marker   : false,
                        polygon  : true,
                        polyline : false,
                        rectangle: true,
                        circle   : {
                            metric: 'metric'
                        }
                    },
                    edit: false
                }).addTo(map);
                
                L.Polygon.include({
                    contains: function (latLng) {
                        return turf.inside(new L.Marker(latLng).toGeoJSON(), this.toGeoJSON());
                    } 
                });
                
                L.Rectangle.include({
                    contains: function (latLng) {
                        return this.getBounds().contains(latLng);
                    }
                });
                
                L.Circle.include({
                    contains: function (latLng) {
                        return this.getLatLng().distanceTo(latLng) < this.getRadius();
                    }
                });
                
                map.on(L.Draw.Event.CREATED, function (e) {
                    markers.eachLayer(function (marker) {
                        if (!e.layer.contains(marker.getLatLng())) {
                            marker.remove();
                        }
                    });
                });

                body {
                    margin: 0;
                }
                
                html, body, #leaflet {
                    height: 100%;
                }

                <!DOCTYPE html>
                <html>
                  <head>
                    <title>Leaflet 1.0.3</title>
                    <meta charset="utf-8" />
                    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
                    <link type="text/css" rel="stylesheet" href="//unpkg.com/leaflet@1.0.3/dist/leaflet.css" />
                    <link type="text/css" rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/leaflet.draw/0.4.9/leaflet.draw.css" />
                  </head>
                  <body>
                    <div id="leaflet"></div>
                    <script type="application/javascript" src="//unpkg.com/leaflet@1.0.3/dist/leaflet.js"></script>
                    <script type="application/javascript" src="//cdnjs.cloudflare.com/ajax/libs/leaflet.draw/0.4.9/leaflet.draw.js"></script>
                    <script type="application/javascript" src="//unpkg.com/@turf/turf@latest/turf.min.js"></script>
                  </body>
                </html>

                这篇关于如何使用 Leaflet.draw 抓取一系列标记?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                上一篇:同一页面上的多个传单地图具有相同的选项 下一篇:地图中浏览器的最大 svg 元素数

                相关文章

                最新文章

                <legend id='Gg0cr'><style id='Gg0cr'><dir id='Gg0cr'><q id='Gg0cr'></q></dir></style></legend>

                  <bdo id='Gg0cr'></bdo><ul id='Gg0cr'></ul>
                    <i id='Gg0cr'><tr id='Gg0cr'><dt id='Gg0cr'><q id='Gg0cr'><span id='Gg0cr'><b id='Gg0cr'><form id='Gg0cr'><ins id='Gg0cr'></ins><ul id='Gg0cr'></ul><sub id='Gg0cr'></sub></form><legend id='Gg0cr'></legend><bdo id='Gg0cr'><pre id='Gg0cr'><center id='Gg0cr'></center></pre></bdo></b><th id='Gg0cr'></th></span></q></dt></tr></i><div id='Gg0cr'><tfoot id='Gg0cr'></tfoot><dl id='Gg0cr'><fieldset id='Gg0cr'></fieldset></dl></div>

                    <small id='Gg0cr'></small><noframes id='Gg0cr'>

                  1. <tfoot id='Gg0cr'></tfoot>