Leaflet.Draw矩形的坐标

23

在鼠标单击时获取矩形的坐标,以便我可以获得矩形的所有角落。

4个回答

19

请参见事件对象 (http://leafletjs.com/reference.html#event-objects):

var map = L.map('map').setView([53.902257, 27.561640], 13);

L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);

var bounds = [[53.912257, 27.581640], [53.902257, 27.561640]];

var rect = L.rectangle(bounds, {color: 'blue', weight: 1}).on('click', function (e) {
    // There event is event object
    // there e.type === 'click'
    // there e.lanlng === L.LatLng on map
    // there e.target.getLatLngs() - your rectangle coordinates
    // but e.target !== rect
    console.info(e);
}).addTo(map);

使用e.target.getLatLngs()

3
请展示边界语义,我的输入是 {ne:{lat: -23.5601806640625lon: -46.64794921875}, sw:{lat: -23.565673828125,lon: -46.658935546875}} - Peter Krauss
1
谢谢。这对我多年后很有帮助 :) - Maile Thiesen
当我尝试使用mapBounds.extend()时,这是一个不错的小片段。只需为每个新的边界框绘制一个不同的框,并查看其适合地图的程度即可。谢谢,+1。 - Mawg says reinstate Monica

14
Leaflet.draw插件使用标准的Leaflet的L.Rectangle
Leaflet的矩形扩展了多边形。 多边形扩展了折线
因此,为了获取Leaflet.draw矩形的坐标,您可以使用Polyline的getLatLngs()方法,该方法返回路径中点的数组。 示例:
var drawnItems = new L.FeatureGroup();
map.addLayer(drawnItems);

map.on('draw:created', function (e) {

    var type = e.layerType,
        layer = e.layer;

    if (type === 'rectangle') {
        layer.on('mouseover', function() {
            alert(layer.getLatLngs());    
        });
    }

    drawnItems.addLayer(layer);
});

你知道为什么layer.toGeoJSON().geometry.coordinates会添加另一个坐标吗? - Spir
1
@Spir:layer.getLatLngs() 将返回一个未闭合多边形的 LatLng 数组。layer.toGeoJSON().geometry.coordinates 将返回一个闭合多边形的 LngLat 数组(最后一个点是第一个点)。 - Stefan Steiger
1
另外,如果形状是圆形,则 layer.getLatLngs() 将不可用。相反,圆形将具有 layer.getLatLng(),但 ToGeoJSON().geometry.coordinates 总是存在的。 - Stefan Steiger
好答案兄弟! - Gerardo Bautista

1
map.on(L.Draw.Event.CREATED, function (e) {

    var layer = e.layer;
    drawnItems.addLayer(layer);

    console.log(layer.getLatLngs())

});

1

需要注意的是,e.layerType包含正在创建的形状类型。
像getLatLngs和getLatLng这样的方法是特定于形状类型的。

根据typescript定义文件,以下是允许在图层中使用的不同类型:

Circle | CircleMarker | Marker | Polygon | Polyline | Rectangle;

而 e.layerType 的可能值是(根据 TypeScript 定义文件)

circle, marker, polygon, polyline, rectangle

因此您可以始终使用e.layer.toGeoJSON().geometry.coordinates获取坐标。
但是,您需要在e.layerType-s之间切换,因为圆形geojson不包含半径,您需要使用getRadius来获取它。
进一步注意,getLatLngs返回一个未封闭的多边形LatLng数组,而toGeoJSON().geometry.coordinates返回一个带有坐标的LngLat数组的封闭多边形。

// console.log((<any>e.layer).getLatLngs()); // polyline
// console.log((<any>e.layer).getLatLng()); // circle
// mind the s at the end of the function...


map.on('draw:created', function(e:L.DrawEvents.Created) 
{
    console.log('On draw:created', e.target);
    console.log(e.type, e);


    console.log(e.layerType);
    // console.log((<any>e.layer).getLatLngs()); // polyline
    // console.log((<any>e.layer).getLatLng()); // circle

    // e.layerType // polygon, circle, etc. 

    // polygon 
    // e.layer.getLatLngs()

    // circle
    // e.layer.getLatLng()
    // e.layer.getRadius()


    // e.layer.toGeoJSON().geometry.type // is point if circle 
    // e.layer.toGeoJSON().geometry.coordinates

    let type = e.layerType,
        layer = e.layer;
    drawnItems.addLayer(layer);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接