我有一些关于D3中地图缩放和平移的代码,但是性能非常差。在缩放和平移时,刷新需要近3秒时间。我认为将所有县/市的线条边界包括在内会让地图看起来更好,但是6MB+的数据可能正是瓶颈所在。是否有其他处理转换的方式,或者优化地图数据的方法?D3是否不适用于这种详细级别?我对D3非常陌生。
我正在使用从此处下载的shape文件,使用QGIS从DBF格式转换为Geojson: https://www.census.gov/cgi-bin/geo/shapefiles2010/main
我正在使用从此处下载的shape文件,使用QGIS从DBF格式转换为Geojson: https://www.census.gov/cgi-bin/geo/shapefiles2010/main
<!doctype html>
<html>
<head>
<title>d3 map</title>
<script src="http://d3js.org/d3.v3.min.js">
</script>
</head>
<body>
<script>
var width = 800;
var height = 600;
var projection = d3.geo.mercator();
var path = d3.geo.path().projection (projection);
var canvas = d3.select ("body")
.append ("svg")
.attr ("width", width)
.attr ("height", height)
var zoomVar = d3.behavior.zoom()
.translate(projection.translate())
.scale(projection.scale())
.scaleExtent([height, 60 * height])
.on("zoom", onPostZoom);
var hotbox = canvas.append("g").call(zoomVar);
hotbox.append("rect")
.attr("class", "background")
.attr("width", width)
.attr("fill", "white")
.attr("height", height);
d3.json ("cali.geojson", function (data)
{
hotbox.append("g")
.attr("id", "geometry")
.selectAll("path")
.data(data.features)
.enter()
.append("path")
.attr("d", path)
.attr("fill", "steelblue")
.on("click", onClick);
})
function onClick (d)
{
var centroid = path.centroid(d), translate = projection.translate();
projection.translate(
[translate[0] - centroid[0] + width / 2,
translate[1] - centroid[1] + height / 2 ]);
zoomVar.translate(projection.translate());
hotbox.selectAll("path").transition()
.duration(700)
.attr("d", path);
}
function onPostZoom()
{
projection.translate(d3.event.translate).scale(d3.event.scale);
hotbox.selectAll("path").attr("d", path);
}
</script>
</body>
</html>
topojson
命令行工具(适用于Linux)将您的shapefile或GeoJSON转换为TopoJSON文件。然后,您可以使用topojson.js客户端库将其转换回浏览器中的GeoJSON,以便您可以使用D3或其他库进行渲染。 - mbostock