forked from MapComplete/MapComplete
		
	Add image license analysis
This commit is contained in:
		
							parent
							
								
									33094653e5
								
							
						
					
					
						commit
						b330ae900c
					
				
					 2 changed files with 189 additions and 9 deletions
				
			
		|  | @ -23,7 +23,7 @@ export default class GenerateImageAnalysis extends Script { | |||
|             console.log("Skipping", key) | ||||
|             return | ||||
|         } | ||||
|         const tag = new RegexTag("image", /https:\/\/i.imgur.com\/.*/i) | ||||
|         const tag = new RegexTag(key, /^https:\/\/i.imgur.com\/.*$/i) | ||||
|         const overpass = new Overpass( | ||||
|             tag, | ||||
|             [], | ||||
|  | @ -45,6 +45,7 @@ export default class GenerateImageAnalysis extends Script { | |||
|         } | ||||
| 
 | ||||
|         await this.fetchImages("image", datapath) | ||||
|         await this.fetchImages("image:streetsign", datapath) | ||||
|         for (let i = 0; i < 5; i++) { | ||||
|             await this.fetchImages("image:" + i, datapath) | ||||
|         } | ||||
|  | @ -69,8 +70,7 @@ export default class GenerateImageAnalysis extends Script { | |||
|         if (image === undefined) { | ||||
|             return false | ||||
|         } | ||||
|         if (image.endsWith(".png") || image.endsWith(".jpeg")) { | ||||
|             console.log("Skipped invalid image") | ||||
|         if (!image.match(/https:\/\/i\.imgur\.com\/[a-zA-Z0-9]+\.jpg/)) { | ||||
|             return false | ||||
|         } | ||||
|         const targetPath = datapath + "/" + image.replace(/[\/:.\-%]/g, "_") + ".json" | ||||
|  | @ -113,7 +113,7 @@ export default class GenerateImageAnalysis extends Script { | |||
|                 } downloaded: ${d},skipped: ${s}, failed: ${f}, running: ${runningSecs}sec, ETA: ${estimatedActualMinutes}:${ | ||||
|                     estimatedActualSeconds % 60 | ||||
|                 }` | ||||
|                 console.log(msg) | ||||
|                 ScriptUtils.erasableLog(msg) | ||||
|                 if (downloaded) { | ||||
|                     d++ | ||||
|                 } else { | ||||
|  | @ -139,13 +139,16 @@ export default class GenerateImageAnalysis extends Script { | |||
|                 continue | ||||
|             } | ||||
|             const attr = <LicenseInfo>JSON.parse(fs.readFileSync(file, "UTF8")) | ||||
|             const license = attr.licenseShortName | ||||
| 
 | ||||
|             if (license === undefined || attr.artist === undefined) { | ||||
|                 continue | ||||
|             } | ||||
|             if (byAuthor.get(attr.artist) === undefined) { | ||||
|                 byAuthor.set(attr.artist, []) | ||||
|             } | ||||
|             byAuthor.get(attr.artist).push(file) | ||||
| 
 | ||||
|             const license = attr.licenseShortName | ||||
|             if (byLicense.get(license) === undefined) { | ||||
|                 byLicense.set(license, []) | ||||
|             } | ||||
|  | @ -163,9 +166,34 @@ export default class GenerateImageAnalysis extends Script { | |||
|         const byLicenseCount = Utils.MapToObj(byLicense, (a) => a.length) | ||||
|         const byAuthorCount = Utils.MapToObj(byAuthor, (a) => a.length) | ||||
|         const licenseByAuthorCount = Utils.MapToObj(licenseByAuthor, (a) => a.size) | ||||
|         console.log(byAuthorCount) | ||||
|         console.log(byLicenseCount) | ||||
|         console.log(licenseByAuthorCount) | ||||
| 
 | ||||
|         const countsPerAuthor: number[] = Array.from(Object.keys(byAuthorCount)).map( | ||||
|             (k) => byAuthorCount[k] | ||||
|         ) | ||||
|         console.log(countsPerAuthor) | ||||
|         countsPerAuthor.sort() | ||||
|         const median = countsPerAuthor[Math.floor(countsPerAuthor.length / 2)] | ||||
|         for (let i = 0; i < 100; i++) { | ||||
|             let maxAuthor: string = undefined | ||||
|             let maxCount = 0 | ||||
|             for (const author in byAuthorCount) { | ||||
|                 const count = byAuthorCount[author] | ||||
|                 if (maxAuthor === undefined || count > maxCount) { | ||||
|                     maxAuthor = author | ||||
|                     maxCount = count | ||||
|                 } | ||||
|             } | ||||
|             console.log( | ||||
|                 "|", | ||||
|                 i + 1, | ||||
|                 "|", | ||||
|                 `[${maxAuthor}](https://openstreetmap.org/user/${maxAuthor.replace(/ /g, "%20")})`, | ||||
|                 "|", | ||||
|                 maxCount, | ||||
|                 "|" | ||||
|             ) | ||||
|             delete byAuthorCount[maxAuthor] | ||||
|         } | ||||
| 
 | ||||
|         const totalAuthors = byAuthor.size | ||||
|         let totalLicensedImages = 0 | ||||
|  | @ -183,13 +211,26 @@ export default class GenerateImageAnalysis extends Script { | |||
|                 }%), ${Math.floor(total / authors)} images/author` | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         const nonDefaultAuthors = [ | ||||
|             ...Array.from(licenseByAuthor.get("CC-BY 4.0").values()), | ||||
|             ...Array.from(licenseByAuthor.get("CC-BY-SA 4.0").values()), | ||||
|         ] | ||||
| 
 | ||||
|         console.log("Total number of correctly licenses pictures: ", totalLicensedImages) | ||||
|         console.log("Total number of authors:", byAuthor.size) | ||||
|         console.log( | ||||
|             "Total number of authors which used a valid, non CC0 license at one point in time", | ||||
|             nonDefaultAuthors.length | ||||
|         ) | ||||
|         console.log("Median contributions per author:", median) | ||||
|     } | ||||
| 
 | ||||
|     async main(args: string[]): Promise<void> { | ||||
|         const datapath = args[0] ?? "../MapComplete-data/ImageLicenseInfo" | ||||
|         await this.downloadData(datapath) | ||||
| 
 | ||||
|         await this.downloadMetadata(datapath) | ||||
|         //await this.downloadMetadata(datapath)
 | ||||
|         this.analyze(datapath) | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue