Skip to content

Commit

Permalink
synchronize map with mouse when dragging or zooming map (#2210)
Browse files Browse the repository at this point in the history
  • Loading branch information
liubgithub committed Mar 14, 2024
1 parent 005ec9d commit bdfe3e2
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 5 deletions.
4 changes: 3 additions & 1 deletion src/map/Map.Zoom.js
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,9 @@ Map.include(/** @lends Map.prototype */{
this._zoomLevel = nextZoom;
this._calcMatrices();
if (origin) {
this._setPrjCoordAtContainerPoint(this._startZoomCoord, origin);
const p = this._containerPointToPoint(origin);
const offset = p._sub(this._prjToPoint(this._getPrjCenter()));
this._setPrjCoordAtOffsetToCenter(this._startZoomCoord, offset);
}
},

Expand Down
16 changes: 16 additions & 0 deletions src/map/Map.js
Original file line number Diff line number Diff line change
Expand Up @@ -2082,6 +2082,22 @@ class Map extends Handlerable(Eventable(Renderable(Class))) {
return this;
}

_setPrjCoordAtOffsetToCenter(prjCoord, offset) {
const pcenter = this._pointToPrj(this._prjToPoint(prjCoord).sub(offset));
this._setPrjCenter(pcenter);
return this;
}

_queryTerrainAtPoint(p) {
const group = this.getLayers(layer => {
return layer.queryTerrainAtPoint;
})[0];
if (group && group.getTerrainLayer()) {
return group.queryTerrainAtPoint(p);
}
return null;
}

_verifyExtent(prjCenter) {
if (!prjCenter) {
return false;
Expand Down
17 changes: 15 additions & 2 deletions src/map/handler/Map.Drag.js
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ class MapDragHandler extends Handler {
const map = this.target;
map.onMoveStart(param);
const p = getEventContainerPoint(map._getActualEvent(param.domEvent), map.getContainer());
this.startPrjCoord = map._containerPointToPrj(p);
this.startPrjCoord = this._containerPointToPrj(p);
}

_moving(param) {
Expand All @@ -119,10 +119,23 @@ class MapDragHandler extends Handler {
}
const map = this.target;
const p = getEventContainerPoint(map._getActualEvent(param.domEvent), map.getContainer());
map._setPrjCoordAtContainerPoint(this.startPrjCoord, p);
const point = map._prjToPoint(this._containerPointToPrj(p));
const offset = point._sub(map._prjToPoint(map._getPrjCenter()));
map._setPrjCoordAtOffsetToCenter(this.startPrjCoord, offset);
map.onMoving(param);
}

_containerPointToPrj(p) {
const map = this.target;
const queryCoord = map._queryTerrainAtPoint(p);
if (queryCoord) {
const prjCoord = map.getProjection().project(queryCoord);
prjCoord.z = queryCoord.z;
return prjCoord;
}
return map._containerPointToPrj(p);
}

_moveEnd(param) {
if (!this.startDragTime) {
return;
Expand Down
21 changes: 21 additions & 0 deletions test/map/MapDragSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -187,4 +187,25 @@ describe('Map.Drag', function () {
expect(center2.toArray()).not.to.be.eql(center.toArray());
expect(map.isMoving()).not.to.be.ok();
});

it('synchronize with mouse when dragging map', (done) => {
map.setPitch(45);
//vlayer用于模拟鼠标的位置和高度
const vlayer = new maptalks.VectorLayer('v').addTo(map);
vlayer.queryTerrainAtPoint = function(containerPoint) {
const coord = map.containerPointToCoordinate(containerPoint);
return new maptalks.Coordinate(coord.x, coord.y - 0.2, 100);
};
vlayer.getTerrainLayer = function() {
return true;
}
map.on('moveend', function () {
expect(map.isMoving()).not.to.be.ok();
const center = map.getCenter();
expect(center.x).to.eql(118.84493355);
expect(center.y).to.eql(32.04882672);
done();
});
dragMap(100);
});
});
26 changes: 24 additions & 2 deletions test/map/MapScrollZoomSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ describe('Map.ScrollZoom', function () {
var map;
var center = new maptalks.Coordinate(118.846825, 32.046534);
var delay;
function scrollMap(delta) {
function scrollMap(delta, clientX, clientY) {
happen.once(container, {
type: 'wheel',
detail: delta
detail: delta,
clientX: clientX || map.width / 2,
clientY: clientY || map.height / 2
});
}

Expand Down Expand Up @@ -52,6 +54,26 @@ describe('Map.ScrollZoom', function () {
map.on('zoomend', onZoomEnd);
scrollMap(-100);
});

it('synchronize with mouse when scroll zoom map', (done) => {
map.setPitch(45);
//vlayer用于模拟鼠标的位置和高度
const vlayer = new maptalks.VectorLayer('v').addTo(map);
vlayer.queryTerrainAtPoint = function(containerPoint) {
const coord = map.containerPointToCoordinate(containerPoint);
return new maptalks.Coordinate(coord.x, coord.y - 0.2, 100);
};
vlayer.getTerrainLayer = function() {
return true;
}
map.on('zoomend', function () {
const center = map.getCenter();
expect(center.x.toFixed(4)).to.eql(118.8474);
expect(center.y.toFixed(4)).to.eql(32.0460);
done();
});
scrollMap(100, 10, 10);
});
});

describe('scrollZoom can be disable', function () {
Expand Down

0 comments on commit bdfe3e2

Please sign in to comment.