mapcomplete/scripts/postal_code_tools/prepPostalCodesHulls.ts
2023-01-17 00:50:42 +01:00

63 lines
1.8 KiB
TypeScript

import * as fs from "fs"
import { writeFileSync } from "fs"
import ScriptUtils from "../ScriptUtils"
function handleFile(file: string, postalCode: number) {
const geojson = JSON.parse(fs.readFileSync(file, { encoding: "utf8" }))
geojson.properties = {
type: "boundary",
boundary: "postal_code",
postal_code: postalCode + "",
}
return geojson
}
function getKnownPostalCodes(): number[] {
return fs
.readFileSync("./scripts/postal_code_tools/knownPostalCodes.csv", { encoding: "utf8" })
.split("\n")
.map((line) => Number(line.split(",")[1]))
}
function main(args: string[]) {
const dir = args[0]
const knownPostals = new Set<number>(getKnownPostalCodes())
const files = ScriptUtils.readDirRecSync(dir, 1)
const allFiles = []
const skipped = []
for (const file of files) {
const nameParts = file.split("-")
const postalCodeStr = nameParts[nameParts.length - 1]
const postalCode = Number(
postalCodeStr.substr(0, postalCodeStr.length - ".geojson.convex.geojson".length)
)
if (isNaN(postalCode)) {
console.error("Not a number: ", postalCodeStr)
continue
}
if (knownPostals.has(postalCode)) {
skipped.push(postalCode)
ScriptUtils.erasableLog(
"Skipping boundary for ",
postalCode,
"as it is already known - skipped ",
skipped.length,
"already"
)
continue
}
allFiles.push(handleFile(file, postalCode))
}
writeFileSync(
"all_postal_codes_filtered.geojson",
JSON.stringify({
type: "FeatureCollection",
features: allFiles,
})
)
}
let args = [...process.argv]
args.splice(0, 2)
main(args)