import _ from 'lodash'; import { dataFeatureIcons } from '../../data/index'; import { osmEntity } from '../osm/index'; import { svgPointTransform, svgTagClasses } from './index'; export function svgPoints(projection, context) { function markerPath(selection, klass) { selection .attr('class', klass) .attr('transform', 'translate(-8, -23)') .attr('d', 'M 17,8 C 17,13 11,21 8.5,23.5 C 6,21 0,13 0,8 C 0,4 4,-0.5 8.5,-0.5 C 13,-0.5 17,4 17,8 z'); } function sortY(a, b) { return b.loc[1] - a.loc[1]; } return function drawPoints(selection, graph, entities, filter) { var wireframe = context.surface().classed('fill-wireframe'), points = wireframe ? [] : _.filter(entities, function(e) { return e.geometry(graph) === 'point'; }); points.sort(sortY); var layer = selection.selectAll('.layer-hit'); var groups = layer.selectAll('g.point') .filter(filter) .data(points, osmEntity.key); groups.exit() .remove(); var enter = groups.enter() .append('g') .attr('class', function(d) { return 'node point ' + d.id; }) .order(); enter.append('path') .call(markerPath, 'shadow'); enter.append('ellipse') .attr('cx', 0.5) .attr('cy', 1) .attr('rx', 6.5) .attr('ry', 3) .attr('class', 'stroke'); enter.append('path') .call(markerPath, 'stroke'); enter.append('use') .attr('transform', 'translate(-5, -19)') .attr('class', 'icon') .attr('width', '11px') .attr('height', '11px'); groups = groups .merge(enter) .attr('transform', svgPointTransform(projection)) .call(svgTagClasses()); // Selecting the following implicitly // sets the data (point entity) on the element groups.select('.shadow'); groups.select('.stroke'); groups.select('.icon') .attr('xlink:href', function(entity) { var preset = context.presets().match(entity, graph), picon = preset && preset.icon; if (!picon) return ''; else { var isMaki = dataFeatureIcons.indexOf(picon) !== -1; return '#' + picon + (isMaki ? '-11' : ''); } }); }; }