diff --git a/import/source/asgs.js b/import/source/asgs.js new file mode 100644 index 0000000..a8663db --- /dev/null +++ b/import/source/asgs.js @@ -0,0 +1,8 @@ +const file = require('../../import/file') + +module.exports = { + ingress: file, + record_separator: /\r?\n/, + format: 'json', + mapper: require('./asgs/map/place') +} diff --git a/import/source/asgs/map/geometries.js b/import/source/asgs/map/geometries.js new file mode 100644 index 0000000..0106adf --- /dev/null +++ b/import/source/asgs/map/geometries.js @@ -0,0 +1,17 @@ +const _ = require('lodash') +const format = require('../../../format') +const Geometry = require('../../../../model/Geometry') + +function mapper (place, doc) { + const geometry = _.get(doc, 'geometry') + const isPolygon = _.get(geometry, 'type', '').trim().toUpperCase().endsWith('POLYGON') + + if (geometry) { + place.addGeometry(new Geometry( + format.from('geometry', 'geojson', geometry), + isPolygon ? 'boundary' : 'centroid' + )) + } +} + +module.exports = mapper diff --git a/import/source/asgs/map/names.js b/import/source/asgs/map/names.js new file mode 100644 index 0000000..7a1216a --- /dev/null +++ b/import/source/asgs/map/names.js @@ -0,0 +1,14 @@ +const _ = require('lodash') +const Name = require('../../../../model/Name') + +function mapper (place, properties) { + // remove 'disambiguation' tokens from name suffix + // see: https://github.com/whosonfirst-data/whosonfirst-data/issues/885 + let name = _.get(properties, 'SSC_NAME16', '') + name = name.replace(/(\s+([-֊־‐‑﹣]|[([])).*$/, '') + + place.addName(new Name('und', 'default', false, name)) + place.addName(new Name('eng', 'preferred', false, name)) +} + +module.exports = mapper diff --git a/import/source/asgs/map/place.js b/import/source/asgs/map/place.js new file mode 100644 index 0000000..5b49f80 --- /dev/null +++ b/import/source/asgs/map/place.js @@ -0,0 +1,35 @@ +const _ = require('lodash') +const Identity = require('../../../../model/Identity') +const Ontology = require('../../../../model/Ontology') +const Place = require('../../../../model/Place') + +const map = { + names: require('./names'), + properties: require('./properties'), + geometries: require('./geometries') +} + +function mapper (doc) { + // get document properties + const properties = _.get(doc, 'properties') + if (!_.isPlainObject(properties)) { return null } + + // do not map records with no valid id or name + if (!_.has(properties, 'SSC_CODE16')) { return null } + if (!_.has(properties, 'SSC_NAME16')) { return null } + + // instantiate a new place + const place = new Place( + new Identity('asgs', _.get(properties, 'SSC_CODE16', '').toString()), + new Ontology('admin', 'suburb') + ) + + // run mappers + map.names(place, properties) + map.properties(place, properties) + map.geometries(place, doc) + + return place +} + +module.exports = mapper diff --git a/import/source/asgs/map/properties.js b/import/source/asgs/map/properties.js new file mode 100644 index 0000000..6c65368 --- /dev/null +++ b/import/source/asgs/map/properties.js @@ -0,0 +1,9 @@ +const Property = require('../../../../model/Property') + +function mapper (place, properties) { + for (let key in properties) { + place.addProperty(new Property(`asgs:${key}`, properties[key])) + } +} + +module.exports = mapper