Skeletal demo for d3.geoVoronoi
by Philippe Rivière.
| license: mit |
Skeletal demo for d3.geoVoronoi
by Philippe Rivière.
| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <style> | |
| #sphere { | |
| fill: #fff; | |
| stroke: #444; | |
| stroke-width: 2; | |
| } | |
| .polygons { | |
| stroke: #444; | |
| } | |
| .links { | |
| stroke: white; | |
| stroke-width: 2.5; | |
| fill: none; | |
| } | |
| .links .secondary { | |
| stroke-width: .5; | |
| stroke-dasharray: 3 1; | |
| } | |
| .sites { | |
| stroke: black; | |
| fill: white; | |
| } | |
| #legend { | |
| position: absolute; | |
| top: 15; | |
| left: 15; | |
| font-family: sans-serif; | |
| } | |
| </style> | |
| <div id="legend"> | |
| Delaunay links<br> | |
| Urquart graph in bold | |
| </div> | |
| <svg width="960" height="600"></svg> | |
| <script src="https://d3js.org/d3.v5.min.js"></script> | |
| <script src="https://unpkg.com/d3-delaunay@5"></script> | |
| <script src="https://unpkg.com/d3-geo-voronoi@1.5"></script> | |
| <script> | |
| var points = { | |
| type: "FeatureCollection", | |
| features: d3.range(100).map(function() { | |
| return { | |
| type: "Point", | |
| coordinates: [ 360 * Math.random(), 90 * (Math.random() - Math.random()) ] | |
| } | |
| }) | |
| } | |
| var v = d3.geoVoronoi()(points); | |
| var projection = d3.geoOrthographic(), | |
| path = d3.geoPath().projection(projection); | |
| var svg = d3.select("svg"); | |
| svg.append('path') | |
| .attr('id', 'sphere') | |
| .datum({ type: "Sphere" }) | |
| .attr('d', path); | |
| svg.append('g') | |
| .attr('class', 'polygons') | |
| .selectAll('path') | |
| .data(v.polygons().features) | |
| .enter() | |
| .append('path') | |
| .attr('d', path) | |
| .attr('fill', function(_,i) { return d3.schemeCategory10[i%10]; }); | |
| svg.append('g') | |
| .attr('class', 'links') | |
| .selectAll('path') | |
| .data(v.links().features) | |
| .enter() | |
| .append('path') | |
| .classed('secondary', function(d) { | |
| return !d.properties.urquhart; | |
| }) | |
| .attr('d', path); | |
| svg.append('g') | |
| .attr('class', 'sites') | |
| .selectAll('path') | |
| .data(points.features) | |
| .enter() | |
| .append('path') | |
| .attr('d', path); | |
| // gentle animation | |
| if(false)d3.interval(function(elapsed) { | |
| projection.rotate([ elapsed / 150, 0 ]); | |
| svg.selectAll('path') | |
| .attr('d', path); | |
| }, 50); | |
| </script> |