diff --git a/packages/maptalks/src/renderer/layer/LayerAbstractRenderer.ts b/packages/maptalks/src/renderer/layer/LayerAbstractRenderer.ts index 7473a5cb48..76964150f9 100644 --- a/packages/maptalks/src/renderer/layer/LayerAbstractRenderer.ts +++ b/packages/maptalks/src/renderer/layer/LayerAbstractRenderer.ts @@ -815,8 +815,8 @@ function (exports) { .then(bitmap => { cb(null, {data:bitmap}); }).catch(err => { - console.warn('error when loading tile:', url); - console.warn(err); + console.error('error when loading tile:', url); + console.error(err); cb(err); }); } diff --git a/packages/maptalks/src/renderer/layer/tilelayer/TileLayerCanvasRenderer.ts b/packages/maptalks/src/renderer/layer/tilelayer/TileLayerCanvasRenderer.ts index 3b4f0f3f98..dbc0ae5e7d 100644 --- a/packages/maptalks/src/renderer/layer/tilelayer/TileLayerCanvasRenderer.ts +++ b/packages/maptalks/src/renderer/layer/tilelayer/TileLayerCanvasRenderer.ts @@ -167,7 +167,7 @@ export default class TileLayerCanvasRenderer extends TileLayerRenderable(CanvasR // eslint-disable-next-line @typescript-eslint/no-unused-vars drawTile(tileInfo: Tile['info'], tileImage: Tile['image'], parentContext?: RenderContext) { - if (!tileImage) { + if (!this._validateTileImage(tileImage)) { return; } const map = this.getMap(); diff --git a/packages/maptalks/src/renderer/layer/tilelayer/TileLayerGLRenderer.ts b/packages/maptalks/src/renderer/layer/tilelayer/TileLayerGLRenderer.ts index 2c15cd1ab9..765aef8716 100644 --- a/packages/maptalks/src/renderer/layer/tilelayer/TileLayerGLRenderer.ts +++ b/packages/maptalks/src/renderer/layer/tilelayer/TileLayerGLRenderer.ts @@ -65,6 +65,9 @@ class TileLayerGLRenderer extends ImageGLRenderable(TileLayerCanvasRenderer) { } drawTile(tileInfo: Tile['info'], tileImage: Tile['image'], parentContext: RenderContext): void { + if (!this._validateTileImage(tileImage)) { + return; + } if (parentContext && parentContext.sceneFilter) { if (!parentContext.sceneFilter(MESH_TO_TEST)) { return; diff --git a/packages/maptalks/src/renderer/layer/tilelayer/TileLayerRendererable.ts b/packages/maptalks/src/renderer/layer/tilelayer/TileLayerRendererable.ts index 0ecc715ccd..c83cc26177 100644 --- a/packages/maptalks/src/renderer/layer/tilelayer/TileLayerRendererable.ts +++ b/packages/maptalks/src/renderer/layer/tilelayer/TileLayerRendererable.ts @@ -797,6 +797,7 @@ const TileLayerRenderable = function (Base: T) { // return; // } const errorUrl = this.layer.options['errorUrl']; + const isFetchError = !(tileImage instanceof Image); if (errorUrl) { if ((tileImage instanceof Image) && tileImage.src !== errorUrl) { tileImage.src = errorUrl; @@ -810,6 +811,9 @@ const TileLayerRenderable = function (Base: T) { this.abortTileLoading(tileImage, tileInfo); tileImage.loadTime = 0; + if (isFetchError) { + tileImage.fetchErrorTime = now(); + } this.removeTileLoading(tileInfo); this._addTileToCache(tileInfo, tileImage); this.setToRedraw(); @@ -1260,6 +1264,16 @@ const TileLayerRenderable = function (Base: T) { setTerrainHelper(helper: TerrainHelper) { this._terrainHelper = helper; } + + _validateTileImage(image) { + if (!image) { + return; + } + if (image.fetchErrorTime) { + return false; + } + return true; + } } return renderable; } @@ -1303,6 +1317,7 @@ export type LayerId = string | number; export type TerrainHelper = any; export type TileImage = (HTMLImageElement | HTMLCanvasElement | ImageBitmap) & { loadTime: number; + fetchErrorTime: number; glBuffer?: TileImageBuffer; texture?: TileImageTexture; // onerrorTick?: number; diff --git a/packages/maptalks/src/ui/UIMarker.ts b/packages/maptalks/src/ui/UIMarker.ts index 5ebdf37b36..92e9ac080e 100644 --- a/packages/maptalks/src/ui/UIMarker.ts +++ b/packages/maptalks/src/ui/UIMarker.ts @@ -249,6 +249,17 @@ class UIMarker extends Handlerable(UIComponent) { * @fires UIMarker#positionchange */ setCoordinates(coordinates: Coordinate) { + if (!coordinates) { + return this; + } + if (!(coordinates instanceof Coordinate)) { + try { + coordinates = new Coordinate(coordinates); + } catch (error) { + console.error(error); + return this; + } + } this._markerCoord = coordinates; /** * positionchange event.