forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			89 lines
		
	
	
		
			No EOL
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			No EOL
		
	
	
		
			2.3 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)) |