forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			117 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import Script from "./Script"
 | |
| import { Overpass } from "../src/Logic/Osm/Overpass"
 | |
| import { Or } from "../src/Logic/Tags/Or"
 | |
| import { RegexTag } from "../src/Logic/Tags/RegexTag"
 | |
| import { Utils } from "../src/Utils"
 | |
| import Constants from "../src/Models/Constants"
 | |
| import { ImmutableStore } from "../src/Logic/UIEventSource"
 | |
| import { BBox } from "../src/Logic/BBox"
 | |
| import ChangeTagAction from "../src/Logic/Osm/Actions/ChangeTagAction"
 | |
| import { Tag } from "../src/Logic/Tags/Tag"
 | |
| import { Panoramax } from "panoramax-js/dist"
 | |
| import { Changes } from "../src/Logic/Osm/Changes"
 | |
| import OsmChangeAction from "../src/Logic/Osm/Actions/OsmChangeAction"
 | |
| import { writeFileSync } from "fs"
 | |
| import { Feature } from "geojson"
 | |
| 
 | |
| class RepairPanoramax extends Script {
 | |
| 
 | |
|     private static readonly europe: Feature  =    {
 | |
|         "type": "Feature",
 | |
|         "properties": {},
 | |
|         "geometry": {
 | |
|             "coordinates": [
 | |
|                 [
 | |
|                     [
 | |
|                         -20.091159690050006,
 | |
|                         25.773375277790038
 | |
|                     ],
 | |
|                     [
 | |
|                         46.12276429398841,
 | |
|                         25.773375277790038
 | |
|                     ],
 | |
|                     [
 | |
|                         46.12276429398841,
 | |
|                         65.41389761819318
 | |
|                     ],
 | |
|                     [
 | |
|                         -20.091159690050006,
 | |
|                         65.41389761819318
 | |
|                     ],
 | |
|                     [
 | |
|                         -20.091159690050006,
 | |
|                         25.773375277790038
 | |
|                     ]
 | |
|                 ]
 | |
|             ],
 | |
|             "type": "Polygon"
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     constructor() {
 | |
|         super("See https://source.mapcomplete.org/MapComplete/MapComplete/issues/2372\n" +
 | |
|             "We accidentally added the full image URL instead of the hash due to a bug. This scripts rewrites all")
 | |
|     }
 | |
| 
 | |
|     async main(args: string[]): Promise<void> {
 | |
|         const keys = ["panoramax", ...Utils.TimesT(10, i => "panoramax:" + i)]
 | |
|         const overpass = new Overpass(
 | |
|             new Or(
 | |
|                 keys.map(k => new RegexTag(k, /^https:\/\/panoramax.mapcomplete.org\/.*/))
 | |
|             ),
 | |
|             [],
 | |
|             Constants.defaultOverpassUrls[0],
 | |
|             new ImmutableStore(500)
 | |
|         )
 | |
| 
 | |
|         const [wrongFeatures] = await overpass.queryGeoJson(BBox.global)
 | |
|         const allChanges: OsmChangeAction[] = []
 | |
|         for (const f of wrongFeatures.features) {
 | |
|             for (const key of keys) {
 | |
|                 const v = f.properties[key]
 | |
|                 if (!v) {
 | |
|                     continue
 | |
|                 }
 | |
|                 const pre = "https://panoramax.mapcomplete.org/api/pictures/"
 | |
|                 const pre1 = "https://panoramax.mapcomplete.org/permanent/"
 | |
|                 let correct: string
 | |
|                 if (v.startsWith(pre)) {
 | |
|                     correct = v.substring(pre.length)
 | |
|                     correct = correct.substring(0, correct.indexOf("/"))
 | |
|                 } else if (v.startsWith(pre1)) {
 | |
|                     const stripped = v.substring(pre1.length)
 | |
|                     correct = stripped.replace(/\//g, "").replace(/\.jpg$/, "")
 | |
|                     correct = correct.substring(0, 8) + "-" + correct.substring(8)
 | |
|                 } else if (Panoramax.isId(v)) {
 | |
|                     // This is a valid ID that came on an object also having an _invalid_ id
 | |
|                     // We can safely skip this
 | |
|                     continue
 | |
|                 } else {
 | |
|                     throw "Unknown url " + v
 | |
|                 }
 | |
|                 console.log(key, correct, "    old: ", v)
 | |
|                 if (!Panoramax.isId(correct)) {
 | |
|                     throw "Constructed an invalid id:" + correct
 | |
|                 }
 | |
|                 const change = new ChangeTagAction(
 | |
|                     f.properties.id,
 | |
|                     new Tag(key, correct),
 | |
|                     f.properties,
 | |
|                     {
 | |
|                         theme: "fix",
 | |
|                         changeType: "fix"
 | |
|                     }
 | |
|                 )
 | |
|                 allChanges.push(change)
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         const xml = await Changes.createChangesetXMLForJosm(allChanges)
 | |
|         console.log(xml)
 | |
|         const path = "repairPanoramax.osc"
 | |
|         writeFileSync(path, xml)
 | |
|         console.log("Written XML to", path)
 | |
|     }
 | |
| }
 | |
| 
 | |
| new RepairPanoramax().run()
 |