Improved quadtree clustering in d3.carto.map allows for more seamless integration with hierarchical D3 layouts like Pack & Tree.
If you set the .cluster() property of a cartoLayer to true, it will cluster bsaed on a precomputed quadtree. Along with clustering, it appends "children" attributes of every point, which allows it to be passed to a hierarchical layout, as is done here with circle-packing.
A hierarchical infoviz layout like circle-packing shows the hierarchical structure of clustered cities, so that you can get a sense not only of the density of cities, but also the distribution.
xxxxxxxxxx
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<title>d3.carto.map - Improved Circle Pack Clustering</title>
<meta charset="utf-8" />
<link type="text/css" rel="stylesheet" href="d3map.css" />
<link type="text/css" rel="stylesheet" href="https://raw.githubusercontent.com/emeeks/d3-carto-map/master/examples/example.css" />
</head>
<style>
html,body {
height: 100%;
width: 100%;
margin: 0;
}
#map {
height: 100%;
width: 100%;
position: absolute;
}
</style>
<script>
function makeSomeMaps() {
map = d3.carto.map();
d3.select("#map").call(map);
tileLayer = d3.carto.layer();
tileLayer
.type("tile")
.path("elijahmeeks.map-azn21pbi")
.label("Base")
csvLayer = d3.carto.layer.csv();
csvLayer
.path("all_sites.csv")
.label("CSV Points")
.cssClass("pinkcircle")
.renderMode("svg")
.markerSize(2)
.x("xcoord")
.y("ycoord")
.on("recluster", clusterPack)
.cluster(true);
map.addCartoLayer(tileLayer).addCartoLayer(csvLayer);
map.centerOn([100,30],"latlong").setScale(3);
function clusterPack() {
clusterLayer = csvLayer.clusterLayer();
clusterLayer.g().selectAll("g.marker").selectAll("*").remove();
packChart = d3.layout.pack();
packChart.size([15,15])
.value(function(d) {return 1});
clusterLayer.g().selectAll("g.marker")
.each(function(d) {
d3.select(this).selectAll("circle")
.data(packChart(d))
.enter()
.append("circle")
.style("stroke", "black")
.style("stroke-width", function(p) {return p.leaf ? 0 : 1})
.attr("cx", function(p) {return p.x - 5})
.attr("cy", function(p) {return p.y - 5})
.attr("r", function(p) {return p.r})
.style("fill", function(p) {return p.leaf ? "darkred" : "#FFE6E6"})
})
}
}
</script>
<body onload="makeSomeMaps()">
<div id="map"></div>
<footer>
<script src="https://d3js.org/d3.v3.min.js" charset="utf-8" type="text/javascript"></script>
<script src="https://d3js.org/topojson.v1.min.js" type="text/javascript">
</script>
<script src="https://d3js.org/d3.geo.projection.v0.min.js" type="text/javascript">
</script>
<script src="/emeeks/f3105fda25ff785dc5ed/example/tile.js" type="text/javascript">
</script>
<script src="/emeeks/f3105fda25ff785dc5ed/example/d3.quadtiles.js" type="text/javascript">
</script>
<script src="/emeeks/f3105fda25ff785dc5ed/example/d3.geo.raster.js" type="text/javascript">
</script>
<script src="https://cdn.jsdelivr.net/gh/emeeks/d3-carto-map/d3.carto.map.js" type="text/javascript">
</script>
</footer>
</body>
</html>
Modified http://d3js.org/d3.v3.min.js to a secure url
Modified http://d3js.org/topojson.v1.min.js to a secure url
Modified http://d3js.org/d3.geo.projection.v0.min.js to a secure url
Updated missing url http://bl.ocks.org/emeeks/raw/f3105fda25ff785dc5ed/tile.js to /emeeks/f3105fda25ff785dc5ed/example/tile.js
Updated missing url http://bl.ocks.org/emeeks/raw/f3105fda25ff785dc5ed/d3.quadtiles.js to /emeeks/f3105fda25ff785dc5ed/example/d3.quadtiles.js
Updated missing url http://bl.ocks.org/emeeks/raw/f3105fda25ff785dc5ed/d3.geo.raster.js to /emeeks/f3105fda25ff785dc5ed/example/d3.geo.raster.js
Updated missing url https://rawgit.com/emeeks/d3-carto-map/master/d3.carto.map.js to https://cdn.jsdelivr.net/gh/emeeks/d3-carto-map/d3.carto.map.js
https://d3js.org/d3.v3.min.js
https://d3js.org/topojson.v1.min.js
https://d3js.org/d3.geo.projection.v0.min.js
https://bl.ocks.org/emeeks/raw/f3105fda25ff785dc5ed/tile.js
https://bl.ocks.org/emeeks/raw/f3105fda25ff785dc5ed/d3.quadtiles.js
https://bl.ocks.org/emeeks/raw/f3105fda25ff785dc5ed/d3.geo.raster.js
https://rawgit.com/emeeks/d3-carto-map/master/d3.carto.map.js