import { readFileSync, writeFileSync } from "fs" import Script from "../Script" import { parse } from "papaparse" import { FeatureCollection, Point } from "geojson" class ZHVcsv2GeoJson extends Script { constructor() { super("Converts a CSV file with ZHV data to GeoJSON format. Usage: csv-file output-file") } async main(args: string[]): Promise { const csvFile = args[0] const outputFile = args[1] if (!csvFile || !outputFile) { console.error("Usage: csv-file output-file") return } // Read the CSV file and parse it using PapaParse const text = readFileSync(csvFile, "utf-8") const parsed = parse(text, { header: true, dynamicTyping: false, }) console.log(`Parsed ${parsed.data.length} rows from ${csvFile}`) console.log(`First row:`, parsed.data[0]) // Drop all rows that do not have a valid latitude and longitude parsed.data = parsed.data.filter((row: any) => { return row["Latitude"] && row["Longitude"] }) // Convert the parsed data to GeoJSON format const geoJson: FeatureCollection = { type: "FeatureCollection", features: parsed.data.map((row: any) => ({ type: "Feature", geometry: { type: "Point", coordinates: [ parseFloat(row["Longitude"].replace(",", ".")), parseFloat(row["Latitude"].replace(",", ".")), ], }, properties: row, })), } console.log(`First feature:`, geoJson.features[0]) // Write the GeoJSON output to the specified file writeFileSync(outputFile, JSON.stringify(geoJson), "utf-8") } } new ZHVcsv2GeoJson().run()