2025-07-25 00:01:31 +02:00
|
|
|
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<void> {
|
|
|
|
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,
|
2025-07-25 00:22:59 +02:00
|
|
|
dynamicTyping: false,
|
2025-07-25 00:01:31 +02:00
|
|
|
})
|
|
|
|
|
|
|
|
console.log(`Parsed ${parsed.data.length} rows from ${csvFile}`)
|
2025-07-25 00:22:59 +02:00
|
|
|
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"]
|
|
|
|
})
|
2025-07-25 00:01:31 +02:00
|
|
|
|
|
|
|
// Convert the parsed data to GeoJSON format
|
|
|
|
const geoJson: FeatureCollection<Point> = {
|
|
|
|
type: "FeatureCollection",
|
|
|
|
features: parsed.data.map((row: any) => ({
|
|
|
|
type: "Feature",
|
|
|
|
geometry: {
|
|
|
|
type: "Point",
|
2025-07-25 00:22:59 +02:00
|
|
|
coordinates: [
|
|
|
|
parseFloat(row["Longitude"].replace(",", ".")),
|
|
|
|
parseFloat(row["Latitude"].replace(",", ".")),
|
|
|
|
],
|
2025-07-25 00:01:31 +02:00
|
|
|
},
|
|
|
|
properties: row,
|
|
|
|
})),
|
|
|
|
}
|
|
|
|
|
2025-07-25 00:22:59 +02:00
|
|
|
console.log(`First feature:`, geoJson.features[0])
|
|
|
|
|
2025-07-25 00:01:31 +02:00
|
|
|
// Write the GeoJSON output to the specified file
|
|
|
|
writeFileSync(outputFile, JSON.stringify(geoJson), "utf-8")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
new ZHVcsv2GeoJson().run()
|