Consider all corners for min/max x/y check
This commit is contained in:
+20
-15
@@ -71,7 +71,14 @@ import {
|
|||||||
clear as clearTransformFuncs,
|
clear as clearTransformFuncs,
|
||||||
get as getTransformFunc,
|
get as getTransformFunc,
|
||||||
} from './proj/transforms.js';
|
} from './proj/transforms.js';
|
||||||
import {applyTransform, getWidth} from './extent.js';
|
import {
|
||||||
|
applyTransform,
|
||||||
|
getBottomLeft,
|
||||||
|
getBottomRight,
|
||||||
|
getTopLeft,
|
||||||
|
getTopRight,
|
||||||
|
getWidth,
|
||||||
|
} from './extent.js';
|
||||||
import {clamp, modulo} from './math.js';
|
import {clamp, modulo} from './math.js';
|
||||||
import {getDistance} from './sphere.js';
|
import {getDistance} from './sphere.js';
|
||||||
import {getWorldsAway} from './coordinate.js';
|
import {getWorldsAway} from './coordinate.js';
|
||||||
@@ -659,21 +666,19 @@ export function createSafeCoordinateTransform(
|
|||||||
if (!isFinite(transformed[0]) || !isFinite(transformed[1])) {
|
if (!isFinite(transformed[0]) || !isFinite(transformed[1])) {
|
||||||
// Try to recover from out-of-bounds transform
|
// Try to recover from out-of-bounds transform
|
||||||
if (destExtent) {
|
if (destExtent) {
|
||||||
const corner1 = inverse(destExtent.slice(0, 2));
|
const corner1 = inverse(getBottomLeft(destExtent));
|
||||||
const corner2 = inverse(destExtent.slice(2, 4));
|
const corner2 = inverse(getBottomRight(destExtent));
|
||||||
const x1 = corner1[0];
|
const corner3 = inverse(getTopLeft(destExtent));
|
||||||
const x2 = corner2[0];
|
const corner4 = inverse(getTopRight(destExtent));
|
||||||
const y1 = corner1[1];
|
const minX = Math.min(corner1[0], corner2[0], corner3[0], corner4[0]);
|
||||||
const y2 = corner2[1];
|
const maxX = Math.max(corner1[0], corner2[0], corner3[0], corner4[0]);
|
||||||
if (isFinite(x1) && isFinite(x2)) {
|
const minY = Math.min(corner1[1], corner2[1], corner3[1], corner4[1]);
|
||||||
x = clamp(
|
const maxY = Math.max(corner1[1], corner2[1], corner3[1], corner4[1]);
|
||||||
x == undefined ? coord[1] : x,
|
if (isFinite(minX) && isFinite(maxX)) {
|
||||||
Math.min(x1, x2),
|
x = clamp(x == undefined ? coord[1] : x, minX, maxX);
|
||||||
Math.max(x1, x2)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (isFinite(y1) && isFinite(y2)) {
|
if (isFinite(minY) && isFinite(maxY)) {
|
||||||
y = clamp(coord[1], Math.min(y1, y2), Math.max(y1, y2));
|
y = clamp(coord[1], minY, maxY);
|
||||||
}
|
}
|
||||||
transformed = forward([x, y]);
|
transformed = forward([x, y]);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user