Merge pull request #13393 from MoonE/view-fixes

Fix setting View resolution or center to undefined
This commit is contained in:
MoonE
2022-02-19 13:55:08 +01:00
committed by GitHub
3 changed files with 55 additions and 39 deletions
+3 -1
View File
@@ -1636,7 +1636,9 @@ class View extends BaseObject {
* @api * @api
*/ */
setCenter(center) { setCenter(center) {
this.setCenterInternal(fromUserCoordinate(center, this.getProjection())); this.setCenterInternal(
center ? fromUserCoordinate(center, this.getProjection()) : center
);
} }
/** /**
+9 -7
View File
@@ -18,14 +18,19 @@ export function createExtent(extent, onlyCenter, smooth) {
return ( return (
/** /**
* @param {import("./coordinate.js").Coordinate|undefined} center Center. * @param {import("./coordinate.js").Coordinate|undefined} center Center.
* @param {number} resolution Resolution. * @param {number|undefined} resolution Resolution.
* @param {import("./size.js").Size} size Viewport size; unused if `onlyCenter` was specified. * @param {import("./size.js").Size} size Viewport size; unused if `onlyCenter` was specified.
* @param {boolean} [opt_isMoving] True if an interaction or animation is in progress. * @param {boolean} [opt_isMoving] True if an interaction or animation is in progress.
* @param {Array<number>} [opt_centerShift] Shift between map center and viewport center. * @param {Array<number>} [opt_centerShift] Shift between map center and viewport center.
* @return {import("./coordinate.js").Coordinate|undefined} Center. * @return {import("./coordinate.js").Coordinate|undefined} Center.
*/ */
function (center, resolution, size, opt_isMoving, opt_centerShift) { function (center, resolution, size, opt_isMoving, opt_centerShift) {
if (center) { if (!center) {
return undefined;
}
if (!resolution && !onlyCenter) {
return center;
}
const viewWidth = onlyCenter ? 0 : size[0] * resolution; const viewWidth = onlyCenter ? 0 : size[0] * resolution;
const viewHeight = onlyCenter ? 0 : size[1] * resolution; const viewHeight = onlyCenter ? 0 : size[1] * resolution;
const shiftX = opt_centerShift ? opt_centerShift[0] : 0; const shiftX = opt_centerShift ? opt_centerShift[0] : 0;
@@ -48,10 +53,10 @@ export function createExtent(extent, onlyCenter, smooth) {
let x = clamp(center[0], minX, maxX); let x = clamp(center[0], minX, maxX);
let y = clamp(center[1], minY, maxY); let y = clamp(center[1], minY, maxY);
const ratio = 30 * resolution;
// during an interaction, allow some overscroll // during an interaction, allow some overscroll
if (opt_isMoving && smooth) { if (opt_isMoving && smooth && resolution) {
const ratio = 30 * resolution;
x += x +=
-ratio * Math.log(1 + Math.max(0, minX - center[0]) / ratio) + -ratio * Math.log(1 + Math.max(0, minX - center[0]) / ratio) +
ratio * Math.log(1 + Math.max(0, center[0] - maxX) / ratio); ratio * Math.log(1 + Math.max(0, center[0] - maxX) / ratio);
@@ -61,9 +66,6 @@ export function createExtent(extent, onlyCenter, smooth) {
} }
return [x, y]; return [x, y];
} else {
return undefined;
}
} }
); );
} }
+12
View File
@@ -562,6 +562,18 @@ describe('ol/View', function () {
}); });
}); });
describe('#setResolution()', function () {
it('does not change center when set to undefined', function () {
const center = [1, 1];
const view = new View({
center: center.slice(),
resolution: 1,
});
view.setResolution(undefined);
expect(view.getCenter()).to.eql(center);
});
});
describe('#setCenter()', function () { describe('#setCenter()', function () {
it('allows setting undefined center', function () { it('allows setting undefined center', function () {
const view = new View({ const view = new View({