-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.js
194 lines (160 loc) · 5.34 KB
/
script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
/*
Parses us-county-names.tsv into components.
Used by d3.tsv() function.
*/
function parseCountyName(row) {
return {
id: +row.id,
name: row.name.trim()
};
}
/*
Parses us-state-names.tsv into components.
Used by d3.tsv() function.
*/
function parseStateName(row) {
return {
id: +row.id,
name: row.name.trim(),
code: row.code.trim().toUpperCase()
};
}
/*
Non-robust function to update lookup IDs based
on passed in data. Does no error checking!
*/
function updateNameLookup(lookup, data) {
data.forEach(function(element) {
lookup[element.id] = element.name;
// Lets you lookup the ID of a state
// by its code (2-letter abbreviation)
if (element.hasOwnProperty("code")) {
lookup[element.code] = element.id;
}
});
return lookup;
}
function drawCountry(data, id) {
// get the svg by id
var svg = d3.select("svg#" + id);
// gets the width and height of an html-level element
var bbox = svg.node().getBoundingClientRect();
// get the default albers USA projection
var projection = d3.geo.albersUsa()
.scale(bbox.width)
.translate([bbox.width / 2, bbox.height / 2]);
// get a path generator function for our projection
var path = d3.geo.path().projection(projection);
// add a plot group
var plot = svg.append("g");
// append the land path
plot.append("path")
// get the data from topojson
.datum(topojson.feature(data, data.objects.land))
// call the path generator
.attr("d", path)
.classed({"land": true, "outline": true});
}
function drawStates(data, id) {
// get the svg by id
var svg = d3.select("svg#" + id);
// gets the width and height of an html-level element
var bbox = svg.node().getBoundingClientRect();
// get the default albers USA projection
var projection = d3.geo.albersUsa()
.scale(bbox.width)
.translate([bbox.width / 2, bbox.height / 2]);
// get a path generator function for our projection
var path = d3.geo.path().projection(projection);
// add a plot group
var plot = svg.append("g");
// append the land path
plot.append("path")
// get the data from topojson
.datum(topojson.feature(data, data.objects.land))
// call the path generator
.attr("d", path)
.classed({"land": true, "outline": true});
// use this to plot non-overlapping boundaries only (no fill)
plot.append("path")
.datum(topojson.mesh(data, data.objects.states,
function(a, b) { return a !== b; }))
.attr("d", path)
.classed("state", true);
}
function drawCounties(data, id) {
// get the svg by id
var svg = d3.select("svg#" + id);
// gets the width and height of an html-level element
var bbox = svg.node().getBoundingClientRect();
// get the default albers USA projection
var projection = d3.geo.albersUsa()
.scale(bbox.width)
.translate([bbox.width / 2, bbox.height / 2]);
// get a path generator function for our projection
var path = d3.geo.path().projection(projection);
// add a plot group
var plot = svg.append("g");
// append the land background
plot.append("path")
// get the data from topojson
.datum(topojson.feature(data, data.objects.land))
// call the path generator
.attr("d", path)
.classed("land", true);
// use this to plot fillable shapes
plot.selectAll("path")
.data(topojson.feature(data, data.objects.counties).features)
.enter()
.append("path")
.attr("d", path)
.classed("county", true);
// plot land outline on top
plot.append("path")
// get the data from topojson
.datum(topojson.mesh(data, data.objects.land))
// call the path generator
.attr("d", path)
.classed("outline", true)
.style("fill", "none");
}
function drawFinal(data, id) {
// get the svg by id
var svg = d3.select("svg#" + id);
// gets the width and height of an html-level element
var bbox = svg.node().getBoundingClientRect();
// get the default albers USA projection
var projection = d3.geo.albersUsa()
.scale(bbox.width)
.translate([bbox.width / 2, bbox.height / 2]);
// get a path generator function for our projection
var path = d3.geo.path().projection(projection);
// add a plot group
var plot = svg.append("g");
// append the land background
plot.append("path")
// get the data from topojson
.datum(topojson.feature(data, data.objects.land))
// call the path generator
.attr("d", path)
.classed("land", true);
// use this to plot fillable shapes
plot.selectAll("path")
.data(topojson.feature(data, data.objects.counties).features)
.enter()
.append("path")
.attr("d", path)
.classed("county", true)
.on("click", function(d) {
// assumes nameLookup is defined somewhere
console.log(nameLookup[d.id], d);
});
// plot land outline on top
plot.append("path")
// get the data from topojson
.datum(topojson.mesh(data, data.objects.land))
// call the path generator
.attr("d", path)
.classed("outline", true)
.style("fill", "none");
}