forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			91 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { parse } from "csv-parse/sync"
 | 
						|
import { readFileSync } from "fs"
 | 
						|
 | 
						|
var lambert72toWGS84 = function (x, y) {
 | 
						|
    var newLongitude, newLatitude
 | 
						|
 | 
						|
    var n = 0.77164219,
 | 
						|
        F = 1.81329763,
 | 
						|
        thetaFudge = 0.00014204,
 | 
						|
        e = 0.08199189,
 | 
						|
        a = 6378388,
 | 
						|
        xDiff = 149910,
 | 
						|
        yDiff = 5400150,
 | 
						|
        theta0 = 0.07604294
 | 
						|
 | 
						|
    var xReal = xDiff - x,
 | 
						|
        yReal = yDiff - y
 | 
						|
 | 
						|
    var rho = Math.sqrt(xReal * xReal + yReal * yReal),
 | 
						|
        theta = Math.atan(xReal / -yReal)
 | 
						|
 | 
						|
    newLongitude = ((theta0 + (theta + thetaFudge) / n) * 180) / Math.PI
 | 
						|
    newLatitude = 0
 | 
						|
 | 
						|
    for (var i = 0; i < 5; ++i) {
 | 
						|
        newLatitude =
 | 
						|
            2 *
 | 
						|
                Math.atan(
 | 
						|
                    Math.pow((F * a) / rho, 1 / n) *
 | 
						|
                        Math.pow(
 | 
						|
                            (1 + e * Math.sin(newLatitude)) / (1 - e * Math.sin(newLatitude)),
 | 
						|
                            e / 2
 | 
						|
                        )
 | 
						|
                ) -
 | 
						|
            Math.PI / 2
 | 
						|
    }
 | 
						|
    newLatitude *= 180 / Math.PI
 | 
						|
    return [newLongitude, newLatitude]
 | 
						|
}
 | 
						|
 | 
						|
function main(args: string[]): void {
 | 
						|
    if (args.length == 0) {
 | 
						|
        /*     args = ["/home/pietervdvn/Downloads/Scholen/aantallen.csv",
 | 
						|
            "/home/pietervdvn/Downloads/Scholen/perschool.csv",
 | 
						|
            "/home/pietervdvn/Downloads/Scholen/Vestigingsplaatsen-van-scholen-gewoon-secundair-onderwijs-cleaned.csv"]
 | 
						|
    */
 | 
						|
        console.log("Usage: csvToGeojson input.csv name-of-lat-field name-of-lon-field")
 | 
						|
        return
 | 
						|
    }
 | 
						|
 | 
						|
    let file = args[0]
 | 
						|
    if (file.startsWith("file://")) {
 | 
						|
        file = file.substr("file://".length)
 | 
						|
    }
 | 
						|
    const latField = args[1]
 | 
						|
    const lonField = args[2]
 | 
						|
 | 
						|
    const csvOptions = {
 | 
						|
        columns: true,
 | 
						|
        skip_empty_lines: true,
 | 
						|
        trim: true,
 | 
						|
    }
 | 
						|
 | 
						|
    const csv: Record<any, string>[] = parse(readFileSync(file), csvOptions)
 | 
						|
 | 
						|
    const features = csv.map((csvElement, i) => {
 | 
						|
        const lat = Number(csvElement[latField])
 | 
						|
        const lon = Number(csvElement[lonField])
 | 
						|
        if (isNaN(lat) || isNaN(lon)) {
 | 
						|
            throw `Not a valid lat or lon for entry ${i}: ${JSON.stringify(csvElement)}`
 | 
						|
        }
 | 
						|
 | 
						|
        return {
 | 
						|
            type: "Feature",
 | 
						|
            properties: csvElement,
 | 
						|
            geometry: {
 | 
						|
                type: "Point",
 | 
						|
                coordinates: lambert72toWGS84(lon, lat),
 | 
						|
            },
 | 
						|
        }
 | 
						|
    })
 | 
						|
 | 
						|
    console.log(
 | 
						|
        JSON.stringify({
 | 
						|
            type: "FeatureCollection",
 | 
						|
            features,
 | 
						|
        })
 | 
						|
    )
 | 
						|
}
 | 
						|
 | 
						|
main(process.argv.slice(2))
 |