Topojson添加外部属性而没有任何明显的映射上下文

时间:2019-03-30 10:08:43

标签: json topojson

目标是将外部属性添加到topojson。我已经成功地将来自各个国家的http://www.diva-gis.org/gdata的shapefile转换为json文件。我还成功地将这些文件降采样为更前端友好的文件大小。像这样:

shp2json CHN_adm0.shp --out CHN_adm0.json
geo2topo CHN_adm0.json > china.json
shp2json CHN_adm1.shp --out CHN_adm1.json
geo2topo CHN_adm1.json > china.json
toposimplify -s 1e-9 -f < china.json > china-topo.json
toposimplify -s 1e-9 -f < china1.json > china1-topo.json

然后,我将国家/地区级多边形与省/州级多边形合并。如果this是正确的,也许这是我可以附加外部属性的地方,但是正如您将看到的,我可能还有其他障碍:

geo2topo regions=CHN_adm1.json country=CHN_adm0.json > china-regions-topo.json
toposimplify -s 1e-9 -f < china-regions-topo.json > china-regions.json

目前我不确定的是如何将属性附加到diva-gis的数据中。这是dict / object以及我的china-regions.json最终结果的相关键的示例切片(注意:我正在使用python探索json文件,但我实际上并不会使用python做任何事情其他问题):

len(json['objects']['regions']['geometries'])
>> 31 ## 31 provinces in China

json_data['objects']['regions'].keys()

>> dict_keys(['type', 'bbox', 'geometries']) ## seems like there is nothing to map to, like an id or province name

问题

如何将外部属性添加到已从diva-gis的shapefile转换为的topojson中?似乎没有内容可以映射。浏览数据后,我什至不知道哪个省。这只是弧的列表-可以在地图上绘制得足够好,但是人类无法直观地辨别哪个省。

进一步的说明:

  • 外部属性格式是任意的;想象一下一个带有省名和数字的csv,例如省人口。
  • 不反对添加肘部润滑脂,但我想尽可能避免反复试验
  • json文件中区域的顺序未知。不确定diva-gis是否会遵循任何特定约定(字母顺序等)

1 个答案:

答案 0 :(得分:0)

您即将找到一个标识符-它们通常是每种几何形状的大子代:

topojson.objects.regions[n].geometry.properties.property // where property is a column in the original shapefile.

对于shp2json,您不能使用--geometry或--ignore-properties,否则您将忽略dbf文件。 dbf文件包含每个功能的属性

这些属性是shapefile属性表的列。如果您在此处没有任何内容,则表示转换过程中没有包含保存此数据的dbf文件。

仅使用javascript,我可能会通过以下方式获得每个几何的属性列表:

    // Get the geometries:
    var regions = data.objects.regions.geometries;

    // List of properties present (in first element anyways):
    console.log(Object.keys(regions[0].properties));

要使用javascript和d3的map方法添加新属性,我可以使用:

    // Create a map to look up regions:
    var map = d3.map(regions, function(d) { return d.properties.NAME_1; });

    // Get by Name_1:
    console.log(map.get("ExampleName"));        

    // New data to join to topojson:
    var dataToAttach = [
        { region: "A", capital: "X" },
        { region: "B", capital: "Y" },
        { region: "C", capital: "Z"}  //...
    ]

    // Add new property:
    dataToAttach.forEach(function(d) {
      map.get(d.region).capital = d.capital;
    })

这里最常见的问题是标识符与您要加入的表格数据不完全匹配,或者根本不匹配,这通常需要修补。

Here's的上述实现(尽管在客户端中),使用数据并将数据添加到根据diva gis数据创建的topojson中。