diff --git a/js/id/ui/preset/address.js b/js/id/ui/preset/address.js index 1c471cbcb..ae6352f8e 100644 --- a/js/id/ui/preset/address.js +++ b/js/id/ui/preset/address.js @@ -8,7 +8,6 @@ iD.ui.preset.address = function(field, context) { entity; function getStreets() { - var extent = entity.extent(context.graph()), l = extent.center(), box = iD.geo.Extent(l).padByMeters(200); @@ -34,6 +33,62 @@ iD.ui.preset.address = function(field, context) { } } + function getCities() { + var extent = entity.extent(context.graph()), + l = extent.center(), + box = iD.geo.Extent(l).padByMeters(200); + + return context.intersects(box) + .filter(isAddressable) + .map(function(d) { + return { + title: d.tags['addr:city'] || d.tags.name, + value: d.tags['addr:city'] || d.tags.name, + dist: iD.geo.sphericalDistance(d.extent(context.graph()).center(), l) + }; + }).sort(function(a, b) { + return a.dist - b.dist; + }); + + function isAddressable(d) { + if (d.tags.name && + (d.tags.admin_level === '8' || d.tags.border_type === 'city')) + return true; + + if (d.tags.place && d.tags.name && ( + d.tags.place === 'city' || + d.tags.place === 'town' || + d.tags.place === 'village')) + return true; + + if (d.tags['addr:city']) return true; + + return false; + } + } + + function getPostCodes() { + var extent = entity.extent(context.graph()), + l = extent.center(), + box = iD.geo.Extent(l).padByMeters(200); + + return context.intersects(box) + .filter(isAddressable) + .map(function(d) { + return { + title: d.tags['addr:postcode'], + value: d.tags['addr:postcode'], + dist: iD.geo.sphericalDistance(d.extent(context.graph()).center(), l) + }; + }).sort(function(a, b) { + return a.dist - b.dist; + }); + + function isAddressable(d) { + return d.tags['addr:postcode']; + } + } + function address(selection) { var wrap = selection.selectAll('.preset-input-wrap') .data([0]); @@ -86,6 +141,18 @@ iD.ui.preset.address = function(field, context) { .fetcher(function(value, callback) { callback(getStreets()); })); + + city + .call(d3.combobox() + .fetcher(function(value, callback) { + callback(getCities()); + })); + + postcode + .call(d3.combobox() + .fetcher(function(value, callback) { + callback(getPostCodes()); + })); } function change() {