-
Notifications
You must be signed in to change notification settings - Fork 0
Map Widget
David Jin edited this page Jun 30, 2023
·
2 revisions
| Visualization type | Description |
|---|---|
| Chrolopleth Map | This visualization uses the contributor metadata from Extracted Features along with the Wikidata API to map where contributors (authors, translators, editors, etc.) of texts in a workset were born. |
/src/components/widgets/ChorloplethMap/index.tsx
/src/components/CustomSlider.tsx
Once get the data from Wiki and import it from the Redux store, using React Hook and useEffect we get the cities array which have city name, coordinate to display markers on the Map.
It uses countries-50m.json under public folder to render a Choropleth map.
Map container, using ref we handle this DOM and append SVG to this.
<div id="graph-container" ref={inputRef} />const container = d3.select(inputRef.current);Get cities to show markers on the Map.
const cities = useMemo(() => {
const cityMap = mapDataHistogram.reduce((map, item) => {
if (item.city.trim() === '' || item.cityCoords.trim() === '') {
return map;
}
const coords = item.cityCoords.replace('Point(', '').replace(')', '').split(' ');
const city = map.get(item.city) || { name: item.city, coordinates: [parseFloat(coords[0]), parseFloat(coords[1])], population: 0 };
city.population++;
return map.set(item.city, city);
}, new Map());
const cities = Array.from(cityMap.values());
return cities;
}, [mapDataHistogram]);Draw markers on the map SVG and handle zoom.
// Append markers
const markersG = svg
.append('g')
// .attr('transform', 'translate(0, 0) scale(0.5)')
.selectAll('.marker')
.data(cities)
.enter()
.append('circle')
.attr('class', 'marker')
.attr('cx', (d) => projection(d.coordinates)[0])
.attr('cy', (d) => projection(d.coordinates)[1])
.attr('r', (d) => (8 / maxPopulation) * d.population)
// .attr('r', (d) => (maxPopulation > 8 ? (8 / maxPopulation) * d.population : d.population * 1.5))
.each(function (d) {
d.initialRadius = d3.select(this).attr('r');
})
.attr('fill', '#E91E63')
.attr('stroke', '#FFFFFF')
.on('mouseover', (event, d) => handleMarkerClick(event, d))
.on('mouseout', () => {
const div = d3.select('#tooltip');
div.style('opacity', 0);
});
svg.call(zoom);
function zoomed(event) {
const { transform } = event;
g.attr('transform', transform);
g.attr('stroke-width', 1 / transform.k);
markersG.attr('transform', transform);
markersG.attr('stroke-width', 1 / transform.k);
markersG.attr('r', (d) => d.initialRadius / transform.k);
}