From 761566fc79eea70ec3d4ed40239a2cd5aad39d01 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Mon, 26 Feb 2024 16:58:51 +1100 Subject: [PATCH 1/2] Add `usePreCachedTilesIfAvailable` to `ArcGisMapServerCatalogItemTraits` --- CHANGES.md | 1 + .../Esri/ArcGisMapServerCatalogItem.ts | 24 +++++++++++++------ .../ArcGisMapServerCatalogItemTraits.ts | 8 +++++++ .../esri/ArcGisMapServerCatalogItemSpec.ts | 23 ++++++++++++++++++ 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 34a01cf4901..f61458d8139 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ #### next release (8.5.2) +- Add `usePreCachedTilesIfAvailable` to `ArcGisMapServerCatalogItemTraits`. - [The next improvement] #### 8.5.1 - 2024-02-23 diff --git a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts index 8273f35aa70..0126ca7ae4c 100644 --- a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts +++ b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts @@ -317,6 +317,22 @@ class MapServerStratum extends LoadableStratum( return [createStratumInstance(LegendTraits, { items })]; } + + /** Only used "pre-cached" tiles if we aren't requesting any specific layers + * If the `layersArray` property is specified, we request individual dynamic layers and ignore the fused map cache. + */ + @computed get usePreCachedTilesIfAvailable() { + if (this._item.parameters) return false; + + return ( + this._item.layersArray.length === 0 || + !this._item.layers || + setsAreEqual( + this._item.layersArray.map((l) => l.id), + this.allLayers.map((l) => l.id) + ) + ); + } } StratumOrder.addLoadStratum(MapServerStratum.stratumName); @@ -575,13 +591,7 @@ export default class ArcGisMapServerCatalogItem extends UrlMixin( /** Only used "pre-cached" tiles if we aren't requesting any specific layers * If the `layersArray` property is specified, we request individual dynamic layers and ignore the fused map cache. */ - usePreCachedTilesIfAvailable: - this.layersArray.length === 0 || - !this.layers || - setsAreEqual( - this.layersArray.map((l) => l.id), - stratum.allLayers.map((l) => l.id) - ), + usePreCachedTilesIfAvailable: this.usePreCachedTilesIfAvailable, mapServerData: stratum.mapServer, token: stratum.token, credit: this.attribution diff --git a/lib/Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits.ts b/lib/Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits.ts index 340ec9bd9a7..64dc97da434 100644 --- a/lib/Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits.ts +++ b/lib/Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits.ts @@ -92,4 +92,12 @@ export default class ArcGisMapServerCatalogItemTraits extends mixTraits( type: "boolean" }) isForwardTimeWindow: boolean = true; + + @primitiveTrait({ + name: "Is Forward Time Window", + description: + "If true, the server's pre-cached tiles are used if they are available. This will default to true if no specific layers are fetched (i.e. all layers are fetched). Otherwise, it will default to false. This will also default to false if parameters have been specified", + type: "boolean" + }) + usePreCachedTilesIfAvailable?: boolean; } diff --git a/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts b/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts index 627ce255340..323b89144d0 100644 --- a/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts +++ b/test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts @@ -278,6 +278,7 @@ describe("ArcGisMapServerCatalogItem", function () { imageryProvider = item.mapItems[0] .imageryProvider as ArcGisMapServerImageryProvider; expect(imageryProvider.usingPrecachedTiles).toBe(false); + expect(item.usePreCachedTilesIfAvailable).toBe(false); }); it("usePreCachedTilesIfAvailable = false if requesting layer ID in url path", async function () { @@ -292,6 +293,26 @@ describe("ArcGisMapServerCatalogItem", function () { imageryProvider = item.mapItems[0] .imageryProvider as ArcGisMapServerImageryProvider; expect(imageryProvider.usingPrecachedTiles).toBe(false); + expect(item.usePreCachedTilesIfAvailable).toBe(false); + }); + + it("usePreCachedTilesIfAvailable = false if parameters have been specified", async function () { + runInAction(() => { + item = new ArcGisMapServerCatalogItem("test", new Terria()); + item.setTrait(CommonStrata.definition, "url", mapServerUrl); + item.setTrait(CommonStrata.definition, "layers", undefined); + item.setTrait(CommonStrata.definition, "parameters", { + test: "something" + }); + }); + await item.loadMapItems(); + + expect(item.parameters).toEqual({ test: "something" }); + + imageryProvider = item.mapItems[0] + .imageryProvider as ArcGisMapServerImageryProvider; + expect(imageryProvider.usingPrecachedTiles).toBe(false); + expect(item.usePreCachedTilesIfAvailable).toBe(false); }); it("usePreCachedTilesIfAvailable = true if not requesting specific layers", async function () { @@ -306,6 +327,7 @@ describe("ArcGisMapServerCatalogItem", function () { imageryProvider = item.mapItems[0] .imageryProvider as ArcGisMapServerImageryProvider; expect(imageryProvider.usingPrecachedTiles).toBe(true); + expect(item.usePreCachedTilesIfAvailable).toBe(true); }); it("usePreCachedTilesIfAvailable = true if requesting all layers", async function () { @@ -327,6 +349,7 @@ describe("ArcGisMapServerCatalogItem", function () { imageryProvider = item.mapItems[0] .imageryProvider as ArcGisMapServerImageryProvider; expect(imageryProvider.usingPrecachedTiles).toBe(true); + expect(item.usePreCachedTilesIfAvailable).toBe(true); }); }); }); From bba7cc05543b8f946fd47c1643bd27f9b9c848b9 Mon Sep 17 00:00:00 2001 From: Nick Forbes-Smith Date: Mon, 26 Feb 2024 17:16:12 +1100 Subject: [PATCH 2/2] Remove comment and improve docs --- lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts | 3 --- lib/Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits.ts | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts index 0126ca7ae4c..bbe8dcb2912 100644 --- a/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts +++ b/lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts @@ -588,9 +588,6 @@ export default class ArcGisMapServerCatalogItem extends UrlMixin( tileWidth: this.tileWidth, parameters: params, enablePickFeatures: this.allowFeaturePicking, - /** Only used "pre-cached" tiles if we aren't requesting any specific layers - * If the `layersArray` property is specified, we request individual dynamic layers and ignore the fused map cache. - */ usePreCachedTilesIfAvailable: this.usePreCachedTilesIfAvailable, mapServerData: stratum.mapServer, token: stratum.token, diff --git a/lib/Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits.ts b/lib/Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits.ts index 64dc97da434..269ba456624 100644 --- a/lib/Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits.ts +++ b/lib/Traits/TraitsClasses/ArcGisMapServerCatalogItemTraits.ts @@ -96,7 +96,7 @@ export default class ArcGisMapServerCatalogItemTraits extends mixTraits( @primitiveTrait({ name: "Is Forward Time Window", description: - "If true, the server's pre-cached tiles are used if they are available. This will default to true if no specific layers are fetched (i.e. all layers are fetched). Otherwise, it will default to false. This will also default to false if parameters have been specified", + "If true, the server's pre-cached tiles are used if they are available. If false, then the MapServer export endpoint will be used. This will default to true if no specific layers are fetched (i.e. all layers are fetched). Otherwise, it will default to false. This will also default to false if parameters have been specified", type: "boolean" }) usePreCachedTilesIfAvailable?: boolean;