Skip to content

Commit

Permalink
Merge pull request #6971 from TerriaJS/mapserver-emptylayers-precached
Browse files Browse the repository at this point in the history
`ArcGisMapServerCatalogItem` will now use "pre-cached tiles" if no `layers` are specified.
  • Loading branch information
nf-s authored Nov 30, 2023
2 parents 57a5e8c + 2130db3 commit b696c36
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 27 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#### next release (8.3.10)

- Added `apiColumns` to `ApiTableCatalogItem` - this can now be used to specify `responseDataPath` per table column.
- `ArcGisMapServerCatalogItem` will now use "pre-cached tiles" if available if no (or all) `layers` are specified.
- [The next improvement]

#### 8.3.9 - 2023-11-24
Expand Down
23 changes: 0 additions & 23 deletions lib/Core/arraysAreEqual.js

This file was deleted.

19 changes: 19 additions & 0 deletions lib/Core/arraysAreEqual.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import isDefined from "./isDefined";

export default function arraysAreEqual<T>(left: T[], right: T[]) {
if (left === right) {
return true;
}

if (!isDefined(left) || !isDefined(right) || left.length !== right.length) {
return false;
}

for (var i = 0; i < left.length; ++i) {
if (left[i] !== right[i]) {
return false;
}
}

return true;
}
17 changes: 17 additions & 0 deletions lib/Core/setsAreEqual.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
export function setsAreEqual<T>(left: Set<T> | T[], right: Set<T> | T[]) {
if (Array.isArray(left)) left = new Set(left);

if (Array.isArray(right)) right = new Set(right);

if (left === right) {
return true;
}

if (left.size !== right.size) {
return false;
}

const union = new Set([...left, ...right]);

return union.size === left.size && union.size === right.size;
}
15 changes: 11 additions & 4 deletions lib/Models/Catalog/Esri/ArcGisMapServerCatalogItem.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
import i18next from "i18next";
import uniqWith from "lodash-es/uniqWith";
import { computed, makeObservable, override, runInAction } from "mobx";
import moment from "moment";
import WebMercatorTilingScheme from "terriajs-cesium/Source/Core/WebMercatorTilingScheme";
import ArcGisMapServerImageryProvider from "terriajs-cesium/Source/Scene/ArcGisMapServerImageryProvider";
import URI from "urijs";
import TerriaError, { networkRequestError } from "../../../Core/TerriaError";
import createDiscreteTimesFromIsoSegments from "../../../Core/createDiscreteTimes";
import createTransformerAllowUndefined from "../../../Core/createTransformerAllowUndefined";
import filterOutUndefined from "../../../Core/filterOutUndefined";
import isDefined from "../../../Core/isDefined";
import loadJson from "../../../Core/loadJson";
import replaceUnderscores from "../../../Core/replaceUnderscores";
import { scaleDenominatorToLevel } from "../../../Core/scaleToDenominator";
import TerriaError, { networkRequestError } from "../../../Core/TerriaError";
import { setsAreEqual } from "../../../Core/setsAreEqual";
import Proj4Definitions from "../../../Map/Vector/Proj4Definitions";
import CatalogMemberMixin from "../../../ModelMixins/CatalogMemberMixin";
import DiscretelyTimeVaryingMixin from "../../../ModelMixins/DiscretelyTimeVaryingMixin";
Expand All @@ -27,16 +29,15 @@ import LegendTraits, {
} from "../../../Traits/TraitsClasses/LegendTraits";
import { RectangleTraits } from "../../../Traits/TraitsClasses/MappableTraits";
import CreateModel from "../../Definition/CreateModel";
import createStratumInstance from "../../Definition/createStratumInstance";
import LoadableStratum from "../../Definition/LoadableStratum";
import { BaseModel, ModelConstructorParameters } from "../../Definition/Model";
import StratumFromTraits from "../../Definition/StratumFromTraits";
import StratumOrder from "../../Definition/StratumOrder";
import createStratumInstance from "../../Definition/createStratumInstance";
import getToken from "../../getToken";
import proxyCatalogItemUrl from "../proxyCatalogItemUrl";
import MinMaxLevelMixin from "./../../../ModelMixins/MinMaxLevelMixin";
import { Extent, Layer, MapServer } from "./ArcGisInterfaces";
import moment from "moment";

const proj4 = require("proj4").default;

Expand Down Expand Up @@ -552,7 +553,13 @@ 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,
usePreCachedTilesIfAvailable:
this.layersArray.length === 0 ||
!this.layers ||
setsAreEqual(
this.layersArray.map((l) => l.id),
stratum.allLayers.map((l) => l.id)
),
mapServerData: stratum.mapServer,
token: stratum.token,
credit: this.attribution
Expand Down
56 changes: 56 additions & 0 deletions test/Models/Catalog/esri/ArcGisMapServerCatalogItemSpec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,62 @@ describe("ArcGisMapServerCatalogItem", function () {
imageryProvider.requestImage(0, 0, 100);
expect(item.scaleWorkbenchInfo).toBeDefined();
});

it("usePreCachedTilesIfAvailable = false if requesting specific layers", async function () {
runInAction(() => {
item = new ArcGisMapServerCatalogItem("test", new Terria());
item.setTrait(CommonStrata.definition, "url", mapServerUrl);
item.setTrait(CommonStrata.definition, "layers", "31,32");
});
await item.loadMapItems();

expect(item.layersArray.length).toBe(2);

imageryProvider = item.mapItems[0]
.imageryProvider as ArcGisMapServerImageryProvider;
expect((imageryProvider as any)._usePreCachedTilesIfAvailable).toBe(
false
);
});

it("usePreCachedTilesIfAvailable = true if not requesting specific layers", async function () {
runInAction(() => {
item = new ArcGisMapServerCatalogItem("test", new Terria());
item.setTrait(CommonStrata.definition, "url", mapServerUrl);
item.setTrait(CommonStrata.definition, "layers", undefined);
});
await item.loadMapItems();
expect(item.layersArray.length).toBe(74);

imageryProvider = item.mapItems[0]
.imageryProvider as ArcGisMapServerImageryProvider;
expect((imageryProvider as any)._usePreCachedTilesIfAvailable).toBe(
true
);
});

it("usePreCachedTilesIfAvailable = true if requesting all layers", async function () {
runInAction(() => {
item = new ArcGisMapServerCatalogItem("test", new Terria());
item.setTrait(CommonStrata.definition, "url", mapServerUrl);
item.setTrait(
CommonStrata.definition,
"layers",
new Array(74)
.fill(0)
.map((_, i) => i)
.join(",")
);
});
await item.loadMapItems();
expect(item.layersArray.length).toBe(74);

imageryProvider = item.mapItems[0]
.imageryProvider as ArcGisMapServerImageryProvider;
expect((imageryProvider as any)._usePreCachedTilesIfAvailable).toBe(
true
);
});
});
});

Expand Down

0 comments on commit b696c36

Please sign in to comment.