mirror of https://github.com/pelias/api.git
Browse Source
Labels are now, outside US/CA/UK, just name+city+country. Deduping now only occurs on the first 2 parts of the labels which fixes the "Luxembourg, Luxembourg" issue.pull/497/head
Stephen Hess
9 years ago
13 changed files with 765 additions and 1340 deletions
@ -1,66 +1,62 @@
|
||||
var _ = require('lodash'), |
||||
check = require('check-types'); |
||||
var _ = require('lodash'); |
||||
|
||||
module.exports = { |
||||
'USA': { |
||||
'local': getFirstProperty(['localadmin', 'locality', 'neighbourhood', 'county']), |
||||
'regional': getUsState, |
||||
'country': getFirstProperty(['country_a']) |
||||
'default': { |
||||
'local': getFirstProperty(['locality']), |
||||
'country': getFirstProperty(['country']) |
||||
}, |
||||
'GBR': { |
||||
'local': getFirstProperty(['neighbourhood', 'county', 'localadmin', 'locality', 'macroregion', 'region']), |
||||
'regional': getFirstProperty(['county','country','region']) |
||||
}, |
||||
'SGP': { |
||||
'local': getFirstProperty(['neighbourhood', 'region', 'county', 'localadmin', 'locality']), |
||||
'regional': getFirstProperty(['county','country','region']) |
||||
'local': getFirstProperty(['locality']), |
||||
'regional': getFirstProperty(['macroregion']), |
||||
'country': getFirstProperty(['country']) |
||||
}, |
||||
'SWE': { |
||||
'local': getFirstProperty(['neighbourhood', 'region', 'county', 'localadmin', 'locality']), |
||||
'regional': getFirstProperty(['country']) |
||||
'USA': { |
||||
'borough': getFirstProperty(['borough']), |
||||
'local': getFirstProperty(['locality']), |
||||
'regional': getUsOrCaState, |
||||
'country': getFirstProperty(['country']) |
||||
}, |
||||
'default': { |
||||
'local': getFirstProperty(['localadmin', 'locality', 'neighbourhood', 'county', 'macroregion', 'region']), |
||||
'regional': getFirstProperty(['country']) |
||||
'CAN': { |
||||
'local': getFirstProperty(['locality']), |
||||
'regional': getUsOrCaState, |
||||
'country': getFirstProperty(['country']) |
||||
} |
||||
}; |
||||
|
||||
// find the first field of record that has a non-empty value that's not already in labelParts
|
||||
function getFirstProperty(fields) { |
||||
return function(record, labelParts) { |
||||
return function(record) { |
||||
for (var i = 0; i < fields.length; i++) { |
||||
var fieldValue = record[fields[i]]; |
||||
|
||||
if (check.nonEmptyString(fieldValue) && !_.includes(labelParts, fieldValue)) { |
||||
labelParts.push( fieldValue ); |
||||
return labelParts; |
||||
if (!_.isEmpty(fieldValue)) { |
||||
return fieldValue; |
||||
} |
||||
|
||||
} |
||||
|
||||
return labelParts; |
||||
|
||||
}; |
||||
|
||||
} |
||||
|
||||
// this function is exclusively used for figuring out which field to use for US States
|
||||
// 1. if a US state is the most granular bit of info entered, the label should contain
|
||||
// the full state name, eg: Pennsylvania, USA
|
||||
// 2. otherwise, the state abbreviation should be used, eg: Lancaster, PA, USA
|
||||
// this function is exclusively used for figuring out which field to use for US/CA States
|
||||
// 1. if a US/CA state is the most granular bit of info entered, the label should contain
|
||||
// the full state name, eg: Pennsylvania, USA and Ontario, CA
|
||||
// 2. otherwise, the state abbreviation should be used, eg: Lancaster, PA, USA and Bruce, ON, CA
|
||||
// 3. if for some reason the abbreviation isn't available, use the full state name
|
||||
function getUsState(record, labelParts) { |
||||
function getUsOrCaState(record) { |
||||
if ('region' === record.layer && record.region) { |
||||
// add full state name when state is the most granular piece of info
|
||||
labelParts.push(record.region); |
||||
// return full state name when state is the most granular piece of info
|
||||
return record.region; |
||||
|
||||
} else if (record.region_a) { |
||||
// otherwise just add the region code when available
|
||||
labelParts.push(record.region_a); |
||||
// otherwise just return the region code when available
|
||||
return record.region_a; |
||||
|
||||
} else if (record.region) { |
||||
// add the full name when there's no region code available ()
|
||||
labelParts.push(record.region); |
||||
} |
||||
// return the full name when there's no region code available
|
||||
return record.region; |
||||
|
||||
return labelParts; |
||||
} |
||||
|
||||
} |
||||
|
@ -0,0 +1,205 @@
|
||||
var generator = require('../../../helper/labelGenerator'); |
||||
|
||||
module.exports.tests = {}; |
||||
|
||||
module.exports.tests.interface = function(test, common) { |
||||
test('interface', function(t) { |
||||
t.equal(typeof generator, 'function', 'valid function'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
module.exports.tests.canada = function(test, common) { |
||||
test('venue', function(t) { |
||||
var doc = { |
||||
'name': 'venue name', |
||||
'layer': 'venue', |
||||
'housenumber': '1', |
||||
'street': 'Main St', |
||||
'neighbourhood': 'neighbourhood name', |
||||
'locality': 'locality name', |
||||
'localadmin': 'localadmin name', |
||||
'county': 'county name', |
||||
'macrocounty': 'macrocounty name', |
||||
'region_a': 'region abbr', |
||||
'region': 'region name', |
||||
'macroregion': 'macroregion name', |
||||
'country_a': 'CAN', |
||||
'country': 'Canada' |
||||
}; |
||||
t.equal(generator(doc),'venue name, locality name, region abbr, Canada'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('street', function(t) { |
||||
var doc = { |
||||
'name': '1 Main St', |
||||
'layer': 'address', |
||||
'housenumber': '1', |
||||
'street': 'Main St', |
||||
'neighbourhood': 'neighbourhood name', |
||||
'locality': 'locality name', |
||||
'localadmin': 'localadmin name', |
||||
'county': 'county name', |
||||
'macrocounty': 'macrocounty name', |
||||
'region_a': 'region abbr', |
||||
'region': 'region name', |
||||
'macroregion': 'macroregion name', |
||||
'country_a': 'CAN', |
||||
'country': 'Canada' |
||||
}; |
||||
t.equal(generator(doc),'1 Main St, locality name, region abbr, Canada'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('neighbourhood', function(t) { |
||||
var doc = { |
||||
'name': 'neighbourhood name', |
||||
'layer': 'neighbourhood', |
||||
'neighbourhood': 'neighbourhood name', |
||||
'locality': 'locality name', |
||||
'localadmin': 'localadmin name', |
||||
'county': 'county name', |
||||
'macrocounty': 'macrocounty name', |
||||
'region_a': 'region abbr', |
||||
'region': 'region name', |
||||
'macroregion': 'macroregion name', |
||||
'country_a': 'CAN', |
||||
'country': 'Canada' |
||||
}; |
||||
t.equal(generator(doc),'neighbourhood name, locality name, region abbr, Canada'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('locality', function(t) { |
||||
var doc = { |
||||
'name': 'locality name', |
||||
'layer': 'locality', |
||||
'locality': 'locality name', |
||||
'localadmin': 'localadmin name', |
||||
'county': 'county name', |
||||
'macrocounty': 'macrocounty name', |
||||
'region_a': 'region abbr', |
||||
'region': 'region name', |
||||
'macroregion': 'macroregion name', |
||||
'country_a': 'CAN', |
||||
'country': 'Canada' |
||||
}; |
||||
t.equal(generator(doc),'locality name, region abbr, Canada'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('localadmin', function(t) { |
||||
var doc = { |
||||
'name': 'localadmin name', |
||||
'layer': 'localadmin', |
||||
'localadmin': 'localadmin name', |
||||
'county': 'county name', |
||||
'macrocounty': 'macrocounty name', |
||||
'region_a': 'region abbr', |
||||
'region': 'region name', |
||||
'macroregion': 'macroregion name', |
||||
'country_a': 'CAN', |
||||
'country': 'Canada' |
||||
}; |
||||
t.equal(generator(doc),'localadmin name, region abbr, Canada'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('county', function(t) { |
||||
var doc = { |
||||
'name': 'county name', |
||||
'layer': 'county', |
||||
'county': 'county name', |
||||
'macrocounty': 'macrocounty name', |
||||
'region_a': 'region abbr', |
||||
'region': 'region name', |
||||
'macroregion': 'macroregion name', |
||||
'country_a': 'CAN', |
||||
'country': 'Canada' |
||||
}; |
||||
t.equal(generator(doc),'county name, region abbr, Canada'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('macrocounty', function(t) { |
||||
var doc = { |
||||
'name': 'macrocounty name', |
||||
'layer': 'macrocounty', |
||||
'macrocounty': 'macrocounty name', |
||||
'region_a': 'region abbr', |
||||
'region': 'region name', |
||||
'macroregion': 'macroregion name', |
||||
'country_a': 'CAN', |
||||
'country': 'Canada' |
||||
}; |
||||
t.equal(generator(doc),'macrocounty name, region abbr, Canada'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('region', function(t) { |
||||
var doc = { |
||||
'name': 'region name', |
||||
'layer': 'region', |
||||
'region_a': 'region abbr', |
||||
'region': 'region name', |
||||
'macroregion': 'macroregion name', |
||||
'country_a': 'CAN', |
||||
'country': 'Canada' |
||||
}; |
||||
t.equal(generator(doc),'region name, Canada'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('macroregion', function(t) { |
||||
var doc = { |
||||
'name': 'macroregion name', |
||||
'layer': 'macroregion', |
||||
'macroregion': 'macroregion name', |
||||
'country_a': 'CAN', |
||||
'country': 'Canada' |
||||
}; |
||||
t.equal(generator(doc),'macroregion name, Canada'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('country', function(t) { |
||||
var doc = { |
||||
'name': 'Canada', |
||||
'layer': 'country', |
||||
'country_a': 'CAN', |
||||
'country': 'Canada' |
||||
}; |
||||
t.equal(generator(doc),'Canada'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('region should be used when region_a is not available', function(t) { |
||||
var doc = { |
||||
'name': 'locality name', |
||||
'layer': 'region', |
||||
'locality': 'locality name', |
||||
'localadmin': 'localadmin name', |
||||
'county': 'county name', |
||||
'macrocounty': 'macrocounty name', |
||||
'region': 'region name', |
||||
'macroregion': 'macroregion name', |
||||
'country_a': 'CAN', |
||||
'country': 'Canada' |
||||
}; |
||||
t.equal(generator(doc),'locality name, region name, Canada', 'region should be used'); |
||||
t.end(); |
||||
}); |
||||
|
||||
}; |
||||
|
||||
module.exports.all = function (tape, common) { |
||||
|
||||
function test(name, testFunction) { |
||||
return tape('label generator (CAN): ' + name, testFunction); |
||||
} |
||||
|
||||
for( var testCase in module.exports.tests ){ |
||||
module.exports.tests[testCase](test, common); |
||||
} |
||||
}; |
@ -1,51 +0,0 @@
|
||||
|
||||
var generator = require('../../../helper/labelGenerator'); |
||||
|
||||
module.exports.tests = {}; |
||||
|
||||
module.exports.tests.interface = function(test, common) { |
||||
test('interface', function(t) { |
||||
t.equal(typeof generator, 'function', 'valid function'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
// SGP region
|
||||
module.exports.tests.north_west_singapore = function(test, common) { |
||||
test('north west singapore', function(t) { |
||||
var doc = { |
||||
'name': 'North West', |
||||
'country_a': 'SGP', |
||||
'country': 'Singapore', |
||||
'region': 'North West' |
||||
}; |
||||
t.equal(generator(doc),'North West, Singapore'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
// SGP venue
|
||||
module.exports.tests.singapore_mcdonalds = function(test, common) { |
||||
test('singapore_mcdonalds', function(t) { |
||||
var doc = { |
||||
'name': 'McDonald\'s', |
||||
'country_a': 'SGP', |
||||
'country': 'Singapore', |
||||
'region': 'Central Singapore', |
||||
'locality': 'Singapore' |
||||
}; |
||||
t.equal(generator(doc),'McDonald\'s, Central Singapore, Singapore'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
module.exports.all = function (tape, common) { |
||||
|
||||
function test(name, testFunction) { |
||||
return tape('label generator: ' + name, testFunction); |
||||
} |
||||
|
||||
for( var testCase in module.exports.tests ){ |
||||
module.exports.tests[testCase](test, common); |
||||
} |
||||
}; |
@ -1,53 +0,0 @@
|
||||
|
||||
var generator = require('../../../helper/labelGenerator'); |
||||
|
||||
module.exports.tests = {}; |
||||
|
||||
module.exports.tests.interface = function(test, common) { |
||||
test('interface', function(t) { |
||||
t.equal(typeof generator, 'function', 'valid function'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
// SWE city
|
||||
module.exports.tests.skane1 = function(test, common) { |
||||
test('skĂĄne 1', function(t) { |
||||
var doc = { |
||||
'name': 'Malmö', |
||||
'country_a': 'SWE', |
||||
'country': 'Sweden', |
||||
'region': 'SkĂĄne', |
||||
'county': 'Malmö' |
||||
}; |
||||
t.equal(generator(doc),'Malmö, Skåne, Sweden'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
// SWE city
|
||||
module.exports.tests.skane2 = function(test, common) { |
||||
test('skĂĄne 2', function(t) { |
||||
var doc = { |
||||
'name': 'Malmö', |
||||
'country_a': 'SWE', |
||||
'country': 'Sweden', |
||||
'region': 'SkĂĄne', |
||||
'county': 'Malmö', |
||||
'locality': 'Malmö' |
||||
}; |
||||
t.equal(generator(doc),'Malmö, Skåne, Sweden'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
module.exports.all = function (tape, common) { |
||||
|
||||
function test(name, testFunction) { |
||||
return tape('label generator: ' + name, testFunction); |
||||
} |
||||
|
||||
for( var testCase in module.exports.tests ){ |
||||
module.exports.tests[testCase](test, common); |
||||
} |
||||
}; |
@ -0,0 +1,114 @@
|
||||
var generator = require('../../../helper/labelGenerator'); |
||||
|
||||
module.exports.tests = {}; |
||||
|
||||
module.exports.tests.interface = function(test, common) { |
||||
test('interface', function(t) { |
||||
t.equal(typeof generator, 'function', 'valid function'); |
||||
t.end(); |
||||
}); |
||||
}; |
||||
|
||||
module.exports.tests.canada = function(test, common) { |
||||
test('venue', function(t) { |
||||
var doc = { |
||||
'name': 'Tim Horton\'s', |
||||
'layer': 'venue', |
||||
'housenumber': '1', |
||||
'street': 'Main St', |
||||
'neighbourhood': 'College Heights', |
||||
'locality': 'Thunder Bay', |
||||
'region_a': 'ON', |
||||
'region': 'Ontario', |
||||
'country_a': 'CAN', |
||||
'country': 'Canada' |
||||
}; |
||||
t.equal(generator(doc),'Tim Horton\'s, Thunder Bay, ON, Canada'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('address', function(t) { |
||||
var doc = { |
||||
'name': '1 Main St', |
||||
'layer': 'venue', |
||||
'housenumber': '1', |
||||
'street': 'Main St', |
||||
'locality': 'Truth or Consequences', |
||||
'region_a': 'NM', |
||||
'region': 'New Mexico', |
||||
'country_a': 'USA', |
||||
'country': 'United States' |
||||
}; |
||||
t.equal(generator(doc),'1 Main St, Truth or Consequences, NM, United States'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('eiffel tower', function(t) { |
||||
var doc = { |
||||
'name': 'Tour Eiffel', |
||||
'layer': 'venue', |
||||
'neighbourhood': 'Quartier du Gros-Caillou', |
||||
'locality': 'Paris', |
||||
'region': 'Paris', |
||||
'country_a': 'FRA', |
||||
'country': 'France' |
||||
}; |
||||
t.equal(generator(doc),'Tour Eiffel, Paris, France'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('France street address', function(t) { |
||||
var doc = { |
||||
'name': '74 rue de rivoli', |
||||
'layer': 'address', |
||||
'housenumber': '74', |
||||
'street': 'Rue de Rivoli', |
||||
'neighbourhood': 'Quartier Saint-Merri', |
||||
'locality': 'Paris', |
||||
'region': 'Paris', |
||||
'country_a': 'FRA', |
||||
'country': 'France' |
||||
}; |
||||
t.equal(generator(doc),'74 rue de rivoli, Paris, France'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('France neighbourhood', function(t) { |
||||
var doc = { |
||||
'name': 'Grange aux Belles Terrage', |
||||
'layer': 'neighbourhood', |
||||
'neighbourhood': 'Grange aux Belles Terrage', |
||||
'locality': 'Paris', |
||||
'region': 'Paris', |
||||
'country_a': 'FRA', |
||||
'country': 'France' |
||||
}; |
||||
t.equal(generator(doc),'Grange aux Belles Terrage, Paris, France'); |
||||
t.end(); |
||||
}); |
||||
|
||||
test('Luxembourg (the city) in Luxembourg', function(t) { |
||||
var doc = { |
||||
'name': 'Luxembourg', |
||||
'layer': 'locality', |
||||
'locality': 'Luxembourg', |
||||
'country_a': 'LUX', |
||||
'country': 'Luxembourg' |
||||
}; |
||||
// console.error(generator(doc));
|
||||
t.equal(generator(doc),'Luxembourg, Luxembourg'); |
||||
t.end(); |
||||
}); |
||||
|
||||
}; |
||||
|
||||
module.exports.all = function (tape, common) { |
||||
|
||||
function test(name, testFunction) { |
||||
return tape('label generator (CAN): ' + name, testFunction); |
||||
} |
||||
|
||||
for( var testCase in module.exports.tests ){ |
||||
module.exports.tests[testCase](test, common); |
||||
} |
||||
}; |
Loading…
Reference in new issue