Skip to content

Instantly share code, notes, and snippets.

@swingley
Created July 30, 2017 04:33
Show Gist options
  • Save swingley/4f9b5e7261443ead7943a67f374f0dba to your computer and use it in GitHub Desktop.
Save swingley/4f9b5e7261443ead7943a67f374f0dba to your computer and use it in GitHub Desktop.
const fs = require('fs')
const client = require('mongodb').MongoClient
const turf = require('@turf/turf')
const rimraf = require('rimraf')
const mkdirp = require('mkdirp')
const ncdcConnection = 'mongodb://localhost:27017/ncdc'
const ncdcCollection = 'normals'
let geojsonThreadex = 'json/threadex.geojson'
let stationsThreadex = JSON.parse(fs.readFileSync(geojsonThreadex))
let stationCount = stationsThreadex.features.length
let queried = 0
let outFields = { 'properties.min-values': true, 'properties.max-values': true, 'properties.avg-values': true }
let allDistances = []
let outFolder = 'json/normals-for-threadex-stations/'
rimraf(outFolder, (err) => {
if (err) return console.log('rimraf error...', error)
mkdirp(outFolder, (err) => {
if (err) return console.log('mkdir error', error)
processData()
})
})
let getNormals = (station, cb) => {
// console.log(station)
client.connect(ncdcConnection, (err, db) => {
// console.log(`station... ${station.properties.name}`)
let collection = db.collection(ncdcCollection)
let [lon, lat] = station.geometry.coordinates
collection.geoNear(lon, lat, { num: 1, spherical: true}, (err, docs) => {
db.close()
if ( docs ) {
let { properties } = docs.results[0].obj
// console.log(properties)
let measurements = ['min-values', 'max-values', 'avg-values']
let lengths = measurements.map(p => properties[p].length)
let distance = parseInt(turf.distance(station, docs.results[0].obj, 'miles') * 100) / 100
allDistances.push(distance)
console.log(`${queried}, ${station.properties.place}/${properties.name} lengths: ${lengths.join(', ')}, ${distance}`)
let outFile = `${outFolder}${station.properties.place}.json`
let outData = {
place: station.properties.place,
station: station.properties.station,
normals: {}
}
outData['miles-to-threadex'] = distance
outData.normals.min = properties[measurements[0]]
outData.normals.max = properties[measurements[1]]
outData.normals.avg = properties[measurements[2]]
fs.writeFileSync(outFile, JSON.stringify(outData, null, 2))
console.log(`...wrote JSON for ${station.properties.place}`)
} else {
console.log(`${queried}, \tno results for ${station}`)
}
queried += 1
if ( queried < stationCount ) {
processData()
} else {
let maxDistance = Math.max.apply(null, allDistances)
console.log(`\nMax distance: ${maxDistance}\nFinished.`)
}
})
})
}
let processData = () => {
let next = stationsThreadex.features[queried]
getNormals(next, processData);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment