描画ライブラリがこれをサポートしていないため、独自の描画方法/選択ツールを実装することになりました。地図をクリックすると「選択」モードになり、マウス移動で長方形が描画されます。もう一度クリックすると、選択が完了し、レンダリングされた長方形がマップ上に残ります。「魔法」は calculateBounds 関数で発生します。
self.map = new google.maps.Map(document.getElementById('map'), {
center: new google.maps.LatLng(0,0),
zoom: 1,
mapTypeId: google.maps.MapTypeId.ROADMAP
});
self.rectangle = new google.maps.Rectangle ({
map: null,
clickable: false,
selectable: false,
dragable: true,
fillColor: "#000000",
fillOpacity: 0.2,
strokeColor: "#000000",
strokeOpacity: 1.0,
strokeWeight: 1
});
google.maps.event.addListener(self.map, 'click', function(e) {
self.select = !self.select;
if (self.select) {
self.startPoint = e.latLng;
} else {
self.drawRectangle(e.latLng);
self.north(self.rectangle.getBounds().getNorthEast().lat().toFixed(15));
self.south(self.rectangle.getBounds().getSouthWest().lat().toFixed(15));
self.east(self.rectangle.getBounds().getNorthEast().lng().toFixed(15));
self.west(self.rectangle.getBounds().getSouthWest().lng().toFixed(15));
}
});
google.maps.event.addListener(self.map, 'mousemove', function(e) {
if (self.select) {
self.drawRectangle(e.latLng);
}
});
self.calculateBounds = function(newEndPoint) {
var north = self.startPoint.lat() >= newEndPoint.lat() ? self.startPoint.lat() : newEndPoint.lat();
var south = self.startPoint.lat() <= newEndPoint.lat() ? self.startPoint.lat() : newEndPoint.lat();
var sw = new google.maps.LatLng(south, self.startPoint.lng());
var ne = new google.maps.LatLng(north, newEndPoint.lng());
return new google.maps.LatLngBounds(sw, ne);
};
self.drawRectangle = function(newEndPoint) {
self.rectangle.setBounds(self.calculateBounds(newEndPoint));
self.rectangle.setMap(self.map);
};