diff options
Diffstat (limited to 'bin/compareSuburb.js')
-rwxr-xr-x | bin/compareSuburb.js | 101 |
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) + } + } +) |