mapcomplete/scripts/csvToGeojson.ts

92 lines
2.5 KiB
TypeScript
Raw Normal View History

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