Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix legend and feature info for wms difference output. #7243

Merged
merged 6 commits into from
Aug 21, 2024
Merged
Show file tree
Hide file tree
Changes from 5 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
2 changes: 2 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
- getFeaturesFromPickResult now async to handle I3SNode.loadFields()
- extract common style logic to new Cesium3dTilesStyleMixin.ts
- Set default value for date and datetime WPS fields only when the field is marked as required.
- Fix legend shown for WMS difference output item
- Add `diffItemProperties` trait to override properties of WSM difference output item. Useful for customizing feature info template strings etc.
- [The next improvement]

#### 8.7.5 - 2024-06-26
Expand Down
23 changes: 18 additions & 5 deletions lib/ModelMixins/DiffableMixin.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
import { computed, makeObservable, override } from "mobx";
import JulianDate from "terriajs-cesium/Source/Core/JulianDate";
import AbstractConstructor from "../Core/AbstractConstructor";
import createStratumInstance from "../Models/Definition/createStratumInstance";
import LoadableStratum from "../Models/Definition/LoadableStratum";
import Model, { BaseModel } from "../Models/Definition/Model";
import StratumOrder from "../Models/Definition/StratumOrder";
import createStratumInstance from "../Models/Definition/createStratumInstance";
import { SelectableDimensionEnum } from "../Models/SelectableDimensions/SelectableDimensions";
import DiffableTraits from "../Traits/TraitsClasses/DiffableTraits";
import LegendTraits from "../Traits/TraitsClasses/LegendTraits";
import MappableMixin from "./MappableMixin";
import TimeFilterMixin from "./TimeFilterMixin";

class DiffStratum extends LoadableStratum(DiffableTraits) {
export class DiffStratum extends LoadableStratum(DiffableTraits) {
static stratumName = "diffStratum";
constructor(readonly catalogItem: DiffableMixin.Instance) {
super();
Expand Down Expand Up @@ -56,6 +55,22 @@ class DiffStratum extends LoadableStratum(DiffableTraits) {
get disableDateTimeSelector() {
return this.catalogItem.isShowingDiff;
}

@computed
get disableExport() {
// disable export if showing diff
// currently there is no way to generate export for the difference layer as
// it requires 2 time parameters which is not supported in standard WCS
return this.catalogItem.isShowingDiff;
}

@computed
get disableSplitter() {
// disable splitter if showing diff
// currently there is no use splitting the difference layer because
// most comparable features like style, datetime etc are disabled.
return this.catalogItem.isShowingDiff;
}
}

type BaseType = Model<DiffableTraits> & MappableMixin.Instance;
Expand Down Expand Up @@ -113,8 +128,6 @@ namespace DiffableMixin {
export function isMixedInto(model: any): model is Instance {
return model?.hasDiffableMixin;
}

StratumOrder.addLoadStratum(DiffStratum.stratumName);
}

export default DiffableMixin;
2 changes: 1 addition & 1 deletion lib/Models/Catalog/Ows/WebMapServiceCapabilitiesStratum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -825,7 +825,7 @@ export default class WebMapServiceCapabilitiesStratum extends LoadableStratum(
@computed get currentTime() {
// Get default times for all layers
const defaultTimes = filterOutUndefined(
Array.from(this.capabilitiesLayers).map(([layerName, layer]) => {
Array.from(this.capabilitiesLayers).map(([_layerName, layer]) => {
if (!layer) return;
const dimensions = this.capabilities.getInheritedValues(
layer,
Expand Down
24 changes: 16 additions & 8 deletions lib/Models/Catalog/Ows/WebMapServiceCatalogItem.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@ import combine from "terriajs-cesium/Source/Core/combine";
import GetFeatureInfoFormat from "terriajs-cesium/Source/Scene/GetFeatureInfoFormat";
import WebMapServiceImageryProvider from "terriajs-cesium/Source/Scene/WebMapServiceImageryProvider";
import URI from "urijs";
import { JsonObject } from "../../../Core/Json";
import TerriaError from "../../../Core/TerriaError";
import createTransformerAllowUndefined from "../../../Core/createTransformerAllowUndefined";
import filterOutUndefined from "../../../Core/filterOutUndefined";
import isDefined from "../../../Core/isDefined";
import CatalogMemberMixin, {
getName
} from "../../../ModelMixins/CatalogMemberMixin";
import DiffableMixin from "../../../ModelMixins/DiffableMixin";
import DiffableMixin, { DiffStratum } from "../../../ModelMixins/DiffableMixin";
import ExportWebCoverageServiceMixin from "../../../ModelMixins/ExportWebCoverageServiceMixin";
import GetCapabilitiesMixin from "../../../ModelMixins/GetCapabilitiesMixin";
import MappableMixin, {
Expand Down Expand Up @@ -99,7 +100,9 @@ export class WebMapServiceUrlStratum extends LoadableStratum(
}
}

// Order is important so that the traits are overridden correctly
StratumOrder.addLoadStratum(WebMapServiceUrlStratum.stratumName);
StratumOrder.addLoadStratum(DiffStratum.stratumName);

class WebMapServiceCatalogItem
extends TileErrorHandlerMixin(
Expand Down Expand Up @@ -497,8 +500,13 @@ class WebMapServiceCatalogItem
}

@computed
get diffModeParameters() {
return { styles: this.diffStyleId };
get diffModeParameters(): JsonObject {
return this.isShowingDiff ? { styles: this.diffStyleId } : {};
}

@computed
get diffModeGetFeatureInfoParameters(): JsonObject {
return this.isShowingDiff ? { styles: this.diffStyleId } : {};
}

getTagForTime(date: JulianDate): string | undefined {
Expand Down Expand Up @@ -550,10 +558,6 @@ class WebMapServiceCatalogItem
...this.getFeatureInfoParameters
};

const diffModeParameters = this.isShowingDiff
? this.diffModeParameters
: {};

if (this.supportsColorScaleRange) {
parameters.COLORSCALERANGE = this.colorScaleRange;
}
Expand All @@ -562,7 +566,11 @@ class WebMapServiceCatalogItem
parameters.styles = this.styles ?? "";
getFeatureInfoParameters.styles = this.styles ?? "";

Object.assign(parameters, diffModeParameters);
Object.assign(parameters, this.diffModeParameters);
Object.assign(
getFeatureInfoParameters,
this.diffModeGetFeatureInfoParameters
);

// Remove problematic query parameters from URL - these are handled by the parameters objects

Expand Down
25 changes: 19 additions & 6 deletions lib/ReactViews/Tools/DiffTool/DiffTool.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ import Loader from "../../Loader";
import DatePicker from "./DatePicker";
import LocationPicker from "./LocationPicker";
import { CLOSE_TOOL_ID } from "../../Map/MapNavigation/registerMapNavigations";
import updateModelFromJson from "../../../Models/Definition/updateModelFromJson";

const dateFormat = require("dateformat");

Expand Down Expand Up @@ -355,7 +356,7 @@ class Main extends React.Component<MainPropsType> {
}

@action.bound
onUserPickingLocation(pickingLocation: LatLonHeight) {
onUserPickingLocation(_pickingLocation: LatLonHeight) {
this._isPickingNewLocation = true;
}

Expand All @@ -364,7 +365,7 @@ class Main extends React.Component<MainPropsType> {
pickedFeatures: PickedFeatures,
pickedLocation: LatLonHeight
) {
const { leftItem, rightItem, t } = this.props;
const { leftItem, rightItem } = this.props;
const feature = pickedFeatures.features.find(
(f) =>
doesFeatureBelongToItem(f, leftItem) ||
Expand Down Expand Up @@ -404,10 +405,17 @@ class Main extends React.Component<MainPropsType> {
const terria = this.props.terria;
terria.overlays.remove(this.props.leftItem);
terria.overlays.remove(this.props.rightItem);

terria.workbench.add(this.diffItem);

this.diffItem.setTrait(CommonStrata.user, "name", this.diffItemName);
this.diffItem.showDiffImage(this.leftDate, this.rightDate, this.diffStyle);

// If given, appply additional properties for the diff item
const diffItemProperties = this.diffItem.diffItemProperties;
if (diffItemProperties) {
updateModelFromJson(this.diffItem, CommonStrata.user, diffItemProperties);
}
terria.showSplitter = false;
}

Expand Down Expand Up @@ -959,10 +967,8 @@ const LegendImage = function (props: any) {
{...props}
// Show the legend only if it loads successfully, so we start out hidden
style={{ display: "none", marginTop: "4px" }}
// @ts-expect-error
onLoad={(e) => (e.target.style.display = "block")}
// @ts-expect-error
onError={(e) => (e.target.style.display = "none")}
onLoad={(e) => (e.currentTarget.style.display = "block")}
onError={(e) => (e.currentTarget.style.display = "none")}
/>
);
};
Expand Down Expand Up @@ -993,6 +999,13 @@ async function createSplitItem(
newItem.setTrait(CommonStrata.user, "opacity", 0);
}

// Override feature info template as the parent featureInfoTemplate might
// not be relevant for the difference item. This has to be done in the user
// stratum to override template set in definition stratum.
updateModelFromJson(newItem, CommonStrata.user, {
featureInfoTemplate: { template: "" }
});

setDefaultDiffStyle(newItem);

// Set the default style to true color style if it exists
Expand Down
8 changes: 8 additions & 0 deletions lib/Traits/TraitsClasses/DiffableTraits.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { JsonObject } from "../../Core/Json";
import anyTrait from "../Decorators/anyTrait";
import primitiveArrayTrait from "../Decorators/primitiveArrayTrait";
import primitiveTrait from "../Decorators/primitiveTrait";
import mixTraits from "../mixTraits";
Expand Down Expand Up @@ -39,4 +41,10 @@ export default class DiffableTraits extends mixTraits(TimeFilterTraits) {
description: "The ID of the style used to compute the difference image"
})
diffStyleId?: string;

@anyTrait({
name: "Difference item properties",
description: "Additional properties to set on the difference output item."
})
diffItemProperties?: JsonObject;
}
12 changes: 6 additions & 6 deletions test/ModelMixins/DiffableMixinSpec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,17 +62,17 @@ class TestDiffableItem extends DiffableMixin(
}

showDiffImage(
firstDate: JulianDate,
secondDate: JulianDate,
diffStyleId: string
_firstDate: JulianDate,
_secondDate: JulianDate,
_diffStyleId: string
) {}

clearDiffImage() {}

getLegendUrlForStyle(
diffStyleId: string,
firstDate: JulianDate,
secondDate: JulianDate
_diffStyleId: string,
_firstDate: JulianDate,
_secondDate: JulianDate
) {
return "test-legend-url";
}
Expand Down
Loading