forked from MapComplete/MapComplete
Add possibility to use a cutom overpass script, add 'grassfields in parks'-layer
This commit is contained in:
parent
0d51015cc8
commit
f659bc1141
40 changed files with 499 additions and 222 deletions
|
@ -5,6 +5,7 @@ import LayoutConfig from "../../Customizations/JSON/LayoutConfig";
|
|||
import {Overpass} from "../Osm/Overpass";
|
||||
import Bounds from "../../Models/Bounds";
|
||||
import FeatureSource from "../FeatureSource/FeatureSource";
|
||||
import {Utils} from "../../Utils";
|
||||
|
||||
|
||||
export default class UpdateFromOverpass implements FeatureSource {
|
||||
|
@ -71,11 +72,12 @@ export default class UpdateFromOverpass implements FeatureSource {
|
|||
this.update();
|
||||
}
|
||||
|
||||
private GetFilter() {
|
||||
const filters: TagsFilter[] = [];
|
||||
private GetFilter(): Overpass {
|
||||
let filters: TagsFilter[] = [];
|
||||
let extraScripts: string[] = [];
|
||||
for (const layer of this._layoutToUse.data.layers) {
|
||||
if (typeof (layer) === "string") {
|
||||
continue;
|
||||
throw "A layer was not expanded!"
|
||||
}
|
||||
if (this._location.data.zoom < layer.minzoom) {
|
||||
continue;
|
||||
|
@ -102,20 +104,21 @@ export default class UpdateFromOverpass implements FeatureSource {
|
|||
if (previouslyLoaded) {
|
||||
continue;
|
||||
}
|
||||
filters.push(layer.overpassTags);
|
||||
if (layer.source.overpassScript !== undefined) {
|
||||
extraScripts.push(layer.source.overpassScript)
|
||||
} else {
|
||||
filters.push(layer.source.osmTags);
|
||||
}
|
||||
}
|
||||
if (filters.length === 0) {
|
||||
filters = Utils.NoNull(filters)
|
||||
extraScripts = Utils.NoNull(extraScripts)
|
||||
if (filters.length + extraScripts.length === 0) {
|
||||
return undefined;
|
||||
}
|
||||
return new Or(filters);
|
||||
return new Overpass(new Or(filters), extraScripts);
|
||||
}
|
||||
|
||||
private update(): void {
|
||||
const filter = this.GetFilter();
|
||||
if (filter === undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.runningQuery.data) {
|
||||
console.log("Still running a query, skip");
|
||||
return;
|
||||
|
@ -133,9 +136,12 @@ export default class UpdateFromOverpass implements FeatureSource {
|
|||
|
||||
const z = Math.floor(this._location.data.zoom ?? 0);
|
||||
|
||||
this.runningQuery.setData(true);
|
||||
const self = this;
|
||||
const overpass = new Overpass(filter);
|
||||
const overpass = this.GetFilter();
|
||||
if (overpass === undefined) {
|
||||
return;
|
||||
}
|
||||
this.runningQuery.setData(true);
|
||||
overpass.queryGeoJson(queryBounds,
|
||||
function (data, date) {
|
||||
self._previousBounds.get(z).push(queryBounds);
|
||||
|
@ -165,9 +171,10 @@ export default class UpdateFromOverpass implements FeatureSource {
|
|||
self.timeout.setData(0);
|
||||
self.update()
|
||||
}
|
||||
}, 1000
|
||||
}, 1000
|
||||
)
|
||||
}
|
||||
|
||||
countDown();
|
||||
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ export default class FeatureDuplicatorPerLayer implements FeatureSource {
|
|||
|
||||
let foundALayer = false;
|
||||
for (const layer of layers.data) {
|
||||
if (layer.layerDef.overpassTags.matchesProperties(f.feature.properties)) {
|
||||
if (layer.layerDef.source.osmTags.matchesProperties(f.feature.properties)) {
|
||||
foundALayer = true;
|
||||
if (layer.layerDef.passAllFeatures) {
|
||||
|
||||
|
|
|
@ -9,9 +9,11 @@ import Bounds from "../../Models/Bounds";
|
|||
export class Overpass {
|
||||
private _filter: TagsFilter
|
||||
public static testUrl: string = null
|
||||
private readonly _extraScripts: string[];
|
||||
|
||||
constructor(filter: TagsFilter) {
|
||||
constructor(filter: TagsFilter, extraScripts: string[]) {
|
||||
this._filter = filter
|
||||
this._extraScripts = extraScripts;
|
||||
}
|
||||
|
||||
|
||||
|
@ -21,6 +23,9 @@ export class Overpass {
|
|||
for (const filterOr of filters) {
|
||||
filter += 'nwr' + filterOr + ';'
|
||||
}
|
||||
for (const extraScript of this._extraScripts){
|
||||
filter += '('+extraScript+');';
|
||||
}
|
||||
const query =
|
||||
'[out:json][timeout:25]' + bbox + ';(' + filter + ');out body;>;out skel qt;'
|
||||
return "https://overpass-api.de/api/interpreter?data=" + encodeURIComponent(query)
|
||||
|
@ -48,6 +53,7 @@ export class Overpass {
|
|||
}
|
||||
// @ts-ignore
|
||||
const geojson = OsmToGeoJson.default(json);
|
||||
console.log("Received geojson", geojson)
|
||||
const osmTime = new Date(json.osm3s.timestamp_osm_base);
|
||||
continuation(geojson, osmTime);
|
||||
}).fail(onFail)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue