Fix missing corners of the world

This commit is contained in:
philip
2019-12-28 17:47:53 +00:00
parent b71b87d7bb
commit a6b1df3574
2 changed files with 34 additions and 6 deletions

View File

@@ -2,7 +2,7 @@
* @module ol/reproj
*/
import {createCanvasContext2D} from './dom.js';
import {containsCoordinate, createEmpty, extend, getHeight, getTopLeft, getWidth} from './extent.js';
import {containsCoordinate, createEmpty, extend, forEachCorner, getCenter, getHeight, getTopLeft, getWidth} from './extent.js';
import {solveLinearSystem} from './math.js';
import {getPointResolution, transform} from './proj.js';
@@ -53,6 +53,35 @@ export function calculateSourceResolution(sourceProj, targetProj,
}
/**
* Calculates ideal resolution to use from the source in order to achieve
* pixel mapping as close as possible to 1:1 during reprojection.
* The resolution is calculated regardless of what resolutions
* are actually available in the dataset (TileGrid, Image, ...).
*
* @param {import("./proj/Projection.js").default} sourceProj Source projection.
* @param {import("./proj/Projection.js").default} targetProj Target projection.
* @param {import("./extent.js").Extent} targetExtent Target extent
* @param {number} targetResolution Target resolution.
* @return {number} The best resolution to use. Can be +-Infinity, NaN or 0.
*/
export function calculateSourceExtentResolution(sourceProj, targetProj,
targetExtent, targetResolution) {
const targetCenter = getCenter(targetExtent);
let sourceResolution = calculateSourceResolution(sourceProj, targetProj, targetCenter, targetResolution);
if (!isFinite(sourceResolution) || sourceResolution <= 0) {
forEachCorner(targetExtent, function(corner) {
sourceResolution = calculateSourceResolution(sourceProj, targetProj, corner, targetResolution);
return isFinite(sourceResolution) && sourceResolution > 0;
});
}
return sourceResolution;
}
/**
* Renders the source data into new canvas based on the triangulation.
*

View File

@@ -7,9 +7,9 @@ import Tile from '../Tile.js';
import TileState from '../TileState.js';
import {listen, unlistenByKey} from '../events.js';
import EventType from '../events/EventType.js';
import {getArea, getCenter, getIntersection} from '../extent.js';
import {getArea, getIntersection} from '../extent.js';
import {clamp} from '../math.js';
import {calculateSourceResolution, render as renderReprojected} from '../reproj.js';
import {calculateSourceExtentResolution, render as renderReprojected} from '../reproj.js';
import Triangulation from './Triangulation.js';
@@ -140,9 +140,8 @@ class ReprojTile extends Tile {
const targetResolution = targetTileGrid.getResolution(
this.wrappedTileCoord_[0]);
const targetCenter = getCenter(limitedTargetExtent);
const sourceResolution = calculateSourceResolution(
sourceProj, targetProj, targetCenter, targetResolution);
const sourceResolution = calculateSourceExtentResolution(
sourceProj, targetProj, limitedTargetExtent, targetResolution);
if (!isFinite(sourceResolution) || sourceResolution <= 0) {
// invalid sourceResolution -> EMPTY