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
96 lines (95 loc) • 3.25 kB
JavaScript
import { purgeProps } from "./utils.js";
import { Node } from "./node.js";
import { Output } from "./output.js";
import { Way } from "./way.js";
import { Relation } from "./relation.js";
export default function analyzeFeaturesFromJson(osm, refElements) {
var _a;
for (const elem of osm.elements) {
// Check for evidence ths is a derived element and process if so
if ((_a = elem.geometry) === null || _a === void 0 ? void 0 : _a.type) {
const obj = new Output(elem.type, elem.id, refElements);
if (elem.tags) {
obj.addTags(elem.tags);
}
obj.addMetas(purgeProps(elem, [
"id",
"type",
"tags",
"geometry",
]));
obj.setGeometry(elem.geometry);
continue;
}
// handle nodes/ways/relations
switch (elem.type) {
case "node":
const node = new Node(elem.id, refElements);
if (elem.tags) {
node.addTags(elem.tags);
}
node.addMetas(purgeProps(elem, [
"id",
"type",
"tags",
"lat",
"lon",
]));
node.setLatLng(elem);
break;
case "way":
const way = new Way(elem.id, refElements);
if (elem.tags) {
way.addTags(elem.tags);
}
way.addMetas(purgeProps(elem, [
"id",
"type",
"tags",
"nodes",
"geometry",
]));
if (elem.geometry) {
way.setLatLngArray(elem.geometry);
}
else if (elem.center) {
way.setCenter(elem.center);
}
else if (elem.nodes) {
for (const n of elem.nodes) {
way.addNodeRef(n);
}
}
break;
case "relation":
const relation = new Relation(elem.id, refElements);
if (elem.bounds) {
relation.setBounds([
parseFloat(elem.bounds.minlon),
parseFloat(elem.bounds.minlat),
parseFloat(elem.bounds.maxlon),
parseFloat(elem.bounds.maxlat),
]);
}
if (elem.tags) {
relation.addTags(elem.tags);
}
if (elem.center) {
relation.setCenter(elem.center);
}
relation.addMetas(purgeProps(elem, [
"id",
"type",
"tags",
"bounds",
"members",
]));
if (elem.members) {
for (const member of elem.members) {
relation.addMember(member);
}
}
break;
}
}
}