Skip to content

Commit 5cb51b8

Browse files
authored
terrain data support loadTileBitmap for custom terrain data (#2543)
1 parent cb74d38 commit 5cb51b8

File tree

3 files changed

+78
-32
lines changed

3 files changed

+78
-32
lines changed

packages/gl/src/layer/terrain/TerrainLayerRenderer.js

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import skinWgslVert from './wgsl/terrain_skin_vert.wgsl';
77
import skinWgslFrag from './wgsl/terrain_skin_frag.wgsl';
88
import { getCascadeTileIds, getSkinTileScale, getSkinTileRes, createEmtpyTerrainHeights, EMPTY_TERRAIN_GEO } from './TerrainTileUtil';
99
import { createMartiniData } from './util/martini';
10-
import { isNil, extend, pushIn } from '../util/util';
10+
import { isNil, extend, pushIn, isFunction } from '../util/util';
1111
import TerrainPainter from './TerrainPainter';
1212
import TerrainLitPainter from './TerrainLitPainter';
1313
import MaskRendererMixin from '../mask/MaskRendererMixin';
@@ -927,35 +927,60 @@ class TerrainLayerRenderer extends MaskRendererMixin(TileLayerRendererable(Layer
927927
cesiumIonTokenURL: layerOptions.cesiumIonTokenURL,
928928
error: error,
929929
colors: layerOptions.colors,
930-
tileSize: tileSize ? [tileSize.width, tileSize.height] : [256, 256]
930+
tileSize: tileSize ? [tileSize.width, tileSize.height] : [256, 256],
931+
command: 'loadTile'
931932
};
932-
this.workerConn.fetchTerrain(terrainUrl, options, (err, resource) => {
933-
if (this._parentRequests) {
934-
const reqKey = getParentRequestKey(tile.x, tile.y);
935-
const childTiles = this._parentRequests[reqKey];
936-
if (childTiles && childTiles.size) {
937-
this.tileCache.add(tile.id, { info: tile, image: terrainData });
938-
for (const tile of childTiles) {
939-
this.removeTileLoading(tile);
933+
934+
const fetchTerrain = () => {
935+
this.workerConn.fetchTerrain(terrainUrl, options, (err, resource) => {
936+
if (this._parentRequests) {
937+
const reqKey = getParentRequestKey(tile.x, tile.y);
938+
const childTiles = this._parentRequests[reqKey];
939+
if (childTiles && childTiles.size) {
940+
this.tileCache.add(tile.id, { info: tile, image: terrainData });
941+
for (const tile of childTiles) {
942+
this.removeTileLoading(tile);
943+
}
940944
}
945+
delete this._parentRequests[reqKey];
941946
}
942-
delete this._parentRequests[reqKey];
943-
}
944-
if (err) {
945-
if (err.canceled) {
947+
if (err) {
948+
fetchError(err);
946949
return;
947950
}
948-
console.warn(err);
949-
this.onTileError(terrainData, tile);
951+
maptalks.Util.extend(terrainData, resource);
952+
terrainExaggeration(terrainData, this.layer.options.exaggeration);
953+
954+
// this.consumeTile(terrainData, tile);
955+
tile.colorsTexture = terrainData.colorsTexture;
956+
this.onTileLoad(terrainData, tile);
957+
});
958+
};
959+
const fetchError = (err) => {
960+
if (err && err.canceled) {
950961
return;
951962
}
952-
maptalks.Util.extend(terrainData, resource);
953-
terrainExaggeration(terrainData, this.layer.options.exaggeration);
963+
console.warn(err);
964+
this.onTileError(terrainData, tile);
965+
return;
966+
}
967+
if (this.loadTileBitmap && isFunction(this.loadTileBitmap)) {
968+
this.loadTileBitmap(terrainUrl, tile, (err, bitmap) => {
969+
if (err) {
970+
fetchError(err);
971+
return;
972+
}
973+
if (bitmap && bitmap instanceof ImageBitmap) {
974+
options.tileImage = bitmap;
975+
fetchTerrain();
976+
} else {
977+
fetchError(new Error('bitmap is not ImageBitmap'));
978+
}
979+
}, options);
980+
} else {
981+
fetchTerrain();
982+
}
954983

955-
// this.consumeTile(terrainData, tile);
956-
tile.colorsTexture = terrainData.colorsTexture;
957-
this.onTileLoad(terrainData, tile);
958-
});
959984
return terrainData;
960985
}
961986

@@ -1092,6 +1117,18 @@ class TerrainLayerRenderer extends MaskRendererMixin(TileLayerRendererable(Layer
10921117
abortTileLoading(tileImage, tileInfo) {
10931118
const layer = this.layer;
10941119
const maxAvailableZoom = layer.options.maxAvailableZoom && (layer.options.maxAvailableZoom - layer.options.zoomOffset);
1120+
1121+
const abortTile = (url, tile) => {
1122+
if (this.loadTileBitmap && isFunction(this.loadTileBitmap)) {
1123+
this.loadTileBitmap(url, tile, () => {
1124+
1125+
}, {
1126+
command: 'abortTile'
1127+
})
1128+
} else if (this.workerConn) {
1129+
this.workerConn.abortTerrain(url);
1130+
}
1131+
}
10951132
if (tileInfo) {
10961133
if (maxAvailableZoom && tileInfo.z > maxAvailableZoom) {
10971134
const { requests, key } = this._getParentTileRequest(tileInfo);
@@ -1100,16 +1137,12 @@ class TerrainLayerRenderer extends MaskRendererMixin(TileLayerRendererable(Layer
11001137
if (!requests.size) {
11011138
// 中止 maxAvailableZoom 瓦片的请求
11021139
delete this._parentRequests[key];
1103-
if (this.workerConn) {
1104-
this.workerConn.abortTerrain(requests.url);
1105-
}
1140+
abortTile(requests.url, tileInfo);
11061141
}
11071142
}
11081143
} else {
11091144
if (tileInfo && tileInfo.url) {
1110-
if (this.workerConn) {
1111-
this.workerConn.abortTerrain(tileInfo.url);
1112-
}
1145+
abortTile(tileInfo.url, tileInfo);
11131146
}
11141147
}
11151148
}

packages/gl/src/layer/terrain/TerrainWorkerConnection.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export default class TerrainWorkerConnection extends maptalks.worker.Actor {
1717

1818
fetchTerrain(url, options, cb) {
1919
url = this.checkUrl(url);
20+
const tileImage = options.tileImage;
2021
const data = {
2122
actorId: this.actorId,
2223
mapId: this.mapId,
@@ -30,10 +31,15 @@ export default class TerrainWorkerConnection extends maptalks.worker.Actor {
3031
cesiumIonTokenURL: options.cesiumIonTokenURL,
3132
error: options.error,
3233
colors: options.colors,
33-
tileSize: options.tileSize
34+
tileSize: options.tileSize,
35+
tileImage
3436
}
3537
};
36-
this.send(data, null, (err, data) => {
38+
const buffers = [];
39+
if (tileImage) {
40+
buffers.push(tileImage);
41+
}
42+
this.send(data, buffers, (err, data) => {
3743
if (err) {
3844
cb(err);
3945
return;

packages/gl/src/layer/terrain/worker/index.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ let workerId;
99
let BITMAP_CANVAS = null;
1010
let BITMAP_CTX = null;
1111
const TEMP_RGB = [0, 0, 0];
12-
const DEFAULT_TILESIZE= [256, 256];
12+
const DEFAULT_TILESIZE = [256, 256];
1313

1414
function checkBitMapCanvas() {
1515
try {
@@ -449,7 +449,14 @@ function generateMapboxTerrain(buffer) {
449449
}
450450

451451
function loadTerrain(params, cb) {
452-
const { url, origin, type, accessToken, terrainWidth, error } = params;
452+
const { url, origin, type, accessToken, terrainWidth, error, tileImage } = params;
453+
//custom loadTileImage and return mapbox terrain rgb data
454+
if(tileImage&&tileImage.close){
455+
const imageData = bitmapToImageData(tileImage);
456+
const terrainData = mapboxBitMapToHeights(imageData, terrainWidth);
457+
triangulateTerrain(error, terrainData, terrainWidth, tileImage, true, cb);
458+
return;
459+
}
453460
const headers = params.headers || requestHeaders[type];
454461
if (type === 'tianditu') {
455462
fetchTerrain(url, headers, type, terrainWidth, error, cb);

0 commit comments

Comments
 (0)