forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			118 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			118 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()
							 |