Add rotation infrastructure
This commit is contained in:
@@ -3,7 +3,6 @@
|
||||
// FIXME add change resolution by zoom step function
|
||||
// FIXME recheck layer/map projection compatability when projection changes
|
||||
// FIXME layer renderers should skip when they can't reproject
|
||||
// FIXME add rotation
|
||||
// FIXME add tilt and height?
|
||||
// FIXME split out renderer
|
||||
// FIXME add renderer selection strategy
|
||||
@@ -22,6 +21,7 @@ goog.require('goog.events.KeyHandler.EventType');
|
||||
goog.require('goog.events.MouseWheelEvent');
|
||||
goog.require('goog.events.MouseWheelHandler');
|
||||
goog.require('goog.events.MouseWheelHandler.EventType');
|
||||
goog.require('goog.functions');
|
||||
goog.require('goog.fx.DragEvent');
|
||||
goog.require('goog.fx.Dragger');
|
||||
goog.require('goog.fx.anim');
|
||||
@@ -244,6 +244,12 @@ ol.Map.prototype.animate_ = function() {
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @return {boolean} Can rotate.
|
||||
*/
|
||||
ol.Map.prototype.canRotate = goog.functions.FALSE;
|
||||
|
||||
|
||||
/**
|
||||
* @param {ol.Layer} layer Layer.
|
||||
* @protected
|
||||
@@ -270,6 +276,9 @@ ol.Map.prototype.fitExtent = function(extent) {
|
||||
this.withFrozenRendering(function() {
|
||||
this.setCenter(extent.getCenter());
|
||||
this.setResolution(this.getResolutionForExtent(extent));
|
||||
if (this.canRotate()) {
|
||||
this.setRotation(0);
|
||||
}
|
||||
}, this);
|
||||
};
|
||||
|
||||
@@ -434,6 +443,31 @@ ol.Map.prototype.getResolutionForExtent = function(extent) {
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @return {ol.Extent} Rotated extent.
|
||||
*/
|
||||
ol.Map.prototype.getRotatedExtent = function() {
|
||||
goog.asserts.assert(this.isDef());
|
||||
var center = /** @type {!ol.Coordinate} */ this.getCenter();
|
||||
var resolution = this.getResolution();
|
||||
var rotation = this.getRotation() || 0;
|
||||
var size = this.getSize();
|
||||
var xScale = resolution * size.width / 2;
|
||||
var yScale = resolution * size.height / 2;
|
||||
var corners = [
|
||||
new ol.Coordinate(-xScale, -yScale),
|
||||
new ol.Coordinate(-xScale, yScale),
|
||||
new ol.Coordinate(xScale, -yScale),
|
||||
new ol.Coordinate(xScale, yScale)
|
||||
];
|
||||
goog.array.forEach(corners, function(corner) {
|
||||
corner.rotate(rotation);
|
||||
corner.add(center);
|
||||
});
|
||||
return ol.Extent.boundingExtent.apply(null, corners);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @return {number|undefined} Rotation.
|
||||
*/
|
||||
@@ -797,7 +831,7 @@ ol.Map.prototype.setResolution = function(resolution) {
|
||||
|
||||
|
||||
/**
|
||||
* @param {number} rotation Rotation.
|
||||
* @param {number|undefined} rotation Rotation.
|
||||
*/
|
||||
ol.Map.prototype.setRotation = function(rotation) {
|
||||
this.set(ol.MapProperty.ROTATION, rotation);
|
||||
@@ -860,6 +894,13 @@ ol.Map.prototype.updateMatrices_ = function() {
|
||||
1 / resolution,
|
||||
-1 / resolution,
|
||||
1);
|
||||
if (this.canRotate() && goog.isDef(rotation)) {
|
||||
goog.vec.Mat4.rotate(this.coordinateToPixelMatrix_,
|
||||
rotation,
|
||||
0,
|
||||
0,
|
||||
1);
|
||||
}
|
||||
goog.vec.Mat4.translate(this.coordinateToPixelMatrix_,
|
||||
-center.x,
|
||||
-center.y,
|
||||
@@ -870,6 +911,13 @@ ol.Map.prototype.updateMatrices_ = function() {
|
||||
center.x,
|
||||
center.y,
|
||||
0);
|
||||
if (this.canRotate() && goog.isDef(rotation)) {
|
||||
goog.vec.Mat4.rotate(this.coordinateToPixelMatrix_,
|
||||
-rotation,
|
||||
0,
|
||||
0,
|
||||
1);
|
||||
}
|
||||
goog.vec.Mat4.scale(this.pixelToCoordinateMatrix_,
|
||||
resolution,
|
||||
-resolution,
|
||||
|
||||
Reference in New Issue
Block a user