我在d3中使用Alan McConchie's块作为基本的mercator地图。我已经让它在当地工作,但我试图过滤地图以排除某些国家(例如南极洲)。
我不想简单地将它从json文件中删除,以防我需要将其恢复,而宁愿找到一个非破坏性的解决方案。从我的挖掘中,我认为有一种方法可以根据国家/地区代码在d3中使用以下代码进行过滤,但根据我使用的示例无法使其工作。我在哪里包含过滤器?在绘制地图之前?数据加载后?
有哪些更好的解决方案可以移除国家?
.data(geo_data.features.filter(d => d.id !== "ATA))
答案 0 :(得分:2)
Array.prototype.filter未就地过滤:
filter()不会改变调用它的数组。
您必须重新分配价值。例如:
geojson.features = geojson.features.filter(d => d.id !== "ATA");
以下是带有更改的bl.ocks(不再是Antarctica):http://bl.ocks.org/anonymous/8ef6910d243e4f7a200cd6c231eb44f1/e63d0a10b4629cdee795660c9fc542207d7dc82f
但是,这将从加载的数据中删除Antarctica。如果您需要非破坏性解决方案,请先进行深度克隆,然后使用过滤器:
var filteredGeojson = JSON.parse(JSON.stringify(geojson));
filteredGeojson.features = filteredGeojson.features.filter(d => d.id !== "ATA");
最后,使用你的代码段......
.data(geojson.features.filter(d => d.id !== "ATA"))
...顺便说一句,工作得很好,你必须创建一个"输入"选择:
svg.selectAll(null)
.data(geojson.features.filter(d => d.id !== "ATA"))
.enter()
.append("path")
.attr("d", function(d){
return path(d)})
});
正如您所看到的,问题在于每个国家/地区都是一条独立的道路,而且我不确定这是否是您想要的:http://bl.ocks.org/anonymous/ae26c13f2ed863afbb905f598a48a0e3/3d7323cf9f016c0e19aa1c1d876e492715105819