On Leaflet I can create a new circle easily given the centre and the radius:
// Circle var radius = 500; // [metres] var circleLocation = new L.LatLng(centreLat, centreLon); var circleOptions = { color: 'red', fillColor: '#f03', fillOpacity: 0.5 }; var circle = new L.Circle(circleLocation, radius, circleOptions); map.addLayer(circle);
The circle above is created and drawn without problems, so it is all.
However, if I wanted now to create and draw a rectangle that which bounds the circle, it does not work. Here is what I did:
// Rectangle var halfside = radius; // It was 500 metres as reported above // convert from latlng to a point (<-- I think the problem is here!) var centre_point = map.latLngToContainerPoint([newCentreLat, newCentreLon]); // Compute SouthWest and NorthEast points var sw_point = L.point([centre_point.x - halfside, centre_point.y - halfside]); var ne_point = L.point([centre_point.x + halfside, centre_point.y + halfside]); // Convert the obtained points to latlng var sw_LatLng = map.containerPointToLatLng(sw_point); var ne_LatLng = map.containerPointToLatLng(ne_point); // Create bound var bounds = [sw_LatLng, ne_LatLng]; var rectangleOptions = { color: 'red', fillColor: '#f03', fillOpacity: 0.5 }; var rectangle = L.rectangle(bounds, rectangleOptions); map.addLayer(rectangle);
The size of the rectangle that I obtain has nothing to do with 500 metres. Also, it looks like the size of the rectangle depends on the zoom level the map is. None of these problems arose for the circle.
I suspect the way I transform the latitude/longitude to point and viceversa is wrong.
Advertisement
Answer
Just use the getBounds
method that L.Circle
inherits from L.Path
:
Returns the LatLngBounds of the path.
http://leafletjs.com/reference.html#path-getbounds
var circle = new L.Circle([0,0], 500).addTo(map); var rectangle = new L.Rectangle(circle.getBounds()).addTo(map);
Working example on Plunker: http://plnkr.co/edit/n55xLOIohNMY6sVA3GLT?p=preview