taginfo for relation roles

Enabled taginfo suggestions for roles on relation members and memberships.
This commit is contained in:
Minh Nguyễn
2016-07-31 03:04:07 -07:00
parent e2969656f0
commit 4ba0f43ee0
3 changed files with 136 additions and 0 deletions
+50
View File
@@ -9,12 +9,26 @@ var taginfo = {},
area: 'count_ways',
line: 'count_ways'
},
tag_sort_members = {
point: 'count_node_members',
vertex: 'count_node_members',
area: 'count_way_members',
line: 'count_way_members',
relation: 'count_relation_members'
},
tag_filters = {
point: 'nodes',
vertex: 'nodes',
area: 'ways',
line: 'ways'
};
tag_members_fractions = {
point: 'count_node_members_fraction',
vertex: 'count_node_members_fraction',
area: 'count_way_members_fraction',
line: 'count_way_members_fraction',
relation: 'count_relation_members_fraction'
};
function sets(parameters, n, o) {
@@ -32,6 +46,10 @@ function setSort(parameters) {
return sets(parameters, 'sortname', tag_sorts);
}
function setSortMembers(parameters) {
return sets(parameters, 'sortname', tag_sort_members);
}
function clean(parameters) {
return _.omit(parameters, 'geometry', 'debounce');
}
@@ -57,6 +75,14 @@ function filterValues(allowUpperCase) {
};
}
function filterRoles(geometry) {
return function(d) {
if (d.role === '') return false; // exclude empty role
if (d.role.match(/[A-Z*;,]/) !== null) return false; // exclude uppercase letters and some punctuation
return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
};
}
function valKey(d) {
return {
value: d.key,
@@ -71,6 +97,13 @@ function valKeyDescription(d) {
};
}
function roleKey(d) {
return {
value: d.role,
title: d.role
};
}
// sort keys with ':' lower than keys without ':'
function sortKeys(a, b) {
return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
@@ -146,6 +179,23 @@ export function init() {
});
};
taginfo.roles = function(parameters, callback) {
var debounce = parameters.debounce;
var geometry = parameters.geometry;
parameters = clean(setSortMembers(parameters));
request(endpoint + 'relation/roles?' +
qsString(_.extend({
rp: 25,
sortname: 'count_all_members',
sortorder: 'desc',
page: 1
}, parameters)), debounce, function(err, d) {
if (err) return callback(err);
var f = filterRoles(geometry);
callback(null, d.data.filter(f).map(roleKey));
});
};
taginfo.docs = function(parameters, callback) {
var debounce = parameters.debounce;
parameters = clean(setSort(parameters));