in modules/ui/preset_browser.js [268:364]
function getDefaultResults() {
var graph = context.graph();
var superGroups = groupManager.groupsWithNearby;
var scoredGroups = {};
var scoredPresets = {};
context.presets().getRecents().slice(0, 15).forEach(function(item, index) {
var score = (15 - index) / 15;
var id = item.preset.id;
if (!scoredPresets[id]) {
scoredPresets[id] = {
preset: item.preset,
score: score
};
}
});
var queryExtent = context.map().extent();
var nearbyEntities = context.history().tree().intersects(queryExtent, graph);
for (var i in nearbyEntities) {
var entity = nearbyEntities[i];
// ignore boring features
if (!entity.hasInterestingTags()) continue;
var geom = entity.geometry(graph);
// evaluate preset
var preset = context.presets().match(entity, graph);
if (preset.searchable !== false && // don't recommend unsearchables
!preset.isFallback() && // don't recommend generics
!preset.suggestion) { // don't recommend brand suggestions again
if (!scoredPresets[preset.id]) {
scoredPresets[preset.id] = {
preset: preset,
score: 0
};
}
scoredPresets[preset.id].score += 1;
}
// evaluate groups
for (var j in superGroups) {
var group = superGroups[j];
if (group.matchesTags(entity.tags, geom)) {
var nearbyGroupID = group.nearby;
if (!scoredGroups[nearbyGroupID]) {
scoredGroups[nearbyGroupID] = {
group: groupManager.group(nearbyGroupID),
score: 0
};
}
var entityScore;
if (geom === 'area') {
// significantly prefer area features that dominate the viewport
// (e.g. editing within a park or school grounds)
var containedPercent = queryExtent.percentContainedIn(entity.extent(graph));
entityScore = Math.max(1, containedPercent * 10);
} else {
entityScore = 1;
}
scoredGroups[nearbyGroupID].score += entityScore;
}
}
}
Object.values(scoredGroups).forEach(function(scoredGroupItem) {
scoredGroupItem.group.scoredPresets().forEach(function(groupScoredPreset) {
var combinedScore = groupScoredPreset.score * scoredGroupItem.score;
if (!scoredPresets[groupScoredPreset.preset.id]) {
scoredPresets[groupScoredPreset.preset.id] = {
preset: groupScoredPreset.preset,
score: combinedScore
};
} else {
scoredPresets[groupScoredPreset.preset.id].score += combinedScore;
}
});
});
return Object.values(scoredPresets).sort(function(item1, item2) {
return item2.score - item1.score;
}).map(function(item) {
return item.preset ? item.preset : item;
}).filter(function(d) {
var preset = d.preset || d;
// skip non-visible
if (preset.addable && !preset.addable()) return false;
// skip presets not valid in this country
if (_countryCode && preset.countryCodes && preset.countryCodes.indexOf(_countryCode) === -1) return false;
return preset.defaultAddGeometry(context, shownGeometry);
}).slice(0, 50);
}