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[] = 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))