| 
									
										
										
										
											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() |