UNPKG

geotoolbox

Version:

geotoolbox is GIS javascript library. It is based on d3geo, topojson and geos-wasm.

68 lines (62 loc) 2.1 kB
import { geosloader } from "./helpers/geos.js"; import { geojsonToGeosGeom, geosGeomToGeojson } from "geos-wasm/helpers"; import { check } from "./helpers/check.js"; /** * @function union * @summary Merge geometries * @description Based on `geos.GEOSUnaryUnion()`. * @async * @param {object|array} data - A GeoJSON FeatureCollection, an array of features, an array of geometries, a single feature or a single geometry. * @param {object} options - Optional parameters * @param {number} [options.id] - An id to merge by id * @returns {object|array} - A GeoJSON FeatureCollection, an array of features, an array of geometries, a single feature or a single geometry (it depends on what you've set as `data`). * @example * await geotoolbox.union(*a geojson*) */ export async function union(data, { id } = {}) { const geos = await geosloader(); const handle = check(data); let x = handle.import(data); if (id) { const ids = [...new Set(x.features.map((d) => d.properties[id]))].filter( (d) => !["", undefined, null, NaN, Infinity, -Infinity].includes(d) ); const acessor = new Map( ids.map((d) => [ d, { type: "FeatureCollection", features: x.features.filter((e) => e.properties[id] == d), }, ]) ); x.features = await Promise.all( ids.map(async (d) => { const geosGeom = geojsonToGeosGeom(acessor.get(d), geos); const newGeom = geos.GEOSUnaryUnion(geosGeom); let feature = { type: "Feature", properties: { id: d }, geometry: geosGeomToGeojson(newGeom, geos), }; geos.GEOSFree(geosGeom); geos.GEOSFree(newGeom); return feature; }) ); } else { const geosGeom = geojsonToGeosGeom(x, geos); const newGeom = geos.GEOSUnaryUnion(geosGeom); x.features = [ { type: "Feature", properties: {}, geometry: geosGeomToGeojson(newGeom, geos), }, ]; geos.GEOSFree(geosGeom); geos.GEOSFree(newGeom); } x.name = "union"; return handle.export(x); }