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