forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			81 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import * as known_layers from "../assets/generated/known_layers.json"
 | 
						|
import { LayerConfigJson } from "../Models/ThemeConfig/Json/LayerConfigJson"
 | 
						|
import { TagUtils } from "../Logic/Tags/TagUtils"
 | 
						|
import { Utils } from "../Utils"
 | 
						|
import { writeFileSync } from "fs"
 | 
						|
import ScriptUtils from "./ScriptUtils"
 | 
						|
import Constants from "../Models/Constants"
 | 
						|
 | 
						|
/* Downloads stats on osmSource-tags and keys from tagInfo */
 | 
						|
 | 
						|
async function main(includeTags = true) {
 | 
						|
    ScriptUtils.fixUtils()
 | 
						|
    const layers: LayerConfigJson[] = (known_layers["default"] ?? known_layers).layers
 | 
						|
 | 
						|
    const keysAndTags = new Map<string, Set<string>>()
 | 
						|
 | 
						|
    for (const layer of layers) {
 | 
						|
        if (layer.source["geoJson"] !== undefined && !layer.source["isOsmCache"]) {
 | 
						|
            continue
 | 
						|
        }
 | 
						|
        if (Constants.priviliged_layers.indexOf(layer.id) >= 0) {
 | 
						|
            continue
 | 
						|
        }
 | 
						|
 | 
						|
        const sources = TagUtils.Tag(layer.source.osmTags)
 | 
						|
        const allKeys = sources.usedKeys()
 | 
						|
        for (const key of allKeys) {
 | 
						|
            if (!keysAndTags.has(key)) {
 | 
						|
                keysAndTags.set(key, new Set<string>())
 | 
						|
            }
 | 
						|
        }
 | 
						|
        const allTags = includeTags ? sources.usedTags() : []
 | 
						|
        for (const tag of allTags) {
 | 
						|
            if (!keysAndTags.has(tag.key)) {
 | 
						|
                keysAndTags.set(tag.key, new Set<string>())
 | 
						|
            }
 | 
						|
            keysAndTags.get(tag.key).add(tag.value)
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    const keyTotal = new Map<string, number>()
 | 
						|
    const tagTotal = new Map<string, Map<string, number>>()
 | 
						|
    await Promise.all(
 | 
						|
        Array.from(keysAndTags.keys()).map(async (key) => {
 | 
						|
            const values = keysAndTags.get(key)
 | 
						|
            const data = await Utils.downloadJson(
 | 
						|
                `https://taginfo.openstreetmap.org/api/4/key/stats?key=${key}`
 | 
						|
            )
 | 
						|
            const count = data.data.find((item) => item.type === "all").count
 | 
						|
            keyTotal.set(key, count)
 | 
						|
            console.log(key, "-->", count)
 | 
						|
 | 
						|
            if (values.size > 0) {
 | 
						|
                tagTotal.set(key, new Map<string, number>())
 | 
						|
                await Promise.all(
 | 
						|
                    Array.from(values).map(async (value) => {
 | 
						|
                        const tagData = await Utils.downloadJson(
 | 
						|
                            `https://taginfo.openstreetmap.org/api/4/tag/stats?key=${key}&value=${value}`
 | 
						|
                        )
 | 
						|
                        const count = tagData.data.find((item) => item.type === "all").count
 | 
						|
                        tagTotal.get(key).set(value, count)
 | 
						|
                        console.log(key + "=" + value, "-->", count)
 | 
						|
                    })
 | 
						|
                )
 | 
						|
            }
 | 
						|
        })
 | 
						|
    )
 | 
						|
    writeFileSync(
 | 
						|
        "./assets/key_totals.json",
 | 
						|
        JSON.stringify(
 | 
						|
            {
 | 
						|
                keys: Utils.MapToObj(keyTotal, (t) => t),
 | 
						|
                tags: Utils.MapToObj(tagTotal, (v) => Utils.MapToObj(v, (t) => t)),
 | 
						|
            },
 | 
						|
            null,
 | 
						|
            "  "
 | 
						|
        )
 | 
						|
    )
 | 
						|
}
 | 
						|
 | 
						|
main().then(() => console.log("All done"))
 |