forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			77 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
	
		
			2.7 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), | ||
|  |                 tags: Utils.MapToObj(tagTotal, v => Utils.MapToObj(v)) | ||
|  |             }, | ||
|  |             null, "  " | ||
|  |         ) | ||
|  |     ) | ||
|  | } | ||
|  | 
 | ||
|  | main().then(() => console.log("All done")) |