MapComplete/scripts/importscripts/zhv.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

59 lines
1.9 KiB
TypeScript
Raw Normal View History

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,
dynamicTyping: false,
2025-07-25 00:01:31 +02:00
})
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"]
})
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",
coordinates: [
parseFloat(row["Longitude"].replace(",", ".")),
parseFloat(row["Latitude"].replace(",", ".")),
],
2025-07-25 00:01:31 +02:00
},
properties: row,
})),
}
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()