mirror of https://github.com/pelias/api.git
Peter Johnson
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