UNPKG

geotoolbox

Version:

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

61 lines (54 loc) 2.17 kB
import { geosloader } from "./helpers/geos.js"; import { geojsonToGeosGeom, geosGeomToGeojson } from "geos-wasm/helpers"; import { isemptygeom } from "./helpers/helpers"; import { check } from "./helpers/check.js"; /** * @function clip * @summary Clip a geometry with another * @description Based on `geos.GEOSIntersection() and geos.GEOSDifference()`. * @async * @param {object|array} data - data to be clipped. A GeoJSON FeatureCollection, an array of features, an array of geometries, a single feature or a single geometry. * @param {object} options - Optional parameters * @param {object|array} [options.clip] - Clip. A GeoJSON FeatureCollection, an array of features, an array of geometries, a single feature or a single geometry. * @param {boolean} [options.reverse = fase] - Use true to use `geos.GEOSDifference()` operator instead of `geos.GEOSIntersection()`. * @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.clip(*a geojson*, { clip: *another geojson* }) */ export async function clip(data, { clip, reverse = false } = {}) { if (clip) { const geos = await geosloader(); const handle = check(data); let x = handle.import(data); const geosClip = geos.GEOSUnaryUnion( geojsonToGeosGeom(check(clip).import(clip), geos) ); let result = []; x.features.forEach((d) => { const geosGeom = geojsonToGeosGeom(d, geos); const newGeom = reverse == true ? geos.GEOSDifference(geosGeom, geosClip) : geos.GEOSIntersection(geosGeom, geosClip); const geom = geosGeomToGeojson(newGeom, geos); if (!isemptygeom(geom)) { result.push({ type: "Feature", properties: d.properties, geometry: geom, }); } geos.GEOSFree(newGeom); }); geos.GEOSFree(geosClip); const final = { type: "FeatureCollection", name: "clip", features: result, }; final.name = "clip"; return handle.export(final); } else { return data; } }