osm2geojson-ultra
Version:
a faster & more complete OSM & Overpass (either in xml or in json formats) to geojson convertor - 4x faster than xmldom + osmtogeojson in most situations - implemented in TypeScript with txml for XML parsing
60 lines (59 loc) • 1.6 kB
JavaScript
import { RefElements } from "./ref-elements.js";
import analyzeFeaturesFromJson from "./json.js";
import analyzeFeaturesFromXml from "./xml.js";
function parseOptions(options) {
if (!options) {
return { elementId: undefined };
}
let elementId = options.elementId;
return { elementId };
}
function detectFormat(o) {
if (o.elements) {
return "json";
}
if (o.indexOf("<osm") >= 0) {
return "xml";
}
if (o.trim().startsWith("{")) {
return "json-raw";
}
return "invalid";
}
function osm2geojson(osm, opts) {
var _a;
let { elementId } = parseOptions(opts);
let format = detectFormat(osm);
const refElements = new RefElements();
if (format === "json-raw") {
osm = JSON.parse(osm);
if (osm.elements) {
format = "json";
}
else {
format = "invalid";
}
}
if (format === "json") {
analyzeFeaturesFromJson(osm, refElements);
}
else if (format === "xml") {
analyzeFeaturesFromXml(osm, refElements);
}
refElements.bindAll();
if (elementId) {
return (_a = refElements.get(elementId)) === null || _a === void 0 ? void 0 : _a.toFeature();
}
let featureArray = [];
for (const v of refElements.values()) {
if (v.refCount > 0 && !v.hasTag) {
continue;
}
const feature = v.toFeature();
if (feature) {
featureArray.push(feature);
}
}
return { type: "FeatureCollection", features: featureArray };
}
export default osm2geojson;