in modules/editor/src/lib/importer.ts [103:192]
function parseImportString(data: string): Promise<ImportData> {
data = data.trim();
let validData: ValidImportData | null | undefined;
const validationErrors: string[] = [];
if (shouldTryGeoJson(data)) {
// Parse as GeoJSON
try {
const parsed = JSON.parse(data);
validData = {
valid: true,
type: 'GeoJSON',
features: getCleanedFeatures(parsed),
};
} catch (err) {
validationErrors.push('Error parsing GeoJSON');
validationErrors.push(err.toString());
}
} else if (shouldTryKml(data)) {
// Parse as KML
const xml = new DOMParser().parseFromString(data, 'text/xml');
try {
const parsed = kml(xml);
/*
TODO: Revisit using loaders.gl/kml for this later
const parsed_ = parseSync(data, KMLasGeoJsonLoader);
// This is changing the coordinates to floats, because in loaders.gl/kml 2.1.1 they are returned as strings.
const parsed = {
...parsed_,
features: parsed_.features.map(f => ({
...f,
geometry: {
...f.geometry,
coordinates: f.geometry.coordinates.map(coords => coords.map(triple => triple.map(s => Number.parseFloat(s))))
}
}))
};
*/
const isFeature = parsed && parsed.type === 'Feature';
const isFeatureCollectionWithFeatures =
parsed && parsed.type === 'FeatureCollection' && parsed.features.length > 0;
const isValid = isFeature || isFeatureCollectionWithFeatures;
if (isValid) {
validData = {
valid: true,
type: 'KML',
features: getCleanedFeatures(parsed),
};
} else {
validationErrors.push('Invalid KML');
}
} catch (err) {
validationErrors.push('Error parsing KML');
validationErrors.push(err.toString());
}
} else if (shouldTryWkt(data)) {
try {
const parsed = parseSync(data, WKTLoader);
if (parsed) {
validData = {
valid: true,
type: 'WKT',
features: [
{
type: 'Feature',
properties: {},
geometry: parsed,
},
],
};
} else {
validationErrors.push('Invalid WKT');
}
} catch (err) {
validationErrors.push('Error parsing WKT');
validationErrors.push(err.toString());
}
} else {
validationErrors.push('Unknown data format');
}
if (validData) {
return Promise.resolve(validData);
}
return Promise.resolve({
valid: false,
validationErrors,
});
}