function province3D(province, party, tooltip) {
let province_code = province.properties.PROVCODE;
let h = 15000 * prov_proportion(province_code, party);
let all_pts = Object.values(province.pts);
let all_triangles = Object.values(province.triangles);
let all_segments = Object.values(province.segments);
let g = d3
.create('group')
.attr('class', `${province_code} province`)
.attr('title', province_code);
let color = province_color(province_code, party);
let pt_strings = all_pts.map(function(pts) {
let pt_string_top = '';
let pt_string_bot = '';
pts.forEach(function(pt) {
pt_string_top = `${pt_string_top}${pt[0]} ${pt[1]} ${h}, `;
pt_string_bot = `${pt_string_bot}${pt[0]} ${pt[1]} 0, `;
});
return pt_string_top + pt_string_bot;
});
all_triangles.forEach(function(triangles, idx) {
let top_coord_string = '';
triangles.forEach(function(t) {
top_coord_string = `${top_coord_string}${t[0]} ${t[1]} ${t[2]} -1 `;
});
let ifsShape = g.append('shape');
let appearance = ifsShape.append('appearance');
appearance.append('material').attr('diffuseColor', color);
let ifs = ifsShape
.append('IndexedFaceSet')
.attr('solid', 'false')
.attr('coordIndex', top_coord_string);
ifs
.append('coordinate')
.attr('class', 'top')
.attr('point', pt_strings[idx]);
});
all_segments.forEach(function(segments, idx) {
let side_coord_string = '';
let outline_coord_string = '';
let n = all_pts[idx].length;
segments.forEach(function(s) {
side_coord_string = `${side_coord_string}${s[0]} ${s[1]} ${s[1] +
n} ${s[0] + n} -1 `;
outline_coord_string = `${outline_coord_string}${s[0]} ${s[1]} -1 `;
});
let ifsShape = g.append('shape');
let appearance = ifsShape.append('appearance');
appearance
.append('material')
.attr('diffuseColor', color)
.attr('shininess', 0.6);
let ifs = ifsShape
.append('IndexedFaceSet')
.attr('solid', 'false')
.attr('coordIndex', side_coord_string);
ifs
.append('coordinate')
.attr('class', 'side')
.attr('point', pt_strings[idx]);
let ilsShape = g.append('shape');
let ils = ilsShape
.append('IndexedLineSet')
.attr('coordIndex', outline_coord_string)
.append('coordinate')
.attr('class', 'outline')
.attr('point', pt_strings[idx]);
});
g.node().onclick = function() {
tooltip
.transition()
.duration(200)
.style("opacity", .9);
tooltip.html(
`${province_code}: ${Math.round(
100 * prov_proportion(province_code, global_party.party)
)}%`
);
};
return g.node();
}