В Leaflet я могу легко создать новый круг, учитывая центр и радиус:
// 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);
Круг выше создается и рисуется без проблем, так что все.
Однако, если бы я хотел сейчас создать и нарисовать прямоугольник, который ограничивает круг, это не сработает. Вот что я сделал:
// 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);
Размер прямоугольника, который я получаю, не имеет ничего общего с 500 метрами. Кроме того, похоже, что размер прямоугольника зависит от уровня масштабирования карты. Ни одна из этих проблем не возникла для круга.
Я подозреваю, что способ преобразования широты/долготы в точку и наоборот неверен.