Skip to content

Commit 0491506

Browse files
authored
fix missing terrain in map's event (#2578)
* fix missing terrain in map's event * remove it.only * add internal tag
1 parent 30797c7 commit 0491506

File tree

3 files changed

+49
-29
lines changed

3 files changed

+49
-29
lines changed

packages/maptalks/src/map/Map.Camera.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,8 +1006,12 @@ Map.include(/** @lends Map.prototype */{
10061006

10071007
//@internal
10081008
_queryTerrainInfo(containerPoint) {
1009-
if (containerPoint && this._terrainLayer) {
1010-
const coordinate = this._terrainLayer.queryTerrainAtPoint(containerPoint);
1009+
if (containerPoint) {
1010+
const terrainLayer = this._findTerrainLayer();
1011+
if (!terrainLayer) {
1012+
return null;
1013+
}
1014+
const coordinate = terrainLayer.queryTerrainAtPoint(containerPoint);
10111015
if (coordinate) {
10121016
return {
10131017
coordinate,

packages/maptalks/src/map/Map.ts

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
289289
cameraCenterDistance: number;
290290
//@internal
291291
_limitMaxExtenting: boolean;
292-
//@internal
293-
_terrainLayer: any;
294292
options: MapOptionsType;
295293
static VERSION: string;
296294
JSON_VERSION: '1.0';
@@ -1283,7 +1281,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
12831281

12841282
this._baseLayer = baseLayer;
12851283
baseLayer._bindMap(this, -1);
1286-
this._findTerrainLayer();
12871284

12881285
function onbaseLayerload() {
12891286
/**
@@ -1396,9 +1393,8 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
13961393
this._layerCache = {};
13971394
}
13981395
const mapLayers = this._layers;
1399-
let hasTerrainLayer = false;
14001396
for (let i = 0, len = layers.length; i < len; i++) {
1401-
const layer = layers[i] as any;
1397+
const layer = layers[i];
14021398
const id = layer.getId();
14031399
if (isNil(id)) {
14041400
throw new Error('Invalid id for the layer: ' + id);
@@ -1409,9 +1405,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
14091405
if (this._layerCache[id]) {
14101406
throw new Error('Duplicate layer id in the map: ' + id);
14111407
}
1412-
if (layer.queryTerrainAtPoint && layer.getTerrainLayer && layer.getTerrainLayer()) {
1413-
hasTerrainLayer = true;
1414-
}
14151408
this._layerCache[id] = layer;
14161409
layer._bindMap(this);
14171410
mapLayers.push(layer);
@@ -1421,9 +1414,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
14211414
}
14221415

14231416
this._sortLayersByZIndex();
1424-
if (hasTerrainLayer) {
1425-
this._findTerrainLayer();
1426-
}
14271417

14281418
/**
14291419
* addlayer event, fired when adding layers.
@@ -1454,7 +1444,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
14541444
return this.removeLayer([layers]);
14551445
}
14561446
const removed = [];
1457-
let terrainRemoved = false;
14581447
for (let i = 0, len = layers.length; i < len; i++) {
14591448
let layer = layers[i];
14601449
if (!(layer instanceof Layer)) {
@@ -1467,9 +1456,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
14671456
if (!map || (map as any) !== this) {
14681457
continue;
14691458
}
1470-
if (layer === this._terrainLayer) {
1471-
terrainRemoved = true;
1472-
}
14731459
removed.push(layer);
14741460
this._removeLayer(layer, this._layers);
14751461
if (this._loaded) {
@@ -1480,9 +1466,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
14801466
delete this._layerCache[id];
14811467
}
14821468
}
1483-
if (terrainRemoved) {
1484-
this._findTerrainLayer();
1485-
}
14861469
if (removed.length > 0) {
14871470
const renderer = this.getRenderer();
14881471
if (renderer) {
@@ -1513,21 +1496,19 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
15131496
return this;
15141497
}
15151498

1499+
//@internal
15161500
_findTerrainLayer() {
1517-
this._terrainLayer = null;
1518-
const baseLayer = this._baseLayer as any;
1519-
if (baseLayer && baseLayer.queryTerrainAtPoint && baseLayer.getTerrainLayer && baseLayer.getTerrainLayer()) {
1520-
this._terrainLayer = baseLayer;
1521-
return;
1501+
if (isTerrainLayer(this._baseLayer)) {
1502+
return this._baseLayer;
15221503
}
15231504
const layers = this._getLayers() || [];
15241505
for (let i = 0; i < layers.length; i++) {
15251506
const layer = layers[i];
1526-
if (layer && layer.queryTerrainAtPoint && layer.getTerrainLayer && layer.getTerrainLayer()) {
1527-
this._terrainLayer = layer;
1528-
break;
1507+
if (isTerrainLayer(layer)) {
1508+
return layer;
15291509
}
15301510
}
1511+
return null;
15311512
}
15321513

15331514
/**
@@ -2956,3 +2937,7 @@ export type MapIdentifyOptionsType = {
29562937
export type MapContainerType = string | HTMLDivElement | HTMLCanvasElement | { [key: string]: any };
29572938

29582939
export type PanelDom = (HTMLDivElement | HTMLElement) & { layerDOM: HTMLElement; uiDOM: HTMLElement; }
2940+
2941+
function isTerrainLayer(layer: any): boolean {
2942+
return layer && layer.queryTerrainAtPoint && layer.getTerrainLayer && layer.getTerrainLayer();
2943+
}

packages/maptalks/test/map/MapEventSpec.js

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,37 @@ describe('Map.Event', function () {
194194

195195

196196
}, 500);
197-
197+
198198
});
199+
200+
it('events with terrain info', function (done) {
201+
// mimic a terrain layer
202+
const terrainLayer = new maptalks.TileLayer('tile', {
203+
urlTemplate: '#',
204+
terrain: {
205+
urlTemplate: '#'
206+
}
207+
});
208+
terrainLayer.queryTerrainAtPoint = function () {
209+
return new maptalks.Coordinate(118.846825, 32.046534, 100);
210+
};
211+
terrainLayer.getTerrainLayer = function () {
212+
return this;
213+
};
214+
215+
terrainLayer.addTo(map);
216+
map.on('dom:click', function (e) {
217+
expect(e.terrain).to.be.ok();
218+
expect(e.terrain.altitude).to.be.eql(100);
219+
done();
220+
});
221+
222+
var domPosition = GET_PAGE_POSITION(container);
223+
var point = map.coordinateToContainerPoint(center).add(domPosition);
224+
happen.click(eventContainer, {
225+
'clientX': point.x,
226+
'clientY': point.y
227+
});
228+
});
229+
199230
});

0 commit comments

Comments
 (0)