Files
iD/js/id/svg/midpoints.js
Ansis Brammanis df465f73f9 more careful about not drawing midpoints
in the case where all vertices were out of bounds it would
assume there were many hidden vertices
2013-03-28 19:01:51 -04:00

66 lines
2.1 KiB
JavaScript

iD.svg.Midpoints = function(projection) {
return function drawMidpoints(surface, graph, entities, filter, extent) {
var midpoints = {};
var vertices = 0;
for (var i = 0; i < entities.length; i++) {
if (entities[i].geometry(graph) === 'vertex' && vertices++ > 2000) {
return surface.selectAll('.layer-hit g.midpoint').remove();
}
if (entities[i].type !== 'way') continue;
var entity = entities[i],
nodes = graph.childNodes(entity);
// skip the last node because it is always repeated
for (var j = 0; j < nodes.length - 1; j++) {
var a = nodes[j],
b = nodes[j + 1],
id = [a.id, b.id].sort().join('-');
// If neither of the nodes changed, no need to redraw midpoint
if (!midpoints[id] && (filter(a) || filter(b))) {
var loc = iD.geo.interp(a.loc, b.loc, 0.5);
if (extent.intersects(loc) && iD.geo.dist(projection(a.loc), projection(b.loc)) > 40) {
midpoints[id] = {
type: 'midpoint',
id: id,
loc: loc,
edge: [a.id, b.id]
};
}
}
}
}
var groups = surface.select('.layer-hit').selectAll('g.midpoint')
.filter(filter)
.data(_.values(midpoints), function(d) { return d.id; });
var group = groups.enter()
.insert('g', ':first-child')
.attr('class', 'midpoint');
group.append('circle')
.attr('r', 7)
.attr('class', 'shadow');
group.append('circle')
.attr('r', 3)
.attr('class', 'fill');
groups.attr('transform', iD.svg.PointTransform(projection));
// Propagate data bindings.
groups.select('circle.shadow');
groups.select('circle.fill');
groups.exit()
.remove();
};
};