Correctly reproject projections with undefined units
This commit is contained in:
@@ -36,20 +36,19 @@ ol.reproj.Image = function(sourceProj, targetProj,
|
|||||||
var limitedTargetExtent = ol.extent.getIntersection(
|
var limitedTargetExtent = ol.extent.getIntersection(
|
||||||
targetExtent, maxTargetExtent);
|
targetExtent, maxTargetExtent);
|
||||||
|
|
||||||
|
var targetCenter = ol.extent.getCenter(limitedTargetExtent);
|
||||||
|
var sourceResolution = ol.reproj.calculateSourceResolution(
|
||||||
|
sourceProj, targetProj, targetCenter, targetResolution);
|
||||||
|
|
||||||
var errorThresholdInPixels = ol.DEFAULT_RASTER_REPROJ_ERROR_THRESHOLD;
|
var errorThresholdInPixels = ol.DEFAULT_RASTER_REPROJ_ERROR_THRESHOLD;
|
||||||
|
|
||||||
// in source units
|
|
||||||
var errorThreshold = targetResolution * errorThresholdInPixels *
|
|
||||||
targetProj.getMetersPerUnit() / sourceProj.getMetersPerUnit();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @type {!ol.reproj.Triangulation}
|
* @type {!ol.reproj.Triangulation}
|
||||||
*/
|
*/
|
||||||
this.triangulation_ = new ol.reproj.Triangulation(
|
this.triangulation_ = new ol.reproj.Triangulation(
|
||||||
sourceProj, targetProj, limitedTargetExtent, this.maxSourceExtent_,
|
sourceProj, targetProj, limitedTargetExtent, this.maxSourceExtent_,
|
||||||
errorThreshold);
|
sourceResolution * errorThresholdInPixels);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
@@ -65,10 +64,6 @@ ol.reproj.Image = function(sourceProj, targetProj,
|
|||||||
|
|
||||||
var srcExtent = this.triangulation_.calculateSourceExtent();
|
var srcExtent = this.triangulation_.calculateSourceExtent();
|
||||||
|
|
||||||
var targetCenter = ol.extent.getCenter(targetExtent);
|
|
||||||
var sourceResolution = ol.reproj.calculateSourceResolution(
|
|
||||||
sourceProj, targetProj, targetCenter, targetResolution);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
* @type {ol.ImageBase}
|
* @type {ol.ImageBase}
|
||||||
|
|||||||
@@ -27,10 +27,14 @@ ol.reproj.calculateSourceResolution = function(sourceProj, targetProj,
|
|||||||
|
|
||||||
var sourceCenter = ol.proj.transform(targetCenter, targetProj, sourceProj);
|
var sourceCenter = ol.proj.transform(targetCenter, targetProj, sourceProj);
|
||||||
|
|
||||||
|
var targetMPU = targetProj.getMetersPerUnit();
|
||||||
|
var sourceMPU = sourceProj.getMetersPerUnit();
|
||||||
|
|
||||||
// calculate the ideal resolution of the source data
|
// calculate the ideal resolution of the source data
|
||||||
var sourceResolution =
|
var sourceResolution =
|
||||||
targetProj.getPointResolution(targetResolution, targetCenter) *
|
targetProj.getPointResolution(targetResolution, targetCenter);
|
||||||
targetProj.getMetersPerUnit() / sourceProj.getMetersPerUnit();
|
if (goog.isDef(targetMPU)) sourceResolution *= targetMPU;
|
||||||
|
if (goog.isDef(sourceMPU)) sourceResolution /= sourceMPU;
|
||||||
|
|
||||||
// based on the projection properties, the point resolution at the specified
|
// based on the projection properties, the point resolution at the specified
|
||||||
// coordinates may be slightly different. We need to reverse-compensate this
|
// coordinates may be slightly different. We need to reverse-compensate this
|
||||||
|
|||||||
@@ -117,27 +117,6 @@ ol.reproj.Tile = function(sourceProj, sourceTileGrid,
|
|||||||
|
|
||||||
var targetResolution = targetTileGrid.getResolution(z);
|
var targetResolution = targetTileGrid.getResolution(z);
|
||||||
|
|
||||||
var errorThresholdInPixels = goog.isDef(opt_errorThreshold) ?
|
|
||||||
opt_errorThreshold : ol.DEFAULT_RASTER_REPROJ_ERROR_THRESHOLD;
|
|
||||||
|
|
||||||
// in source units
|
|
||||||
var errorThreshold = targetResolution * errorThresholdInPixels *
|
|
||||||
targetProj.getMetersPerUnit() / sourceProj.getMetersPerUnit();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @private
|
|
||||||
* @type {!ol.reproj.Triangulation}
|
|
||||||
*/
|
|
||||||
this.triangulation_ = new ol.reproj.Triangulation(
|
|
||||||
sourceProj, targetProj, limitedTargetExtent, maxSourceExtent,
|
|
||||||
errorThreshold);
|
|
||||||
|
|
||||||
if (this.triangulation_.getTriangles().length === 0) {
|
|
||||||
// no valid triangles -> EMPTY
|
|
||||||
this.state = ol.TileState.EMPTY;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var targetCenter = ol.extent.getCenter(limitedTargetExtent);
|
var targetCenter = ol.extent.getCenter(limitedTargetExtent);
|
||||||
var sourceResolution = ol.reproj.calculateSourceResolution(
|
var sourceResolution = ol.reproj.calculateSourceResolution(
|
||||||
sourceProj, targetProj, targetCenter, targetResolution);
|
sourceProj, targetProj, targetCenter, targetResolution);
|
||||||
@@ -149,6 +128,23 @@ ol.reproj.Tile = function(sourceProj, sourceTileGrid,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var errorThresholdInPixels = goog.isDef(opt_errorThreshold) ?
|
||||||
|
opt_errorThreshold : ol.DEFAULT_RASTER_REPROJ_ERROR_THRESHOLD;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @type {!ol.reproj.Triangulation}
|
||||||
|
*/
|
||||||
|
this.triangulation_ = new ol.reproj.Triangulation(
|
||||||
|
sourceProj, targetProj, limitedTargetExtent, maxSourceExtent,
|
||||||
|
sourceResolution * errorThresholdInPixels);
|
||||||
|
|
||||||
|
if (this.triangulation_.getTriangles().length === 0) {
|
||||||
|
// no valid triangles -> EMPTY
|
||||||
|
this.state = ol.TileState.EMPTY;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.srcZ_ = sourceTileGrid.getZForResolution(sourceResolution);
|
this.srcZ_ = sourceTileGrid.getZForResolution(sourceResolution);
|
||||||
var srcExtent = this.triangulation_.calculateSourceExtent();
|
var srcExtent = this.triangulation_.calculateSourceExtent();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user