Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions packages/maptalks/src/map/Map.Camera.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1006,8 +1006,12 @@ Map.include(/** @lends Map.prototype */{

//@internal
_queryTerrainInfo(containerPoint) {
if (containerPoint && this._terrainLayer) {
const coordinate = this._terrainLayer.queryTerrainAtPoint(containerPoint);
if (containerPoint) {
const terrainLayer = this._findTerrainLayer();
if (!terrainLayer) {
return null;
}
const coordinate = terrainLayer.queryTerrainAtPoint(containerPoint);
if (coordinate) {
return {
coordinate,
Expand Down
37 changes: 11 additions & 26 deletions packages/maptalks/src/map/Map.ts
Original file line number Diff line number Diff line change
Expand Up @@ -289,8 +289,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
cameraCenterDistance: number;
//@internal
_limitMaxExtenting: boolean;
//@internal
_terrainLayer: any;
options: MapOptionsType;
static VERSION: string;
JSON_VERSION: '1.0';
Expand Down Expand Up @@ -1283,7 +1281,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {

this._baseLayer = baseLayer;
baseLayer._bindMap(this, -1);
this._findTerrainLayer();

function onbaseLayerload() {
/**
Expand Down Expand Up @@ -1396,9 +1393,8 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
this._layerCache = {};
}
const mapLayers = this._layers;
let hasTerrainLayer = false;
for (let i = 0, len = layers.length; i < len; i++) {
const layer = layers[i] as any;
const layer = layers[i];
const id = layer.getId();
if (isNil(id)) {
throw new Error('Invalid id for the layer: ' + id);
Expand All @@ -1409,9 +1405,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
if (this._layerCache[id]) {
throw new Error('Duplicate layer id in the map: ' + id);
}
if (layer.queryTerrainAtPoint && layer.getTerrainLayer && layer.getTerrainLayer()) {
hasTerrainLayer = true;
}
this._layerCache[id] = layer;
layer._bindMap(this);
mapLayers.push(layer);
Expand All @@ -1421,9 +1414,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
}

this._sortLayersByZIndex();
if (hasTerrainLayer) {
this._findTerrainLayer();
}

/**
* addlayer event, fired when adding layers.
Expand Down Expand Up @@ -1454,7 +1444,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
return this.removeLayer([layers]);
}
const removed = [];
let terrainRemoved = false;
for (let i = 0, len = layers.length; i < len; i++) {
let layer = layers[i];
if (!(layer instanceof Layer)) {
Expand All @@ -1467,9 +1456,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
if (!map || (map as any) !== this) {
continue;
}
if (layer === this._terrainLayer) {
terrainRemoved = true;
}
removed.push(layer);
this._removeLayer(layer, this._layers);
if (this._loaded) {
Expand All @@ -1480,9 +1466,6 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
delete this._layerCache[id];
}
}
if (terrainRemoved) {
this._findTerrainLayer();
}
if (removed.length > 0) {
const renderer = this.getRenderer();
if (renderer) {
Expand Down Expand Up @@ -1513,21 +1496,19 @@ export class Map extends Handlerable(Eventable(Renderable(Class))) {
return this;
}

//@internal
_findTerrainLayer() {
this._terrainLayer = null;
const baseLayer = this._baseLayer as any;
if (baseLayer && baseLayer.queryTerrainAtPoint && baseLayer.getTerrainLayer && baseLayer.getTerrainLayer()) {
this._terrainLayer = baseLayer;
return;
if (isTerrainLayer(this._baseLayer)) {
return this._baseLayer;
}
const layers = this._getLayers() || [];
for (let i = 0; i < layers.length; i++) {
const layer = layers[i];
if (layer && layer.queryTerrainAtPoint && layer.getTerrainLayer && layer.getTerrainLayer()) {
this._terrainLayer = layer;
break;
if (isTerrainLayer(layer)) {
return layer;
}
}
return null;
}

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

export type PanelDom = (HTMLDivElement | HTMLElement) & { layerDOM: HTMLElement; uiDOM: HTMLElement; }

function isTerrainLayer(layer: any): boolean {
return layer && layer.queryTerrainAtPoint && layer.getTerrainLayer && layer.getTerrainLayer();
}
33 changes: 32 additions & 1 deletion packages/maptalks/test/map/MapEventSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,37 @@ describe('Map.Event', function () {


}, 500);

});

it('events with terrain info', function (done) {
// mimic a terrain layer
const terrainLayer = new maptalks.TileLayer('tile', {
urlTemplate: '#',
terrain: {
urlTemplate: '#'
}
});
terrainLayer.queryTerrainAtPoint = function () {
return new maptalks.Coordinate(118.846825, 32.046534, 100);
};
terrainLayer.getTerrainLayer = function () {
return this;
};

terrainLayer.addTo(map);
map.on('dom:click', function (e) {
expect(e.terrain).to.be.ok();
expect(e.terrain.altitude).to.be.eql(100);
done();
});

var domPosition = GET_PAGE_POSITION(container);
var point = map.coordinateToContainerPoint(center).add(domPosition);
happen.click(eventContainer, {
'clientX': point.x,
'clientY': point.y
});
});

});