Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions import/source/onspd.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const file = require('../../import/file')

module.exports = {
ingress: file,
format: 'csv',
mapper: require('./onspd/map/place')
}
56 changes: 56 additions & 0 deletions import/source/onspd/map/geometries.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
const _ = require('lodash')
const format = require('../../../format')
const Geometry = require('../../../../model/Geometry')
const rad = 0.001 // select a buffer radius

const turf = {
point: require('turf-point'),
buffer: require('@turf/buffer')
}

function mapper (place, doc) {
// convert CSV rows to geojson point
const geometry = {
type: 'Point',
coordinates: [
parseFloat(_.get(doc, 'long')),
parseFloat(_.get(doc, 'lat'))
]
}

// there are some errors in the data such as:
// { pcd: 'AB113AG', lat: '99.999999', long: '0.000000' }
if (
(geometry.coordinates[0] === 0 && geometry.coordinates[1] === 0) ||
!_.inRange(geometry.coordinates[0], -180, 180) ||
!_.inRange(geometry.coordinates[1], -90, 90)
) {
console.error(`invalid coordinates for ${place.identity.id}`, geometry.coordinates)
return
}

// add a explicit centroid geometry so that one
// does not need to be calculated.
place.addGeometry(new Geometry(
format.from('geometry', 'geojson', geometry),
'centroid'
))

try {
// buffer POINT to a create a POLYGON
var point = turf.point(geometry.coordinates)
var buffered = turf.buffer(point, rad, { units: 'degrees', steps: 8 })

place.addGeometry(new Geometry(
format.from('geometry', 'geojson', buffered.geometry),
'buffer'
))
} catch (e) {
// there are some errors in the data such as:
// { pcd: 'AB113AG', lat: '99.999999', long: '0.000000' }
console.error(`Geometry buffering failed for ${place.identity.id}`, geometry.coordinates)
console.error(e.message)
}
}

module.exports = mapper
34 changes: 34 additions & 0 deletions import/source/onspd/map/place.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
const _ = require('lodash')
const Identity = require('../../../../model/Identity')
const Ontology = require('../../../../model/Ontology')
const Place = require('../../../../model/Place')
const Property = require('../../../../model/Property')
const Name = require('../../../../model/Name')

const map = {
geometries: require('./geometries')
}

function mapper (doc) {
// instantiate a new place
const place = new Place(
new Identity('onspd', _.get(doc, 'pcd', 'unknown').replace(/\s/g, '')),
new Ontology('admin', _.get(doc, 'place', 'postalcode'))
)

// map all columns to properties
for (let key in doc) {
place.addProperty(new Property(`onspd:${key}`, doc[key]))
}

// name property
place.addName(new Name('und', 'default', false, _.get(doc, 'pcd2')))
place.addName(new Name('und', 'default', true, _.get(doc, 'pcd')))

// map geometries
map.geometries(place, doc)

return place
}

module.exports = mapper