我正在加载一个GeoJSON数据文件,该文件包含一个对象数组,每个对象包含不同国家轮廓的矢量信息。同一个数组元素被绑定到每个DOM元素。我以前在JavaScript中遇到过这个作用域问题,但我所做的每次更改都不会导致加载。
我附加了一个jsfiddle。我使用了一个示例数据文件,它似乎需要几秒钟才能加载。
jsfiddle的代码如下:
$(document).ready(function() {
d3.json(
"https://raw.githubusercontent.com/datasets/geo-boundaries-world-110m/master/countries.geojson",
function(error, data) {
var myGeoJSON = data.features;
for (i = 0; i < myGeoJSON.length; i++) {
var path = d3.geo.path();
var width = 960;
var height = 600;
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
svg.selectAll("path")
.data(data.features)
.enter().append("path")
.attr("d",path)
.attr("fill","#3e429a");
}
}
);
});
您不需要遍历特征数组。你的数据文件是一个featurecall, D3可以绘制,或者作为一个单一的路径元素:
svg.append("path").datum(data).attr("d", d3.geo.path());
或作为单独的路径元素,每个特征(国家)一个:
svg.selectAll("path").data(data.features)
.enter().append("path").attr("d", d3.geo.path())
默认情况下,D3使用d3.geo.albersUsa()
投影,将夏威夷带到墨西哥,将阿拉斯加带到热带之外。您可以切换到等矩形投影来查看整个世界:
d3.json(
"https://raw.githubusercontent.com/datasets/geo-boundaries-world-110m/6cf0946a0f4d027d21686e8402f19b524c4f6385/countries.geojson",
function(error, data) {
var projection = d3.geo.equirectangular();
var path = d3.geo.path().projection(projection);
var width = 960;
var height = 600;
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
svg.selectAll("path")
.data(data.features)
.enter().append("path")
.attr("d", path)
.attr("fill", "#3e429a");
}
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
尾声:我最初尝试使用更常见的墨卡托投影,结果发现它无法处理南极洲。D3绘制了大陆的形状,然后填充了海洋的其余部分。
在同一个D3论坛线程中,D3的作者提到了用于生成地图的TopoJSON工具中的一个bug,所以它可能是您使用的数据文件的问题。如果您更喜欢墨卡托,您可能需要与geo- bounds -world-110m的维护人员合作来修复数据文件,或者直接从您的地图中排除南极洲。
南极洲在墨卡托的演示:
d3.json(
"https://raw.githubusercontent.com/datasets/geo-boundaries-world-110m/6cf0946a0f4d027d21686e8402f19b524c4f6385/countries.geojson",
function(error, data) {
var projection = d3.geo.mercator();
var path = d3.geo.path().projection(projection);
var width = 960;
var height = 600;
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
var antarctica = data.features.splice(6, 1);
// now "data" has the rest of the world
svg.selectAll("path")
.data(antarctica)
.enter().append("path")
.attr("d", path)
.attr("stroke", "red").attr("stroke-width", 10)
// thick borders so we can see the odd paths
.attr("fill", "#3e429a");
}
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>