aboutsummaryrefslogtreecommitdiff
path: root/bin/compareSuburb.js
diff options
context:
space:
mode:
Diffstat (limited to 'bin/compareSuburb.js')
-rwxr-xr-xbin/compareSuburb.js101
1 files changed, 101 insertions, 0 deletions
diff --git a/bin/compareSuburb.js b/bin/compareSuburb.js
new file mode 100755
index 0000000..c849735
--- /dev/null
+++ b/bin/compareSuburb.js
@@ -0,0 +1,101 @@
+#!/usr/bin/env node
+
+/**
+ * Compare the addr:suburb reported from Vicmap which the corresponding suburb/locality boundary existing in OSM
+ */
+
+const fs = require('fs')
+const { Transform, pipeline } = require('stream')
+const ndjson = require('ndjson')
+const PolygonLookup = require('polygon-lookup')
+
+const argv = require('yargs/yargs')(process.argv.slice(2))
+ .option('verbose', {
+ type: 'boolean',
+ description: 'Verbose logging'
+ })
+ .argv
+
+if (argv._.length < 3) {
+ console.error("Usage: ./compareSuburb.js vicmap-osm.geojson osm_admin_level_10.geojson output.geojson")
+ process.exit(1)
+}
+
+const vicmapFile = argv._[0]
+const osmFile = argv._[1]
+const outputFile = argv._[2]
+
+if (!fs.existsSync(vicmapFile)) {
+ console.error(`${vicmapFile} not found`)
+ process.exit(1)
+}
+if (!fs.existsSync(osmFile)) {
+ console.error(`${osmFile} not found`)
+ process.exit(1)
+}
+
+const osmFeatures = fs.readFileSync(osmFile, 'utf-8').toString().split('\n')
+ .filter(line => line !== '')
+ .map((line, index) => {
+ try {
+ return JSON.parse(line)
+ } catch {
+ console.log(`Error parsing line ${index} of ${osmFile}: ${line}`)
+ }
+ })
+
+console.log('Creating index for OSM Admin Boundaries lookup')
+const lookup = new PolygonLookup({
+ type: 'FeatureCollection',
+ features: osmFeatures
+})
+
+// conflate vicmap addresses with OSM addresses
+let sourceCount = 0
+const compare = new Transform({
+ readableObjectMode: true,
+ writableObjectMode: true,
+ transform(feature, encoding, callback) {
+ sourceCount++
+
+ if (process.stdout.isTTY && sourceCount % 10000 === 0) {
+ process.stdout.write(` ${sourceCount.toLocaleString()}\r`)
+ }
+
+ // find which block this vicmap address is in
+ const results = lookup.search(...feature.geometry.coordinates.slice(0, 2), 1)
+ const osmFeature = results ? (results.type === 'FeatureCollection' ? (results.features ? results.features[0] : null) : results) : null
+ if (osmFeature) {
+ // address within an OSM suburb
+ if (feature.properties['addr:suburb'] !== osmFeature.properties['name']) {
+ // Vicmap suburb different to OSM admin_level=10
+ // console.log('Suburb differs', feature.properties['addr:suburb'], osmFeature.properties['name'])
+ feature.properties._osmSuburb = osmFeature.properties['name']
+ this.push(feature)
+ }
+ } else {
+ // address not found within any OSM suburb
+ // console.log('Not found within any OSM suburb', feature)
+ this.push(feature)
+ }
+
+ callback()
+ }
+})
+
+console.log('Pass 1/1: Find Vicmap addresses where the suburb differs with OSM admin boundaries')
+pipeline(
+ fs.createReadStream(vicmapFile),
+ ndjson.parse(),
+ compare,
+ ndjson.stringify(),
+ fs.createWriteStream(outputFile),
+ err => {
+ if (err) {
+ console.log(err)
+ process.exit(1)
+ } else {
+ process.exit(0)
+ }
+ }
+)