forked from MapComplete/MapComplete
		
	Further stabilization of wikipedia box
This commit is contained in:
		
							parent
							
								
									393d5d8932
								
							
						
					
					
						commit
						a89d303ecd
					
				
					 15 changed files with 169 additions and 109 deletions
				
			
		| 
						 | 
				
			
			@ -2,9 +2,6 @@
 | 
			
		|||
 * Generates a collection of geojson files based on an overpass query for a given theme
 | 
			
		||||
 */
 | 
			
		||||
import {Utils} from "../Utils";
 | 
			
		||||
 | 
			
		||||
Utils.runningFromConsole = true
 | 
			
		||||
 | 
			
		||||
import {Overpass} from "../Logic/Osm/Overpass";
 | 
			
		||||
import {existsSync, readFileSync, writeFileSync} from "fs";
 | 
			
		||||
import {TagsFilter} from "../Logic/Tags/TagsFilter";
 | 
			
		||||
| 
						 | 
				
			
			@ -22,12 +19,13 @@ import FilteredLayer from "../Models/FilteredLayer";
 | 
			
		|||
import FeatureSource, {FeatureSourceForLayer} from "../Logic/FeatureSource/FeatureSource";
 | 
			
		||||
import StaticFeatureSource from "../Logic/FeatureSource/Sources/StaticFeatureSource";
 | 
			
		||||
import TiledFeatureSource from "../Logic/FeatureSource/TiledFeatureSource/TiledFeatureSource";
 | 
			
		||||
import Constants from "../Models/Constants";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ScriptUtils.fixUtils()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function createOverpassObject(theme: LayoutConfig, relationTracker: RelationsTracker) {
 | 
			
		||||
function createOverpassObject(theme: LayoutConfig, relationTracker: RelationsTracker, backend: string) {
 | 
			
		||||
    let filters: TagsFilter[] = [];
 | 
			
		||||
    let extraScripts: string[] = [];
 | 
			
		||||
    for (const layer of theme.layers) {
 | 
			
		||||
| 
						 | 
				
			
			@ -58,7 +56,7 @@ function createOverpassObject(theme: LayoutConfig, relationTracker: RelationsTra
 | 
			
		|||
    if (filters.length + extraScripts.length === 0) {
 | 
			
		||||
        throw "Nothing to download! The theme doesn't declare anything to download"
 | 
			
		||||
    }
 | 
			
		||||
    return new Overpass(new Or(filters), extraScripts, new UIEventSource<string>("https://overpass.kumi.systems/api/interpreter"), //https://overpass-api.de/api/interpreter"),
 | 
			
		||||
    return new Overpass(new Or(filters), extraScripts, backend,
 | 
			
		||||
        new UIEventSource<number>(60), relationTracker);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -71,7 +69,7 @@ function geoJsonName(targetDir: string, x: number, y: number, z: number): string
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/// Downloads the given feature and saves them to disk
 | 
			
		||||
async function downloadRaw(targetdir: string, r: TileRange, overpass: Overpass)/* : {failed: number, skipped :number} */ {
 | 
			
		||||
async function downloadRaw(targetdir: string, r: TileRange, theme: LayoutConfig, relationTracker: RelationsTracker)/* : {failed: number, skipped :number} */ {
 | 
			
		||||
    let downloaded = 0
 | 
			
		||||
    let failed = 0
 | 
			
		||||
    let skipped = 0
 | 
			
		||||
| 
						 | 
				
			
			@ -93,35 +91,28 @@ async function downloadRaw(targetdir: string, r: TileRange, overpass: Overpass)/
 | 
			
		|||
                east: Math.max(boundsArr[0][1], boundsArr[1][1]),
 | 
			
		||||
                west: Math.min(boundsArr[0][1], boundsArr[1][1])
 | 
			
		||||
            }
 | 
			
		||||
            const overpass = createOverpassObject(theme, relationTracker, Constants.defaultOverpassUrls[(downloaded + failed) % Constants.defaultOverpassUrls.length])
 | 
			
		||||
            const url = overpass.buildQuery("[bbox:" + bounds.south + "," + bounds.west + "," + bounds.north + "," + bounds.east + "]")
 | 
			
		||||
 | 
			
		||||
            await ScriptUtils.DownloadJSON(url)
 | 
			
		||||
                .then(json => {
 | 
			
		||||
                        if (json.elements.length === 0) {
 | 
			
		||||
                            console.log("Got an empty response!")
 | 
			
		||||
                            if ((<string>json.remark ?? "").startsWith("runtime error")) {
 | 
			
		||||
                                console.error("Got a runtime error: ", json.remark)
 | 
			
		||||
                                failed++;
 | 
			
		||||
                                return
 | 
			
		||||
                            }
 | 
			
		||||
            try {
 | 
			
		||||
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                        console.log("Got the response - writing to ", filename)
 | 
			
		||||
                        writeFileSync(filename, JSON.stringify(json, null, "  "));
 | 
			
		||||
                const json = await ScriptUtils.DownloadJSON(url)
 | 
			
		||||
                if (json.elements.length === 0) {
 | 
			
		||||
                    console.log("Got an empty response!")
 | 
			
		||||
                    if ((<string>json.remark ?? "").startsWith("runtime error")) {
 | 
			
		||||
                        console.error("Got a runtime error: ", json.remark)
 | 
			
		||||
                        failed++;
 | 
			
		||||
                    }
 | 
			
		||||
                )
 | 
			
		||||
                .catch(err => {
 | 
			
		||||
                    console.log(url)
 | 
			
		||||
                    console.log("Could not download - probably hit the rate limit; waiting a bit. (" + err + ")")
 | 
			
		||||
                    failed++;
 | 
			
		||||
                    return ScriptUtils.sleep(60000).then(() => console.log("Waiting is done"))
 | 
			
		||||
                })
 | 
			
		||||
 | 
			
		||||
            if (x < r.xend || y < r.yend) {
 | 
			
		||||
                console.debug("Cooling down 10s")
 | 
			
		||||
                await ScriptUtils.sleep(10000)
 | 
			
		||||
                } else {
 | 
			
		||||
                    console.log("Got the response - writing to ", filename)
 | 
			
		||||
                    writeFileSync(filename, JSON.stringify(json, null, "  "));
 | 
			
		||||
                }
 | 
			
		||||
            } catch (err) {
 | 
			
		||||
                console.log(url)
 | 
			
		||||
                console.log("Could not download - probably hit the rate limit; waiting a bit. (" + err + ")")
 | 
			
		||||
                failed++;
 | 
			
		||||
                await ScriptUtils.sleep(1000)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -291,11 +282,10 @@ async function main(args: string[]) {
 | 
			
		|||
        return
 | 
			
		||||
    }
 | 
			
		||||
    const relationTracker = new RelationsTracker()
 | 
			
		||||
    const overpass = createOverpassObject(theme, relationTracker)
 | 
			
		||||
 | 
			
		||||
    let failed = 0;
 | 
			
		||||
    do {
 | 
			
		||||
        const cachingResult = await downloadRaw(targetdir, tileRange, overpass)
 | 
			
		||||
        const cachingResult = await downloadRaw(targetdir, tileRange, theme, relationTracker)
 | 
			
		||||
        failed = cachingResult.failed
 | 
			
		||||
        if (failed > 0) {
 | 
			
		||||
            await ScriptUtils.sleep(30000)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue