forked from MapComplete/MapComplete
		
	Cleanup of NSI feature breanch
This commit is contained in:
		
							parent
							
								
									f6d93a6ab1
								
							
						
					
					
						commit
						3146fa0d26
					
				
					 14 changed files with 143 additions and 537 deletions
				
			
		|  | @ -58,6 +58,10 @@ export interface NSIItem { | |||
| export default class NameSuggestionIndex { | ||||
| 
 | ||||
|     private static readonly nsiFile: Readonly<NSIFile> = <any>nsi | ||||
|     private static readonly nsiWdFile: Readonly<Record<string, { | ||||
|         logos: { wikidata?: string, facebook?: string } | ||||
|     }>> = <any>nsiWD["wikidata"] | ||||
| 
 | ||||
|     private static loco = new LocationConflation(nsiFeatures) // Some additional boundaries
 | ||||
| 
 | ||||
|     private static _supportedTypes: string[] | ||||
|  | @ -68,7 +72,12 @@ export default class NameSuggestionIndex { | |||
|         } | ||||
|         const keys = Object.keys(NameSuggestionIndex.nsiFile.nsi) | ||||
|         const all = keys.map(k => NameSuggestionIndex.nsiFile.nsi[k].properties.path.split("/")[0]) | ||||
|         this._supportedTypes = Utils.Dedup(all) | ||||
|         this._supportedTypes = Utils.Dedup(all).map(s => { | ||||
|             if(s.endsWith("s")){ | ||||
|                 s = s.substring(0, s.length - 1) | ||||
|             } | ||||
|             return s | ||||
|         }) | ||||
|         return this._supportedTypes | ||||
|     } | ||||
| 
 | ||||
|  | @ -82,7 +91,6 @@ export default class NameSuggestionIndex { | |||
|     private static async fetchFrequenciesFor(type: string, countries: string[]) { | ||||
|         let stats = await Promise.all(countries.map(c => { | ||||
|             try { | ||||
| 
 | ||||
|                 return Utils.downloadJsonCached<Record<string, number>>(`./assets/data/nsi/stats/${type}.${c.toUpperCase()}.json`, 24 * 60 * 60 * 1000) | ||||
|             } catch (e) { | ||||
|                 console.error("Could not fetch " + type + " statistics due to", e) | ||||
|  | @ -93,6 +101,9 @@ export default class NameSuggestionIndex { | |||
|         if (stats.length === 1) { | ||||
|             return stats[0] | ||||
|         } | ||||
|         if(stats.length === 0){ | ||||
|             return {} | ||||
|         } | ||||
|         const merged = stats[0] | ||||
|         for (let i = 1; i < stats.length; i++) { | ||||
|             for (const countryCode in stats[i]) { | ||||
|  | @ -103,10 +114,7 @@ export default class NameSuggestionIndex { | |||
|     } | ||||
| 
 | ||||
|     public static isSvg(nsiItem: NSIItem, type: string): boolean | undefined { | ||||
|         const logos = nsiWD["wikidata"][nsiItem?.tags?.[type + ":wikidata"]]?.logos | ||||
|         if(nsiItem.id === "axa-2f6feb"){ | ||||
|             console.trace(">>> HI") | ||||
|         } | ||||
|         const logos = this.nsiWdFile[nsiItem?.tags?.[type + ":wikidata"]]?.logos | ||||
|         if (!logos) { | ||||
|             return undefined | ||||
|         } | ||||
|  | @ -120,37 +128,45 @@ export default class NameSuggestionIndex { | |||
|         return false | ||||
|     } | ||||
| 
 | ||||
|     public static async generateMappings(type: string, key: string, value: string, country: string[], location?: [number, number]) { | ||||
|     public static async generateMappings(type: string, tags: Record<string, string>, country: string[], location?: [number, number]): Promise<Mapping[]> { | ||||
|         const mappings: Mapping[] = [] | ||||
|         const frequencies = await NameSuggestionIndex.fetchFrequenciesFor(type, country) | ||||
|         const actualBrands = NameSuggestionIndex.getSuggestionsFor(type, key, value, country.join(";"), location) | ||||
|         for (const nsiItem of actualBrands) { | ||||
|             const tags = nsiItem.tags | ||||
|             const frequency = frequencies[nsiItem.displayName] | ||||
|             const logos = nsiWD["wikidata"][nsiItem.tags[type + ":wikidata"]]?.logos | ||||
|             let iconUrl = logos?.facebook ?? logos?.wikidata | ||||
|             const hasIcon = iconUrl !== undefined | ||||
|             let icon = undefined | ||||
|             if (hasIcon) { | ||||
|                 // Using <img src=...> works fine without an extension for JPG and PNG, but _not_ svg :(
 | ||||
|                 icon = "./assets/data/nsi/logos/" + nsiItem.id | ||||
|                 if (NameSuggestionIndex.isSvg(nsiItem, type)) { | ||||
|                     console.log("Is svg:", nsiItem.displayName) | ||||
|                     icon = icon + ".svg" | ||||
|                 } | ||||
|         for (const key in tags) { | ||||
|             if (key.startsWith("_")) { | ||||
|                 continue | ||||
|             } | ||||
|             const value = tags[key] | ||||
|             const actualBrands = NameSuggestionIndex.getSuggestionsForKV(type, key, value, country.join(";"), location) | ||||
|             if(!actualBrands){ | ||||
|                 continue | ||||
|             } | ||||
|             for (const nsiItem of actualBrands) { | ||||
|                 const tags = nsiItem.tags | ||||
|                 const frequency = frequencies[nsiItem.displayName] | ||||
|                 const logos = this.nsiWdFile[nsiItem.tags[type + ":wikidata"]]?.logos | ||||
|                 const iconUrl = logos?.facebook ?? logos?.wikidata | ||||
|                 const hasIcon = iconUrl !== undefined | ||||
|                 let icon = undefined | ||||
|                 if (hasIcon) { | ||||
|                     // Using <img src=...> works fine without an extension for JPG and PNG, but _not_ svg :(
 | ||||
|                     icon = "./assets/data/nsi/logos/" + nsiItem.id | ||||
|                     if (NameSuggestionIndex.isSvg(nsiItem, type)) { | ||||
|                         icon = icon + ".svg" | ||||
|                     } | ||||
|                 } | ||||
|                 mappings.push({ | ||||
|                     if: new Tag(type, tags[type]), | ||||
|                     addExtraTags: Object.keys(tags).filter(k => k !== type).map(k => new Tag(k, tags[k])), | ||||
|                     then: new TypedTranslation<Record<string, never>>({ "*": nsiItem.displayName }), | ||||
|                     hideInAnswer: false, | ||||
|                     ifnot: undefined, | ||||
|                     alsoShowIf: undefined, | ||||
|                     icon, | ||||
|                     iconClass: "medium", | ||||
|                     priorityIf: frequency > 0 ? new RegexTag("id", /.*/) : undefined, | ||||
|                     searchTerms: { "*": [nsiItem.displayName, nsiItem.id] } | ||||
|                 }) | ||||
|             } | ||||
|             mappings.push({ | ||||
|                 if: new Tag(type, tags[type]), | ||||
|                 addExtraTags: Object.keys(tags).filter(k => k !== type).map(k => new Tag(k, tags[k])), | ||||
|                 then: new TypedTranslation<{}>({ "*": nsiItem.displayName }), | ||||
|                 hideInAnswer: false, | ||||
|                 ifnot: undefined, | ||||
|                 alsoShowIf: undefined, | ||||
|                 icon, | ||||
|                 iconClass: "medium", | ||||
|                 priorityIf: frequency > 0 ? new RegexTag("id", /.*/) : undefined, | ||||
|                 searchTerms: { "*": [nsiItem.displayName, nsiItem.id] } | ||||
|             }) | ||||
|         } | ||||
|         return mappings | ||||
|     } | ||||
|  | @ -184,7 +200,7 @@ export default class NameSuggestionIndex { | |||
|         for (const osmKey in tags) { | ||||
|             const values = tags[osmKey] | ||||
|             for (const osmValue of values) { | ||||
|                 const suggestions = this.getSuggestionsFor(type, osmKey, osmValue) | ||||
|                 const suggestions = this.getSuggestionsForKV(type, osmKey, osmValue) | ||||
|                 options.push(...suggestions) | ||||
|             } | ||||
|         } | ||||
|  | @ -193,11 +209,19 @@ export default class NameSuggestionIndex { | |||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      * @param path | ||||
|      * @param country: a string containing one or more country codes, separated by ";" | ||||
|      * @param location: center point of the feature, should be [lon, lat] | ||||
|      */ | ||||
|     public static getSuggestionsFor(type: string, key: string, value: string, country: string = undefined, location: [number, number] = undefined): NSIItem[] { | ||||
|     public static getSuggestionsFor(type: string, tags: {key: string, value: string}[], country: string = undefined, location: [number, number] = undefined): NSIItem[] { | ||||
|         return tags.flatMap(tag => this.getSuggestionsForKV(type, tag.key, tag.value, country, location)) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * | ||||
|      * @param country: a string containing one or more country codes, separated by ";" | ||||
|      * @param location: center point of the feature, should be [lon, lat] | ||||
|      */ | ||||
|     public static getSuggestionsForKV(type: string, key: string, value: string, country: string = undefined, location: [number, number] = undefined): NSIItem[] { | ||||
|         const path = `${type}s/${key}/${value}` | ||||
|         const entry = NameSuggestionIndex.nsiFile.nsi[path] | ||||
|         return entry?.items?.filter(i => { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue