Download needed relations completely, fixes 873

This commit is contained in:
Pieter Vander Vennet 2022-06-24 18:12:39 +02:00
parent 732d4621ae
commit 4fd40c6935
6 changed files with 418 additions and 88 deletions

View file

@ -1,8 +1,8 @@
import {Utils} from "../../Utils";
import * as polygon_features from "../../assets/polygon-features.json";
import {Store, Stores, UIEventSource} from "../UIEventSource";
import {Store, UIEventSource} from "../UIEventSource";
import {BBox} from "../BBox";
import * as OsmToGeoJson from "osmtogeojson";
export abstract class OsmObject {
@ -38,6 +38,7 @@ export abstract class OsmObject {
throw "Backend URL must begin with http"
}
this.backendURL = url;
this.DownloadObject("id/5")
}
public static DownloadObject(id: string, forceRefresh: boolean = false): Store<OsmObject> {
@ -77,10 +78,10 @@ export abstract class OsmObject {
return undefined;
}
const full = (id.startsWith("way")) ? "/full" : "";
const full = (!id.startsWith("node")) ? "/full" : "";
const url = `${OsmObject.backendURL}api/0.6/${id}${full}`;
const rawData = await Utils.downloadJsonCached(url, 1000)
if(rawData === undefined){
const rawData = await Utils.downloadJsonCached(url, 10000)
if (rawData === undefined) {
return undefined
}
// A full query might contain more then just the requested object (e.g. nodes that are part of a way, where we only want the way)
@ -127,7 +128,7 @@ export abstract class OsmObject {
return data.elements.map(wayInfo => {
const rel = new OsmRelation(wayInfo.id)
rel.LoadData(wayInfo)
rel.SaveExtraData(wayInfo)
rel.SaveExtraData(wayInfo, undefined)
return rel
})
}
@ -196,7 +197,13 @@ export abstract class OsmObject {
break;
case("relation"):
osmObject = new OsmRelation(idN);
osmObject.SaveExtraData(element, [])
const allGeojsons = OsmToGeoJson.default({elements},
// @ts-ignore
{
flatProperties: true
});
const feature = allGeojsons.features.find(f => f.id === osmObject.type + "/" + osmObject.id)
osmObject.SaveExtraData(element, feature)
break;
}
@ -218,7 +225,7 @@ export abstract class OsmObject {
if (!tags.hasOwnProperty(tagsKey)) {
continue
}
const polyGuide : { values: Set<string>; blacklist: boolean } = OsmObject.polygonFeatures.get(tagsKey)
const polyGuide: { values: Set<string>; blacklist: boolean } = OsmObject.polygonFeatures.get(tagsKey)
if (polyGuide === undefined) {
continue
}
@ -228,12 +235,12 @@ export abstract class OsmObject {
}
// is the key contained? Then we have a match if the value is contained
const doesMatch = polyGuide.values.has(tags[tagsKey])
if(polyGuide.blacklist){
if (polyGuide.blacklist) {
return !doesMatch
}
return doesMatch
}
return false;
}
@ -260,7 +267,7 @@ export abstract class OsmObject {
public abstract asGeoJson(): any;
abstract SaveExtraData(element: any, allElements: OsmObject[]);
abstract SaveExtraData(element: any, allElements: OsmObject[] | any);
/**
* Generates the changeset-XML for tags
@ -431,7 +438,7 @@ export class OsmWay extends OsmObject {
private isPolygon(): boolean {
// Compare lat and lon seperately, as the coordinate array might not be a reference to the same object
if (this.coordinates[0][0] !== this.coordinates[this.coordinates.length - 1][0] ||
this.coordinates[0][1] !== this.coordinates[this.coordinates.length - 1][1] ) {
this.coordinates[0][1] !== this.coordinates[this.coordinates.length - 1][1]) {
return false; // Not closed
}
return OsmObject.isPolygon(this.tags)
@ -447,6 +454,8 @@ export class OsmRelation extends OsmObject {
role: string
}[];
private geojson = undefined
constructor(id: number) {
super("relation", id);
}
@ -472,11 +481,15 @@ ${members}${tags} </relation>
}
SaveExtraData(element) {
SaveExtraData(element, geojson) {
this.members = element.members;
this.geojson = geojson
}
asGeoJson(): any {
if (this.geojson !== undefined) {
return this.geojson;
}
throw "Not Implemented"
}
}