Как я уже сказал в своем комментарии, когда вы перетаскиваете его «слишком далеко», прямоугольные координаты влево и вправо (долгота) инвертируются.
Другими словами, если вы перетаскиваете его слишком далеко вправо, право станет левым, а левое - туда, куда вы перетащили правую сторону.И наоборот в другом направлении.Таким образом, сравнивая, где было слева, где равно справа или наоборот, вы можете обнаружить, что ваш прямоугольник влево и вправо перевернут, и инвертировать его снова ... Таким образом, выможет достичь того, что вы хотите.
И, конечно, если вы перетащите правую сторону дальше вправо, чем было слева (или наоборот), он будет сброшен, так как у вас не может быть прямоугольникаперекрывая себя по всему земному шару.
Пользовательский интерфейс может немного сбивать с толку, поскольку вы можете видеть, что прямоугольные линии переворачиваются, но вы ничего не можете с этим поделать.
var map;
function initialize() {
var mapOptions = {
center: new google.maps.LatLng(0, 0),
zoom: 2,
zoomControl: false
};
map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
// Set origin bounds
var originBounds = new google.maps.LatLngBounds(
new google.maps.LatLng(-20, -100),
new google.maps.LatLng(20, 20)
);
// Get left/right coords
var left = originBounds.getSouthWest().lng();
var right = originBounds.getNorthEast().lng();
// Create editable rectangle
var rectangle = new google.maps.Rectangle({
bounds: originBounds,
fillColor: 'white',
fillOpacity: .5,
editable: true,
map: map
});
// Check for rectangle bounds changed
google.maps.event.addListener(rectangle, 'bounds_changed', function() {
// Get currents bounds and left/right coords
var newBounds = rectangle.getBounds();
var newLeft = newBounds.getSouthWest().lng();
var newRight = newBounds.getNorthEast().lng();
if ((newRight === left) || (newLeft === right)) {
// User dragged "too far" left or right and rectangle got inverted
// Invert left and right coordinates
rectangle.setBounds(invertBounds(newBounds));
}
// Reset current left and right
left = rectangle.getBounds().getSouthWest().lng();
right = rectangle.getBounds().getNorthEast().lng();
});
}
function invertBounds(bounds) {
// Invert the rectangle bounds
var invertedBounds = new google.maps.LatLngBounds(
new google.maps.LatLng(bounds.getNorthEast().lat(), bounds.getNorthEast().lng()),
new google.maps.LatLng(bounds.getSouthWest().lat(), bounds.getSouthWest().lng())
);
return invertedBounds;
}
initialize();
#map-canvas {
height: 150px;
}
<div id="map-canvas"></div>
<script src="https://maps.googleapis.com/maps/api/js"></script>