From bd03a5a76ae6fc8fc7f44abe9dd847d5c06c0e87 Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Sat, 21 May 2022 01:02:03 +0200 Subject: [PATCH] Various fixes for bot --- Customizations/AllKnownLayouts.ts | 58 ++++++++++++++++------------- Logic/Osm/Geocoding.ts | 3 +- Logic/Osm/Overpass.ts | 62 +++++++++++++++++++++++++------ 3 files changed, 84 insertions(+), 39 deletions(-) diff --git a/Customizations/AllKnownLayouts.ts b/Customizations/AllKnownLayouts.ts index e93ae4a06..037176e90 100644 --- a/Customizations/AllKnownLayouts.ts +++ b/Customizations/AllKnownLayouts.ts @@ -17,33 +17,39 @@ export class AllKnownLayouts { // Must be below the list... private static sharedLayers: Map = AllKnownLayouts.getSharedLayers(); - public static AllPublicLayers() { + public static AllPublicLayers(options?: { + includeInlineLayers:true | boolean + }) { const allLayers: LayerConfig[] = [] const seendIds = new Set() AllKnownLayouts.sharedLayers.forEach((layer, key) => { seendIds.add(key) allLayers.push(layer) }) - - const publicLayouts = AllKnownLayouts.layoutsList.filter(l => !l.hideFromOverview) - for (const layout of publicLayouts) { - if (layout.hideFromOverview) { - continue - } - for (const layer of layout.layers) { - if (seendIds.has(layer.id)) { + if (options?.includeInlineLayers ?? true) { + const publicLayouts = AllKnownLayouts.layoutsList.filter(l => !l.hideFromOverview) + for (const layout of publicLayouts) { + if (layout.hideFromOverview) { continue } - seendIds.add(layer.id) - allLayers.push(layer) - } + for (const layer of layout.layers) { + if (seendIds.has(layer.id)) { + continue + } + seendIds.add(layer.id) + allLayers.push(layer) + } + } } - - + return allLayers } + public static themesUsingLayer(id: string, publicOnly = true): LayoutConfig[] { + return AllKnownLayouts.layoutsList.filter(l => !(publicOnly && l.hideFromOverview) && l.id !== "personal" && l.layers.some(layer => layer.id === id)) + } + /** * Generates documentation for the layers. * Inline layers are included (if the theme is public) @@ -70,7 +76,7 @@ export class AllKnownLayouts { if (builtinLayerIds.has(layer.id)) { continue } - if(layer.source.geojsonSource !== undefined){ + if (layer.source.geojsonSource !== undefined) { // Not an OSM-source continue } @@ -184,6 +190,17 @@ export class AllKnownLayouts { } + public static GenerateDocumentationForTheme(theme: LayoutConfig): BaseUIElement { + return new Combine([ + new Title(new Combine([theme.title, "(", theme.id + ")"]), 2), + theme.description, + "This theme contains the following layers:", + new List(theme.layers.map(l => l.id)), + "Available languages:", + new List(theme.language) + ]) + } + private static getSharedLayers(): Map { const sharedLayers = new Map(); for (const layer of known_themes.layers) { @@ -229,16 +246,5 @@ export class AllKnownLayouts { } return dict; } - - public static GenerateDocumentationForTheme(theme: LayoutConfig): BaseUIElement{ - return new Combine([ - new Title(new Combine([theme.title, "(",theme.id+")"]), 2), - theme.description, - "This theme contains the following layers:", - new List(theme.layers.map(l => l.id)), - "Available languages:", - new List(theme.language) - ]) - } } diff --git a/Logic/Osm/Geocoding.ts b/Logic/Osm/Geocoding.ts index 7f8749c50..bb6687faa 100644 --- a/Logic/Osm/Geocoding.ts +++ b/Logic/Osm/Geocoding.ts @@ -5,7 +5,8 @@ import {BBox} from "../BBox"; export interface GeoCodeResult { display_name: string, lat: number, lon: number, boundingbox: number[], - osm_type: string, osm_id: string + osm_type: "node" | "way" | "relation", + osm_id: string } export class Geocoding { diff --git a/Logic/Osm/Overpass.ts b/Logic/Osm/Overpass.ts index b2205cb36..d0e6f9c36 100644 --- a/Logic/Osm/Overpass.ts +++ b/Logic/Osm/Overpass.ts @@ -4,6 +4,7 @@ import {Utils} from "../../Utils"; import {UIEventSource} from "../UIEventSource"; import {BBox} from "../BBox"; import * as osmtogeojson from "osmtogeojson"; +import {FeatureCollection} from "@turf/turf"; /** * Interfaces overpass to get all the latest data @@ -34,12 +35,19 @@ export class Overpass { this._relationTracker = relationTracker } - public async queryGeoJson(bounds: BBox): Promise<[any, Date]> { - - let query = this.buildQuery("[bbox:" + bounds.getSouth() + "," + bounds.getWest() + "," + bounds.getNorth() + "," + bounds.getEast() + "]") - + public async queryGeoJson(bounds: BBox, ): Promise<[FeatureCollection, Date]> { + const bbox = "[bbox:" + bounds.getSouth() + "," + bounds.getWest() + "," + bounds.getNorth() + "," + bounds.getEast() + "]"; + const query = this.buildScript(bbox) + return this.ExecuteQuery(query); + } + + public buildUrl(query: string){ + return `${this._interpreterUrl}?data=${encodeURIComponent(query)}` + } + + public async ExecuteQuery(query: string):Promise<[FeatureCollection, Date]> { const self = this; - const json = await Utils.downloadJson(query) + const json = await Utils.downloadJson(this.buildUrl(query)) if (json.elements.length === 0 && json.remark !== undefined) { console.warn("Timeout or other runtime error while querying overpass", json.remark); @@ -52,11 +60,12 @@ export class Overpass { self._relationTracker?.RegisterRelations(json) const geojson = osmtogeojson.default(json); const osmTime = new Date(json.osm3s.timestamp_osm_base); - return [geojson, osmTime]; + return [ geojson, osmTime]; } /** - * Constructs the actual script + * Constructs the actual script to execute on Overpass + * 'PostCall' can be used to set an extra range, see 'AsOverpassTurboLink' * * import {Tag} from "../Tags/Tag"; * @@ -79,12 +88,41 @@ export class Overpass { } return`[out:json][timeout:${this._timeout.data}]${bbox};(${filter});out body;${this._includeMeta ? 'out meta;' : ''}>;out skel qt;` } - - public buildQuery(bbox: string): string { - const query = this.buildScript(bbox) - return `${this._interpreterUrl}?data=${encodeURIComponent(query)}` + /** + * Constructs the actual script to execute on Overpass with geocoding + * 'PostCall' can be used to set an extra range, see 'AsOverpassTurboLink' + * + */ + public buildScriptInArea(area: {osm_type: "way" | "relation", osm_id: number}, pretty = false): string { + const filters = this._filter.asOverpass() + let filter = "" + for (const filterOr of filters) { + if(pretty){ + filter += " " + } + filter += 'nwr' + filterOr + '(area.searchArea);' + if(pretty){ + filter+="\n" + } + } + for (const extraScript of this._extraScripts) { + filter += '(' + extraScript + ');'; + } + let id = area.osm_id; + if(area.osm_type === "relation"){ + id += 3600000000 + } + return`[out:json][timeout:${this._timeout.data}]; + area(id:${id})->.searchArea; + (${filter}); + out body;${this._includeMeta ? 'out meta;' : ''}>;out skel qt;` } - + + + public buildQuery(bbox: string) { + return this.buildUrl(this.buildScript(bbox)) + } + /** * Little helper method to quickly open overpass-turbo in the browser */