将一个 GeoJSON 加入到另一个 GeoJSON 中

6

我有一些地理边界,我有一个GeoJSON端点

我还有一些存储在单独的GeoJSON端点中的变量,该端点没有坐标,但是有我之后要用D3进行主题地图制作时需要使用的变量。 这个变量每周更新一次。

这两个响应中都有一个称为lga_name(地方政府区域名称)的公共ID,我正在尝试加入这个ID。似乎有很多关于如何将GeoJSON与CSV合并的示例,但是没有关于如何将GeoJSON与GeoJSON合并的。

我已经尝试过制作一款应用程序,但仍然在连接方面遇到困难。

// Load LGAs from ArcGIS Online (The GeoJSON with geoms)
d3.json("the url to the Geoms", function(error, data) {

// Load Crash Stats from ArcGIS Online (the total persons involved, summarised down to LGA names)
d3.json("the url to the table", function(error, data2) {

        var lga = data.features;
        var crashStats = data2.features;

        // Not working
        var joined =  lga.forEach(function(item) {
            item.properties.LGA_NAME = crashStats[item.properties.lga_name];
        });

有人可以给我一些指针来帮助我入门吗?我只是想学习更多关于D3和Javascript的知识。

1个回答

4
您有数据质量问题,这可能会引起一些麻烦:
  1. 一个JSON文件中的要素名称(lga_name)全是大写字母,但另一个不是。
  2. 一个JSON文件中的要素名称包含诸如“(”或“-”或“Greater”的字符/短语,而另一个则没有。
  3. 有些要素具有坐标,但在另一个JSON文件中没有相应条目(未合并的Vic)。
  4. 在持有非地理属性的JSON文件中似乎存在重复值(您已经说明您想加入,而不是对任何数据求和,我的解决方案只使用一个没有坐标的属性JSON文件中的条目)。
您可以通过不同的方式实现目标(使用第二个JSON文件获取“我想以后主题化地绘制的变量”),我将在此处使用两种不同的方法:
  1. 创建一个有效的GeoJSON文件,其中包含所有要素和属性。
  2. 从坐标JSON文件创建要素,并基于属性JSON文件对它们进行样式设置,使用名称作为公共标识符。
创建一个有效的GeoJSON文件,其中包含所有要素和属性

使用d3.map(),我们可以轻松地添加非地理JSON文件的属性:

var lookup = d3.map(data.features, function(d) { return d.properties.lga_name; });

geographic.features.forEach(function(d) {
  d.properties = lookup.get(d.properties.LGA_NAME).properties;
});

现在您有一个geojson,它具有一个json的属性和另一个json的坐标。由于您的标识符未标准化,因此我创建了一个函数来标准化两个文件之间的名称以使数据正常工作。我还添加了一个检查来确保给定要素存在属性。请参见此 block。
使用d3.map(),您无需实际加入数据即可实现样式。例如,您可以使用以下方式设置填充样式:
var lookup = d3.map(data.features, function(d) { return d.properties.lga_name; });

regions.attr("fill",function(d) { 
    return color(lookup.get(d.properties.LGA_NAME).properties.total_pers); 
    })

由于标识符不规范,我创建了一个函数来标准化两个文件之间的名称。与上面类似,还可以检查非地理json中是否存在要用于样式设置的功能。请参见此


非常感谢。这会让我走上正轨。这更像是一个自学的工作,我可能能够找到两个不同的数据源,它们更加干净。 - jakc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接