move pixel to/from coordinate calculation functions from Map to MapRenderer
This commit is contained in:
@@ -26,7 +26,6 @@ goog.require('goog.fx.Dragger');
|
|||||||
goog.require('goog.fx.anim');
|
goog.require('goog.fx.anim');
|
||||||
goog.require('goog.fx.anim.Animated');
|
goog.require('goog.fx.anim.Animated');
|
||||||
goog.require('goog.object');
|
goog.require('goog.object');
|
||||||
goog.require('goog.vec.Mat4');
|
|
||||||
goog.require('ol.Collection');
|
goog.require('ol.Collection');
|
||||||
goog.require('ol.Color');
|
goog.require('ol.Color');
|
||||||
goog.require('ol.Coordinate');
|
goog.require('ol.Coordinate');
|
||||||
@@ -93,18 +92,6 @@ ol.Map = function(
|
|||||||
*/
|
*/
|
||||||
this.mapToUserTransform_ = ol.Projection.cloneTransform;
|
this.mapToUserTransform_ = ol.Projection.cloneTransform;
|
||||||
|
|
||||||
/**
|
|
||||||
* @private
|
|
||||||
* @type {goog.vec.Mat4.Number}
|
|
||||||
*/
|
|
||||||
this.coordinateToPixelMatrix_ = goog.vec.Mat4.createNumber();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @private
|
|
||||||
* @type {goog.vec.Mat4.Number}
|
|
||||||
*/
|
|
||||||
this.pixelToCoordinateMatrix_ = goog.vec.Mat4.createNumber();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @type {boolean}
|
* @type {boolean}
|
||||||
@@ -123,12 +110,6 @@ ol.Map = function(
|
|||||||
*/
|
*/
|
||||||
this.freezeRenderingCount_ = 0;
|
this.freezeRenderingCount_ = 0;
|
||||||
|
|
||||||
/**
|
|
||||||
* @private
|
|
||||||
* @type {boolean}
|
|
||||||
*/
|
|
||||||
this.matriciesDirty_ = true;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @type {Element}
|
* @type {Element}
|
||||||
@@ -196,26 +177,10 @@ ol.Map = function(
|
|||||||
goog.events.listen(this.viewportSizeMonitor_, goog.events.EventType.RESIZE,
|
goog.events.listen(this.viewportSizeMonitor_, goog.events.EventType.RESIZE,
|
||||||
this.handleViewportResize, false, this);
|
this.handleViewportResize, false, this);
|
||||||
|
|
||||||
goog.events.listen(
|
|
||||||
this, ol.Object.getChangedEventType(ol.MapProperty.CENTER),
|
|
||||||
this.handleCenterChanged, false, this);
|
|
||||||
|
|
||||||
goog.events.listen(
|
goog.events.listen(
|
||||||
this, ol.Object.getChangedEventType(ol.MapProperty.PROJECTION),
|
this, ol.Object.getChangedEventType(ol.MapProperty.PROJECTION),
|
||||||
this.handleProjectionChanged, false, this);
|
this.handleProjectionChanged, false, this);
|
||||||
|
|
||||||
goog.events.listen(
|
|
||||||
this, ol.Object.getChangedEventType(ol.MapProperty.RESOLUTION),
|
|
||||||
this.handleResolutionChanged, false, this);
|
|
||||||
|
|
||||||
goog.events.listen(
|
|
||||||
this, ol.Object.getChangedEventType(ol.MapProperty.ROTATION),
|
|
||||||
this.handleRotationChanged, false, this);
|
|
||||||
|
|
||||||
goog.events.listen(
|
|
||||||
this, ol.Object.getChangedEventType(ol.MapProperty.SIZE),
|
|
||||||
this.handleSizeChanged, false, this);
|
|
||||||
|
|
||||||
goog.events.listen(
|
goog.events.listen(
|
||||||
this, ol.Object.getChangedEventType(ol.MapProperty.USER_PROJECTION),
|
this, ol.Object.getChangedEventType(ol.MapProperty.USER_PROJECTION),
|
||||||
this.handleUserProjectionChanged, false, this);
|
this.handleUserProjectionChanged, false, this);
|
||||||
@@ -291,10 +256,7 @@ goog.exportProperty(
|
|||||||
*/
|
*/
|
||||||
ol.Map.prototype.getCoordinateFromPixel = function(pixel) {
|
ol.Map.prototype.getCoordinateFromPixel = function(pixel) {
|
||||||
if (this.isDef()) {
|
if (this.isDef()) {
|
||||||
this.updateMatrices_();
|
return this.renderer_.getCoordinateFromPixel(pixel);
|
||||||
var vec3 = [pixel.x, pixel.y, 0];
|
|
||||||
goog.vec.Mat4.multVec3(this.pixelToCoordinateMatrix_, vec3, vec3);
|
|
||||||
return new ol.Coordinate(vec3[0], vec3[1]);
|
|
||||||
} else {
|
} else {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
@@ -346,10 +308,7 @@ ol.Map.prototype.getLayers = function() {
|
|||||||
*/
|
*/
|
||||||
ol.Map.prototype.getPixelFromCoordinate = function(coordinate) {
|
ol.Map.prototype.getPixelFromCoordinate = function(coordinate) {
|
||||||
if (this.isDef()) {
|
if (this.isDef()) {
|
||||||
this.updateMatrices_();
|
return this.renderer_.getPixelFromCoordinate(coordinate);
|
||||||
var vec3 = [coordinate.x, coordinate.y, 0];
|
|
||||||
goog.vec.Mat4.multVec3(this.coordinateToPixelMatrix_, vec3, vec3);
|
|
||||||
return new ol.Pixel(vec3[0], vec3[1]);
|
|
||||||
} else {
|
} else {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
@@ -509,14 +468,6 @@ ol.Map.prototype.handleBrowserEvent = function(browserEvent, opt_type) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @protected
|
|
||||||
*/
|
|
||||||
ol.Map.prototype.handleCenterChanged = function() {
|
|
||||||
this.matriciesDirty_ = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {goog.fx.DragEvent} dragEvent Drag event.
|
* @param {goog.fx.DragEvent} dragEvent Drag event.
|
||||||
*/
|
*/
|
||||||
@@ -534,30 +485,6 @@ ol.Map.prototype.handleProjectionChanged = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @protected
|
|
||||||
*/
|
|
||||||
ol.Map.prototype.handleResolutionChanged = function() {
|
|
||||||
this.matriciesDirty_ = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @protected
|
|
||||||
*/
|
|
||||||
ol.Map.prototype.handleRotationChanged = function() {
|
|
||||||
this.matriciesDirty_ = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @protected
|
|
||||||
*/
|
|
||||||
ol.Map.prototype.handleSizeChanged = function() {
|
|
||||||
this.matriciesDirty_ = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @protected
|
* @protected
|
||||||
*/
|
*/
|
||||||
@@ -733,50 +660,6 @@ goog.exportProperty(
|
|||||||
ol.Map.prototype.setUserProjection);
|
ol.Map.prototype.setUserProjection);
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
ol.Map.prototype.updateMatrices_ = function() {
|
|
||||||
|
|
||||||
if (this.matriciesDirty_) {
|
|
||||||
|
|
||||||
var center = /** @type {!ol.Coordinate} */ this.getCenter();
|
|
||||||
var resolution = /** @type {number} */ this.getResolution();
|
|
||||||
var rotation = this.getRotation();
|
|
||||||
var size = /** @type {!ol.Size} */ this.getSize();
|
|
||||||
|
|
||||||
goog.vec.Mat4.makeIdentity(this.coordinateToPixelMatrix_);
|
|
||||||
goog.vec.Mat4.translate(this.coordinateToPixelMatrix_,
|
|
||||||
size.width / 2,
|
|
||||||
size.height / 2,
|
|
||||||
0);
|
|
||||||
goog.vec.Mat4.scale(this.coordinateToPixelMatrix_,
|
|
||||||
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,
|
|
||||||
0);
|
|
||||||
|
|
||||||
var inverted = goog.vec.Mat4.invert(
|
|
||||||
this.coordinateToPixelMatrix_, this.pixelToCoordinateMatrix_);
|
|
||||||
goog.asserts.assert(inverted);
|
|
||||||
|
|
||||||
this.matriciesDirty_ = false;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
ol.Map.prototype.render = function() {
|
ol.Map.prototype.render = function() {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ goog.require('goog.Disposable');
|
|||||||
goog.require('goog.events');
|
goog.require('goog.events');
|
||||||
goog.require('goog.fx.anim');
|
goog.require('goog.fx.anim');
|
||||||
goog.require('goog.fx.anim.Animated');
|
goog.require('goog.fx.anim.Animated');
|
||||||
|
goog.require('goog.vec.Mat4');
|
||||||
goog.require('ol.Map');
|
goog.require('ol.Map');
|
||||||
goog.require('ol.MapProperty');
|
goog.require('ol.MapProperty');
|
||||||
|
|
||||||
@@ -43,6 +44,24 @@ ol.MapRenderer = function(target, map) {
|
|||||||
*/
|
*/
|
||||||
this.layersListenerKeys_ = null;
|
this.layersListenerKeys_ = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {goog.vec.Mat4.Number}
|
||||||
|
*/
|
||||||
|
this.coordinateToPixelMatrix_ = goog.vec.Mat4.createNumber();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {goog.vec.Mat4.Number}
|
||||||
|
*/
|
||||||
|
this.pixelToCoordinateMatrix_ = goog.vec.Mat4.createNumber();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {boolean}
|
||||||
|
*/
|
||||||
|
this.matricesDirty_ = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @type {Array.<number>}
|
* @type {Array.<number>}
|
||||||
@@ -155,7 +174,9 @@ ol.MapRenderer.prototype.handleBackgroundColorChanged = goog.nullFunction;
|
|||||||
/**
|
/**
|
||||||
* @protected
|
* @protected
|
||||||
*/
|
*/
|
||||||
ol.MapRenderer.prototype.handleCenterChanged = goog.nullFunction;
|
ol.MapRenderer.prototype.handleCenterChanged = function() {
|
||||||
|
this.matricesDirty_ = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -251,19 +272,25 @@ ol.MapRenderer.prototype.removeLayerRenderer = function(layer) {
|
|||||||
/**
|
/**
|
||||||
* @protected
|
* @protected
|
||||||
*/
|
*/
|
||||||
ol.MapRenderer.prototype.handleResolutionChanged = goog.nullFunction;
|
ol.MapRenderer.prototype.handleResolutionChanged = function() {
|
||||||
|
this.matricesDirty_ = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @protected
|
* @protected
|
||||||
*/
|
*/
|
||||||
ol.MapRenderer.prototype.handleRotationChanged = goog.nullFunction;
|
ol.MapRenderer.prototype.handleRotationChanged = function() {
|
||||||
|
this.matricesDirty_ = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @protected
|
* @protected
|
||||||
*/
|
*/
|
||||||
ol.MapRenderer.prototype.handleSizeChanged = goog.nullFunction;
|
ol.MapRenderer.prototype.handleSizeChanged = function() {
|
||||||
|
this.matricesDirty_ = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -278,3 +305,72 @@ ol.MapRenderer.prototype.render = function() {
|
|||||||
});
|
});
|
||||||
return animate;
|
return animate;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
ol.MapRenderer.prototype.updateMatrices_ = function() {
|
||||||
|
|
||||||
|
if (this.matricesDirty_) {
|
||||||
|
|
||||||
|
var map = this.map;
|
||||||
|
var center = /** @type {!ol.Coordinate} */ map.getCenter();
|
||||||
|
var resolution = /** @type {number} */ map.getResolution();
|
||||||
|
var rotation = map.getRotation();
|
||||||
|
var size = /** @type {!ol.Size} */ map.getSize();
|
||||||
|
|
||||||
|
goog.vec.Mat4.makeIdentity(this.coordinateToPixelMatrix_);
|
||||||
|
goog.vec.Mat4.translate(this.coordinateToPixelMatrix_,
|
||||||
|
size.width / 2,
|
||||||
|
size.height / 2,
|
||||||
|
0);
|
||||||
|
goog.vec.Mat4.scale(this.coordinateToPixelMatrix_,
|
||||||
|
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,
|
||||||
|
0);
|
||||||
|
|
||||||
|
var inverted = goog.vec.Mat4.invert(
|
||||||
|
this.coordinateToPixelMatrix_, this.pixelToCoordinateMatrix_);
|
||||||
|
goog.asserts.assert(inverted);
|
||||||
|
|
||||||
|
this.matricesDirty_ = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {ol.Pixel} pixel Pixel.
|
||||||
|
* @return {ol.Coordinate} Coordinate.
|
||||||
|
*/
|
||||||
|
ol.MapRenderer.prototype.getCoordinateFromPixel = function(pixel) {
|
||||||
|
this.updateMatrices_();
|
||||||
|
var vec3 = [pixel.x, pixel.y, 0];
|
||||||
|
goog.vec.Mat4.multVec3(this.pixelToCoordinateMatrix_, vec3, vec3);
|
||||||
|
return new ol.Coordinate(vec3[0], vec3[1]);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {ol.Coordinate} coordinate Coordinate.
|
||||||
|
* @return {ol.Pixel} Pixel.
|
||||||
|
*/
|
||||||
|
ol.MapRenderer.prototype.getPixelFromCoordinate = function(coordinate) {
|
||||||
|
this.updateMatrices_();
|
||||||
|
var vec3 = [coordinate.x, coordinate.y, 0];
|
||||||
|
goog.vec.Mat4.multVec3(this.coordinateToPixelMatrix_, vec3, vec3);
|
||||||
|
return new ol.Pixel(vec3[0], vec3[1]);
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user