过滤d3墨卡托地图

时间:2018-01-12 14:51:57

标签: javascript d3.js maps geojson

我在d3中使用Alan McConchie's块作为基本的mercator地图。我已经让它在当地工作,但我试图过滤地图以排除某些国家(例如南极洲)。

我不想简单地将它从json文件中删除,以防我需要将其恢复,而宁愿找到一个非破坏性的解决方案。从我的挖掘中,我认为有一种方法可以根据国家/地区代码在d3中使用以下代码进行过滤,但根据我使用的示例无法使其工作。我在哪里包含过滤器?在绘制地图之前?数据加载后?

有哪些更好的解决方案可以移除国家?

.data(geo_data.features.filter(d => d.id !== "ATA))

1 个答案:

答案 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