diff --git a/js/iD/graph/Graph.js b/js/iD/graph/Graph.js index e179fa249..666f7eddc 100644 --- a/js/iD/graph/Graph.js +++ b/js/iD/graph/Graph.js @@ -1,6 +1,23 @@ iD.Graph = function(entities, annotation) { if (!(this instanceof iD.Graph)) return new iD.Graph(entities, annotation); this.entities = entities || {}; + for (var id in this.entities) { + if (this.entities[id].type === 'way') { + // top left, bottom right + var extent = [ + [-Infinity, Infinity], + [Infinity, -Infinity]]; + var w = this.fetch(id); + for (var j = 0, l = w.nodes.length; j < l; j++) { + if (w.nodes[j].lon > extent[0][0]) extent[0][0] = w.nodes[j].lon; + if (w.nodes[j].lon < extent[1][0]) extent[1][0] = w.nodes[j].lon; + + if (w.nodes[j].lat < extent[0][1]) extent[0][1] = w.nodes[j].lat; + if (w.nodes[j].lat > extent[1][1]) extent[1][1] = w.nodes[j].lat; + } + this.entities[id]._extent = extent; + } + } this.annotation = annotation; }; @@ -36,18 +53,19 @@ iD.Graph.prototype = { entity.lat < extent[0][1] && entity.lat > extent[1][1]; } + function wayIntersect(entity) { + return entity._extent[0][0] > extent[0][0] && + entity._extent[1][0] < extent[1][0] && + entity._extent[0][1] < extent[0][1] && + entity._extent[1][1] > extent[1][1]; + } for (var i in this.entities) { var entity = this.entities[i]; if (entity.type === 'node' && nodeIntersect(entity)) { items.push(entity); } else if (entity.type === 'way') { var w = this.fetch(entity.id); - for (var j = 0; j < w.nodes.length; j++) { - if (nodeIntersect(w.nodes[j])) { - items.push(w); - break; - } - } + if (wayIntersect(w)) items.push(w); } } return items;