terriajs
Version:
Geospatial data visualization platform.
76 lines • 3.13 kB
JavaScript
import { getName } from "../ModelMixins/CatalogMemberMixin";
import { isTerriaFeatureData } from "../Models/Feature/FeatureData";
/** Adds timeseries chart to feature info context (on terria.timeSeries property).
* This enables timeseries chart to be used in featureInfoTemplate like so:
* - default chart = `{{terria.timeSeries.chart}}`
* - customised chart:
* ```
* <h4>{{terria.timeSeries.title}}</h4>
* <chart x-column="{{terria.timeSeries.xName}}"
* y-column="{{terria.timeSeries.yName}}"
* id="{{terria.timeSeries.id}}"
* column-units="{{terria.timeSeries.units}}">
* {{terria.timeSeries.data}}
* </chart>
* ```
*/
export const tableFeatureInfoContext = (catalogItem) => (feature) => {
if (!catalogItem.isSampled)
return {};
const style = catalogItem.activeTableStyle;
// Corresponding row IDs for the selected feature are stored in TerriaFeatureData
// See createLongitudeLatitudeFeaturePerId, createLongitudeLatitudeFeaturePerRow and createRegionMappedImageryProvider
const rowIds = isTerriaFeatureData(feature.data)
? (feature.data.rowIds ?? [])
: [];
if (!style.timeColumn || !style.colorColumn || rowIds.length < 2)
return {};
const chartColumns = [style.timeColumn, style.colorColumn];
const csvData = [
chartColumns.map((col) => col.title).join(","),
...rowIds.map((i) => chartColumns.map((col) => col.valueFunctionForType(i)).join(","))
]
.join("\n")
.replace(/\\n/g, "\\n");
const title = style.colorColumn?.title;
const featureId = feature.id.replace(/"/g, "");
const timeSeriesContext = {
title: style.colorColumn?.title,
xName: style.timeColumn?.title,
yName: style.colorColumn?.title,
units: chartColumns.map((column) => column.units || ""),
id: featureId,
data: csvData,
chart: `<chart ${'identifier="' + featureId + '" '} ${title ? `title="${title}"` : ""}>${csvData}</chart>`
};
return {
terria: {
timeSeries: timeSeriesContext
}
};
};
/** Add `TimeSeriesFeatureInfoContext` to features with CSV string data (on `data` property) */
export const csvFeatureInfoContext = (catalogItem) => (feature) => {
// Check that feature data has return CSV as string
if (typeof feature.data === "string") {
const featureId = feature.id.replace(/"/g, "");
// Remove comment lines in CSV (start with # and don't have any commas)
const csvData = feature.data
.split("\n")
.filter((l) => !(l.startsWith("#") && !l.includes(",")))
.join("\n");
const title = getName(catalogItem);
return {
terria: {
timeSeries: {
title,
id: featureId,
data: csvData,
chart: `<chart ${'identifier="' + featureId + '" '} ${title ? `title="${title}"` : ""}>${csvData}</chart>`
}
}
};
}
return {};
};
//# sourceMappingURL=tableFeatureInfoContext.js.map