mirror of https://github.com/pelias/api.git
Peter Johnson @insertcoffee
10 years ago
4 changed files with 131 additions and 43 deletions
@ -0,0 +1,45 @@
|
||||
|
||||
var GeoJSON = require('geojson'); |
||||
|
||||
function suggest( docs ){ |
||||
|
||||
// emit a warning if the doc format is invalid
|
||||
// @note: if you see this error, fix it ASAP!
|
||||
function warning(){ |
||||
console.error( 'error: invalid doc', __filename ); |
||||
return false; // remove offending doc from results
|
||||
} |
||||
|
||||
// flatten & expand data for geojson conversion
|
||||
var geodata = docs.map( function( doc ){ |
||||
|
||||
// something went very wrong
|
||||
if( !doc || !doc.payload ) return warning(); |
||||
|
||||
// split payload id string in to geojson properties
|
||||
if( 'string' !== typeof doc.payload.id ) return warning(); |
||||
var idParts = doc.payload.id.split('/'); |
||||
doc.type = idParts[0]; |
||||
doc.id = idParts[1]; |
||||
|
||||
// split payload geo string in to geojson properties
|
||||
if( 'string' !== typeof doc.payload.geo ) return warning(); |
||||
var geoParts = doc.payload.geo.split(','); |
||||
doc.lat = parseFloat( geoParts[1] ); |
||||
doc.lng = parseFloat( geoParts[0] ); |
||||
|
||||
// remove payload from doc
|
||||
delete doc.payload; |
||||
return doc; |
||||
|
||||
// filter-out invalid entries
|
||||
}).filter( function( doc ){ |
||||
return doc; |
||||
}); |
||||
|
||||
// convert to geojson
|
||||
return GeoJSON.parse( geodata, { Point: ['lat', 'lng'] } ); |
||||
|
||||
} |
||||
|
||||
module.exports.suggest = suggest; |
@ -0,0 +1,82 @@
|
||||
|
||||
var geojsonify = require('../../../helper/geojsonify'); |
||||
|
||||
module.exports.tests = {}; |
||||
|
||||
module.exports.tests.interface = function(test, common) { |
||||
test('valid interface .suggest()', function(t) { |
||||
t.equal(typeof geojsonify.suggest, 'function', 'suggest is a function'); |
||||
t.equal(geojsonify.suggest.length, 1, 'accepts x arguments'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
module.exports.tests.suggest = function(test, common) { |
||||
|
||||
var input = [{ |
||||
bingo1: 'bango1', |
||||
payload: { |
||||
id: 'foo1/bar1', |
||||
geo: '100,-10.5' |
||||
} |
||||
},{ |
||||
bingo2: 'bango2', |
||||
payload: { |
||||
id: 'foo2/bar2', |
||||
geo: '10,-1.5' |
||||
} |
||||
}]; |
||||
|
||||
var expected = { |
||||
"type": "FeatureCollection", |
||||
"features": [ |
||||
{ |
||||
"type": "Feature", |
||||
"geometry": { |
||||
"type": "Point", |
||||
"coordinates": [ |
||||
100, |
||||
-10.5 |
||||
] |
||||
}, |
||||
"properties": { |
||||
"bingo1": "bango1", |
||||
"type": "foo1", |
||||
"id": "bar1" |
||||
} |
||||
}, |
||||
{ |
||||
"type": "Feature", |
||||
"geometry": { |
||||
"type": "Point", |
||||
"coordinates": [ |
||||
10, |
||||
-1.5 |
||||
] |
||||
}, |
||||
"properties": { |
||||
"bingo2": "bango2", |
||||
"type": "foo2", |
||||
"id": "bar2" |
||||
} |
||||
} |
||||
] |
||||
}; |
||||
|
||||
test('geojsonify.suggest()', function(t) { |
||||
var json = geojsonify.suggest( input ); |
||||
t.deepEqual(json, expected, 'all docs mapped'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
module.exports.all = function (tape, common) { |
||||
|
||||
function test(name, testFunction) { |
||||
return tape('geojsonify: ' + name, testFunction); |
||||
} |
||||
|
||||
for( var testCase in module.exports.tests ){ |
||||
module.exports.tests[testCase](test, common); |
||||
} |
||||
}; |
Loading…
Reference in new issue