beartrack-mobile/www/js/borderParser.js

79 lines
2.6 KiB
JavaScript
Raw Permalink Normal View History

2024-06-16 12:12:20 +00:00
function parseOSMData(xmlData) {
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlData, "text/xml");
const ways = xmlDoc.getElementsByTagName("way");
const nodes = xmlDoc.getElementsByTagName("node");
const relations = xmlDoc.getElementsByTagName("relation");
const nodeMap = new Map();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ref
for (let i = 0; i < nodes.length; i++) {
const node = nodes[i];
const id = node.getAttribute("id");
const lat = parseFloat(node.getAttribute("lat"));
const lon = parseFloat(node.getAttribute("lon"));
nodeMap.set(id, [lat, lon]);
}
const wayMap = new Map();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> ways <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ref
for (let i = 0; i < ways.length; i++) {
const way = ways[i];
const nds = way.getElementsByTagName("nd");
const coordinates = [];
for (let k = 0; k < nds.length; k++) {
const ref = nds[k].getAttribute("ref");
if (nodeMap.has(ref)) {
coordinates.push(nodeMap.get(ref));
}
}
wayMap.set(way.getAttribute("id"), coordinates);
}
const parkBoundaries = [];
for (let i = 0; i < relations.length; i++) {
const relation = relations[i];
const tags = relation.getElementsByTagName("tag");
const members = relation.getElementsByTagName("member");
let isParkBoundary = false;
let relationName = '';
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
for (let j = 0; j < tags.length; j++) {
const tag = tags[j];
const key = tag.getAttribute("k");
const value = tag.getAttribute("v");
if (key === "boundary" && value === "national_park") {
isParkBoundary = true;
} else if (key === "name") {
relationName = value;
}
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (isParkBoundary) { // && relationName.includes("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
console.log(relationName);
const coordinates = [];
for (let k = 0; k < members.length; k++) {
const member = members[k];
if (member.getAttribute("type") === "way") {
const ref = member.getAttribute("ref");
if (wayMap.has(ref)) {
coordinates.push(...wayMap.get(ref));
}
}
}
parkBoundaries.push(coordinates);
}
}
return parkBoundaries;
}