|
|
|
|
|
|
|
var GeoJSON = require('geojson'),
|
|
|
|
extent = require('geojson-extent'),
|
|
|
|
outputGenerator = require('./outputGenerator');
|
|
|
|
|
|
|
|
function search( docs, params ){
|
|
|
|
|
|
|
|
// 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
|
|
|
|
}
|
|
|
|
|
|
|
|
var details = params ? params.details : {};
|
|
|
|
details = details === true || details === 1;
|
|
|
|
|
|
|
|
// flatten & expand data for geojson conversion
|
|
|
|
var geodata = docs.map( function( doc ){
|
|
|
|
|
|
|
|
// something went very wrong
|
|
|
|
if( !doc ) { return warning(); }
|
|
|
|
|
|
|
|
var output = {};
|
|
|
|
|
|
|
|
// provide metadata to consumer
|
|
|
|
output.id = doc._id;
|
|
|
|
output.layer = doc._type;
|
|
|
|
|
|
|
|
// map center_point
|
|
|
|
if( !doc.center_point ) { return warning(); }
|
|
|
|
output.lat = parseFloat( doc.center_point.lat );
|
|
|
|
output.lng = parseFloat( doc.center_point.lon );
|
|
|
|
|
|
|
|
if (details) {
|
|
|
|
// map name
|
|
|
|
if( !doc.name || !doc.name.default ) { return warning(); }
|
|
|
|
output.name = doc.name.default;
|
|
|
|
|
|
|
|
// map admin values
|
|
|
|
if( doc.alpha3 ){ output.alpha3 = doc.alpha3; }
|
|
|
|
if( doc.admin0 ){ output.admin0 = doc.admin0; }
|
|
|
|
if( doc.admin1 ){ output.admin1 = doc.admin1; }
|
|
|
|
if( doc.admin1_abbr ){ output.admin1_abbr = doc.admin1_abbr; }
|
|
|
|
if( doc.admin2 ){ output.admin2 = doc.admin2; }
|
|
|
|
if( doc.local_admin ){ output.local_admin = doc.local_admin; }
|
|
|
|
if( doc.locality ){ output.locality = doc.locality; }
|
|
|
|
if( doc.neighborhood ){ output.neighborhood = doc.neighborhood; }
|
|
|
|
}
|
|
|
|
|
|
|
|
// generate region-specific text string
|
|
|
|
output.text = outputGenerator( doc );
|
|
|
|
|
|
|
|
return output;
|
|
|
|
|
|
|
|
// filter-out invalid entries
|
|
|
|
}).filter( function( doc ){
|
|
|
|
return doc;
|
|
|
|
});
|
|
|
|
|
|
|
|
// convert to geojson
|
|
|
|
var geojson = GeoJSON.parse( geodata, { Point: ['lat', 'lng'] });
|
|
|
|
|
|
|
|
// bounding box calculations
|
|
|
|
// @note: extent() sometimes throws Errors for unusual data
|
|
|
|
// eg: https://github.com/pelias/pelias/issues/84
|
|
|
|
try {
|
|
|
|
var bbox = extent( geojson );
|
|
|
|
if( !!bbox ){
|
|
|
|
geojson.bbox = bbox;
|
|
|
|
}
|
|
|
|
} catch( e ){
|
|
|
|
console.error( 'bbox error', e.message, e.stack );
|
|
|
|
console.error( 'geojson', JSON.stringify( geojson, null, 2 ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
return geojson;
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports.search = search;
|