Commit 7a14bc18c2613eec116e95b5ded85d95cf0074a5
1 parent
561e9392
Exists in
master
chore: refactor world plot
Showing
1 changed file
with
93 additions
and
0 deletions
Show diff stats
... | ... | @@ -0,0 +1,93 @@ |
1 | +/** | |
2 | + * Draws a SVG in the DOM element identified by `containerSelector`. | |
3 | + * | |
4 | + * Issues | |
5 | + * ------ | |
6 | + * | |
7 | + * - No Zoom (spent 4h on this already) | |
8 | + * - No animations (wait 'til it's polished) | |
9 | + * | |
10 | + * @param containerSelector string | |
11 | + * CSS selector, like "#d3viz" | |
12 | + * @param worldDataUrl | |
13 | + * A JSON file with reusable world data. | |
14 | + * @see /static/public/data/world-earth.geojson | |
15 | + * @param travelsDataUrl | |
16 | + * A CSV file with rows of | |
17 | + * - origin_lon | |
18 | + * - origin_lat | |
19 | + * - destination_lon | |
20 | + * - destination_lat | |
21 | + */ | |
22 | +function draw_travel_legs_worldmap(containerSelector, worldDataUrl, travelsDataUrl) { | |
23 | + | |
24 | + document.addEventListener('DOMContentLoaded', () => { | |
25 | + const margin = {top: 0, right: 0, bottom: 0, left: 0}; | |
26 | + // var width = $(containerSelector).parent().width(); | |
27 | + // var height = width - margin.top - margin.bottom; | |
28 | + // let width = width - margin.left - margin.right; | |
29 | + //{#var height = Math.max(300, 600) - margin.top - margin.bottom;#} | |
30 | + //{#var width = Math.max(880, $(containerSelector).parent().width());#} | |
31 | + | |
32 | + const size_ratio = 0.85; | |
33 | + let width = 629.0 * size_ratio; | |
34 | + let height = 604.0 * size_ratio; | |
35 | + //{#width = 500.0;#} | |
36 | + //{#height = 400.0;#} | |
37 | + | |
38 | + let offset_x = 0.0; | |
39 | + let offset_y = 0.0; | |
40 | + | |
41 | + const svg = d3.select(containerSelector) | |
42 | + .append("svg") | |
43 | + .attr("width", width + margin.left + margin.right) | |
44 | + .attr("height", height + margin.top + margin.bottom); | |
45 | + | |
46 | + const projection = d3.geoMercator() | |
47 | + .scale(85) | |
48 | + .translate([width / 2.0 + offset_x, height / 2.0 + offset_y]); | |
49 | + | |
50 | + const geopath = d3.geoPath().projection(projection); | |
51 | + | |
52 | + function draw_from_data(worldData, legsData) { | |
53 | + const link = []; | |
54 | + legsData.forEach(function (row) { | |
55 | + source = [+row.origin_lon, +row.origin_lat]; | |
56 | + target = [+row.destination_lon, +row.destination_lat]; | |
57 | + topush = {type: "LineString", coordinates: [source, target]}; | |
58 | + link.push(topush); | |
59 | + }); | |
60 | + | |
61 | + svg.append("g") | |
62 | + .selectAll("path") | |
63 | + .data(worldData.features) | |
64 | + .enter() | |
65 | + .append("path") | |
66 | + .attr("fill", "#b8b8b8") | |
67 | + .attr("d", geopath) | |
68 | + .style("stroke", "#fff") | |
69 | + .style("stroke-width", 0); | |
70 | + | |
71 | + svg.selectAll("myPath") | |
72 | + .data(link) | |
73 | + .enter() | |
74 | + .append("path") | |
75 | + .attr("d", geopath) | |
76 | + // .attr("d", function (d) { | |
77 | + // return geopath(d); | |
78 | + // }) | |
79 | + .style("fill", "none") | |
80 | + .style("stroke", "#69b3a2") | |
81 | + .style("stroke-width", 2); | |
82 | + | |
83 | + } | |
84 | + | |
85 | + const worldDataPromise = d3.json(worldDataUrl); | |
86 | + const travelsDataPromise = d3.csv(travelsDataUrl); | |
87 | + Promise.all([worldDataPromise, travelsDataPromise]).then((values) => { | |
88 | + draw_from_data(values[0], values[1]); | |
89 | + }); | |
90 | + | |
91 | + }); | |
92 | + | |
93 | +} | |
0 | 94 | \ No newline at end of file | ... | ... |