import { gpx, kml } from '@tmcw/togeojson/dist/togeojson.es.js'; import { generateId } from '../shared/mapbox/utils'; export function readGeoFile(file) { const isGpxFile = file.name.includes('.gpx'); const reader = new FileReader(); return new Promise((resolve) => { reader.onload = (event) => { const xml = new DOMParser().parseFromString( event.target.result, 'text/xml' ); const featureCollection = normalizeFeatureCollection( isGpxFile ? gpx(xml) : kml(xml), file.name ); resolve(featureCollection); }; reader.readAsText(file, 'UTF-8'); }); } function normalizeFeatureCollection(featureCollection, filename) { const features = []; for (const feature of featureCollection.features) { switch (feature.geometry.type) { case 'MultiPoint': for (const coordinates of feature.geometry.coordinates) { features.push({ type: 'Feature', geometry: { type: 'Point', coordinates }, properties: feature.properties }); } break; case 'MultiLineString': for (const coordinates of feature.geometry.coordinates) { features.push({ type: 'Feature', geometry: { type: 'LineString', coordinates }, properties: feature.properties }); } break; case 'MultiPolygon': for (const coordinates of feature.geometry.coordinates) { features.push({ type: 'Feature', geometry: { type: 'Polygon', coordinates }, properties: feature.properties }); } break; case 'GeometryCollection': for (const geometry of feature.geometry.geometries) { features.push({ type: 'Feature', geometry, properties: feature.properties }); } break; default: features.push(feature); } } featureCollection.filename = `${generateId()}-${filename}`; featureCollection.features = features.map((feature) => ({ ...feature, properties: { ...feature.properties, filename: featureCollection.filename } })); return featureCollection; }