UNPKG

terriajs

Version:

Geospatial data visualization platform.

111 lines 5.01 kB
import { isObservableArray, reaction, runInAction } from "mobx"; import createGuid from "terriajs-cesium/Source/Core/createGuid"; import Ellipsoid from "terriajs-cesium/Source/Core/Ellipsoid"; import CesiumMath from "terriajs-cesium/Source/Core/Math"; import filterOutUndefined from "../../Core/filterOutUndefined"; import flatten from "../../Core/flatten"; import isDefined from "../../Core/isDefined"; import Result from "../../Core/Result"; import featureDataToGeoJson from "../../Map/PickedFeatures/featureDataToGeoJson"; import GeoJsonCatalogItem from "../../Models/Catalog/CatalogItems/GeoJsonCatalogItem"; import CommonStrata from "../../Models/Definition/CommonStrata"; import MapInteractionMode from "../../Models/MapInteractionMode"; /** * Prompts the user to select a point on the map. */ export function selectOnMap(terria, viewState, parameter) { // Cancel any feature picking already in progress. terria.pickedFeatures = undefined; let pickedFeaturesSubscription; const pickPolygonMode = new MapInteractionMode({ message: '<div>Select existing polygon<div style="font-size:12px"><p><i>If there are no polygons to select, add a layer that provides polygons.</i></p></div></div>', onCancel: function () { terria.mapInteractionModeStack.pop(); viewState.openAddData(); if (pickedFeaturesSubscription) { pickedFeaturesSubscription.dispose(); } } }); terria.mapInteractionModeStack.push(pickPolygonMode); reaction(() => pickPolygonMode.pickedFeatures, async (pickedFeatures, _previousValue, reaction) => { pickedFeaturesSubscription = reaction; if (pickedFeatures?.allFeaturesAvailablePromise) { await pickedFeatures.allFeaturesAvailablePromise; } if (!isDefined(pickedFeatures?.pickPosition)) { return []; } const catalogItems = (pickedFeatures?.features .map(function (feature) { let geojson; if (feature.data) { geojson = featureDataToGeoJson(feature.data); // Note featureDataToGeoJson will only ever have a single feature // Add an id to it const firstFeature = geojson?.features[0]; if (isDefined(firstFeature) && !isDefined(firstFeature.id) && isDefined(feature.id)) { firstFeature.id = feature.id; } } else if (isDefined(feature.polygon)) { const positions = feature.polygon.hierarchy ?.getValue(terria.timelineClock.currentTime) .positions.map((position) => { const cartographic = Ellipsoid.WGS84.cartesianToCartographic(position); return [ CesiumMath.toDegrees(cartographic.longitude), CesiumMath.toDegrees(cartographic.latitude) ]; }); geojson = { id: feature.id, type: "Feature", properties: feature.properties ? feature.properties.getValue(terria.timelineClock.currentTime) : undefined, geometry: { coordinates: [[positions]], type: "MultiPolygon" } }; } if (isDefined(geojson)) { const catalogItem = new GeoJsonCatalogItem(createGuid(), terria); catalogItem.setTrait(CommonStrata.user, "geoJsonData", geojson); return catalogItem; } }) .filter((item) => isDefined(item)) ?? []); const result = Result.combine(await Promise.all(catalogItems.map((model) => model.loadMapItems())), "Failed to load picked polygons"); if (result.error) { terria.raiseErrorToUser(result.error, "Failed to select polygons"); terria.mapInteractionModeStack.pop(); } else { const features = flatten(filterOutUndefined(catalogItems.map((item) => item.readyData?.features))).filter((f) => f.geometry.type === "Polygon" || f.geometry.type === "MultiPolygon"); runInAction(() => { parameter.setValue(CommonStrata.user, features); terria.mapInteractionModeStack.pop(); viewState.openAddData(); }); } if (pickedFeaturesSubscription) { pickedFeaturesSubscription.dispose(); } }); viewState.explorerPanelIsVisible = false; } export function getDisplayValue(value) { if (!isDefined(value) || !isObservableArray(value)) { return ""; } return value .map(function (featureData) { return featureData.id; }) .join(", "); } //# sourceMappingURL=SelectAPolygonParameterEditor.js.map