UNPKG

terriajs

Version:

Geospatial data visualization platform.

82 lines 3.78 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; import { computed, makeObservable, runInAction } from "mobx"; import { toFeatureCollection } from "../../../Core/GeoJson"; import loadJson from "../../../Core/loadJson"; import TerriaError from "../../../Core/TerriaError"; import GeoJsonMixin from "../../../ModelMixins/GeojsonMixin"; import SocrataMapViewCatalogItemTraits from "../../../Traits/TraitsClasses/SocrataMapViewCatalogItemTraits"; import CreateModel from "../../Definition/CreateModel"; import LoadableStratum from "../../Definition/LoadableStratum"; import StratumOrder from "../../Definition/StratumOrder"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; /** This will fetch `views` for a given Socrata `resourceId`. * From the JSON response we get `childViews` - which can be used to generate a URL to fetch GeoJSON */ export class SocrataMapViewStratum extends LoadableStratum(SocrataMapViewCatalogItemTraits) { catalogItem; view; static stratumName = "socrataMapView"; static async load(catalogGroup) { if (!catalogGroup.url) throw "`url` must be set"; if (!catalogGroup.resourceId) throw "`resourceId` must be set"; const viewResponse = await loadJson(proxyCatalogItemUrl(catalogGroup, `${catalogGroup.url}/views/${catalogGroup.resourceId}`)); if (viewResponse.error) { throw viewResponse.message ?? viewResponse.error; } return new SocrataMapViewStratum(catalogGroup, viewResponse); } get geojsonUrl() { if (this.view?.childViews?.[0]) return `${this.catalogItem.url}/resource/${this.view.childViews[0]}.geojson?$limit=10000`; } duplicateLoadableStratum(model) { return new SocrataMapViewStratum(model, this.view); } constructor(catalogItem, view) { super(); this.catalogItem = catalogItem; this.view = view; makeObservable(this); } } __decorate([ computed ], SocrataMapViewStratum.prototype, "geojsonUrl", null); StratumOrder.addLoadStratum(SocrataMapViewStratum.stratumName); /** * Use the Socrata `views` API to fetch data. * This mimics how Socrata portal map visualisation works - it isn't an official API */ export default class SocrataMapViewCatalogItem extends GeoJsonMixin(CreateModel(SocrataMapViewCatalogItemTraits)) { static type = "socrata-map-item"; get type() { return SocrataMapViewCatalogItem.type; } async forceLoadMetadata() { if (!this.strata.has(SocrataMapViewStratum.stratumName)) { const stratum = await SocrataMapViewStratum.load(this); runInAction(() => { this.strata.set(SocrataMapViewStratum.stratumName, stratum); }); } } async forceLoadGeojsonData() { if (this.geojsonUrl) { const result = await loadJson(proxyCatalogItemUrl(this, this.geojsonUrl)); const fc = toFeatureCollection(result); if (fc) return fc; else throw TerriaError.from("Failed to parse geoJSON"); } throw TerriaError.from("Failed to fetch geoJSON - no URL was provided"); } } //# sourceMappingURL=SocrataMapViewCatalogItem.js.map