UNPKG

@seasketch/geoprocessing

Version:

Geoprocessing and reporting framework for SeaSketch 2.0

56 lines (53 loc) 1.8 kB
import { Polygon, Geography, featuresSchema, VectorDatasource, } from "../../../src/types/index.js"; import { FeatureCollection, MultiPolygon, isExternalVectorDatasource, isInternalVectorDatasource, } from "../../../src/index.js"; import { featureCollection, truncate } from "@turf/turf"; import { readDatasourceFgbById } from "../datasources/index.js"; import { getDatasourceFeatures } from "../../../src/dataproviders/index.js"; /** * Given geography and its datasource, returns geography features with additional filter options */ export async function getGeographyFeatures( geography: Geography, /** Geography datasource */ datasource: VectorDatasource, dstPath: string, ): Promise<FeatureCollection<Polygon | MultiPolygon>> { if (isInternalVectorDatasource(datasource)) { // Read local datasource let featureColl = truncate( readDatasourceFgbById(geography.datasourceId, dstPath), { mutate: true }, ); if (geography.propertyFilter) { featureColl = featureCollection( featureColl.features.filter((curFeat) => { if (!curFeat.properties) return false; return geography.propertyFilter?.values.includes( curFeat.properties[geography.propertyFilter.property], ); }), ); } return featureColl; } else if (isExternalVectorDatasource(datasource)) { // Fetch external datasource const feats = await getDatasourceFeatures(datasource, datasource.url, { bbox: geography.bboxFilter, propertyFilter: geography.propertyFilter, }); // Make sure only contains polygon or multipolygon in array const validFeats = featuresSchema.parse(feats); return truncate(featureCollection(validFeats), { mutate: true }); } return featureCollection([]); }