【问题标题】:How to add properties to topojson file?如何向 topojson 文件添加属性?
【发布时间】:2013-08-26 12:37:21
【问题描述】:

给定一个 data.tsv 文件:

id  code    name
1   AL  Alabama
2   AK  Alaska
4   AZ  Arizona
5   AR  Arkansas
6   CA  California
... ... ...

给定一个 topojson.json 文件:(结构正确,数值随机)

{ 
"type":"Topology",
"transform": 
    {
    "scale": [0.0015484881821515486,0.0010301030103010299],
    "translate":[-5.491666666666662,41.008333333333354]
    },
"objects": 
    {
    "states":
        {
        "type":"GeometryCollection",
        "geometries": 
            [
            {"type":"Polygon","arcs":[[0]],"properties":{"code_2":"AL"}},
            {"type":"Polygon","arcs":[[1]],"properties":{"code_2":"AK"}}
            ]
        }
    },
"arcs":
    [
        [[2466,9916],[-25,-5],[3,-13]],
        [[2357,9852],[1,-2],[1,-2]]
    ]
}

如何使用公共字段(1)将另一个字段(2)的值注入到json文件中?

1]:data.txt#codetopojson.txt.objects.states.geometries.properties.code_2

2]:data.txt#name

最终结果应该包含:

            {"type":"Polygon","arcs":[[0]],"properties":{"code_2":"AL", "name":"Alabama" }},
            {"type":"Polygon","arcs":[[1]],"properties":{"code_2":"AK", "name":"Alaska" }},

编辑:接受的答案:

topojson -o final.json -e data.tsv --id-property=code_2,code -p code_2,state=name -- topojson.json

【问题讨论】:

  • 我稍微编辑了topojson,所以两个形状都被保留了。

标签: json topojson


【解决方案1】:

试试这个:

topojson -o final.json -e data.tsv --id-property=code_2,code -p code_2,state=name -- topojson.json

应该输出:

{
    "type": "Topology",
    "transform": {
        "scale": [
            0.000016880209206372492,
            0.000007005401010148724
        ],
        "translate": [
            -1.8418800213354616,
            51.15278777877789
        ]
    },
    "objects": {
        "states": {
            "type": "GeometryCollection",
            "geometries": [
                {
                    "type": "Polygon",
                    "arcs": [
                        [
                            0
                        ]
                    ],
                    "id": "AK",
                    "properties": {
                        "code_2": "AK",
                        "state": "Alaska"
                    }
                }
            ]
        }
    },
    "arcs": [
        [
            [
                0,
                588
            ],
            [
                92,
                -294
            ],
            [
                91,
                -294
            ],
            [
                -183,
                588
            ]
        ]
    ]
}

来自Command Line Reference wiki

--id-property 要提升为几何 id 的特征属性名称

通过将此选项与 code_2 属性结合使用,您可以将其提升为功能 ID。

在输入属性名称前添加 + 以将其值强制为数字。

加号:

如果 --id-property 引用的属性为空或未定义, 它们在输出几何对象中省略。因此,生成的 如果输入要素没有定义的 ID,则对象可能没有定义的 ID 具有指定名称的属性。

因此,当您使用+code+code_2 时,它们可能是undefined,因为您无法将AK 字符串值转换为数字。

在这里,输入属性“FIPS”被强制转换为数字并用作 特征标识符;同样,名为“FIPS”的列用作 CSV 文件中的标识符。 (如果您的 CSV 文件使用不同的列 特征标识符的名称,可以指定多个id 属性,例如--id-property=+FIPS,+id。)

这就是您必须将code 添加到--id-property=code_2,code 选项的原因。这就是映射的制作方式(topojson.json 中的 code_2data.tsv 中的 code 列)。

然后,输出属性“unemployment”从 外部数据文件,失业.tsv,它定义了输入属性 “率”

在我们的例子中,-p code_2,state=name 指定我们将保留code_2 属性,并将name 属性重命名为state。上述文档 wiki 中的 PropertiesExternal Properties 部分提供了相当丰富的信息。

【讨论】:

  • 如果可以,我会 +1 几次。
  • 这不再有效。我有一个 topojson.json 文件,并且 -p 没有添加新属性。它只保留geojson中已有的内容。也许我的文件是独一无二的。很想找到解决办法。
  • 嗨,我查看了答案并形成了以下命令,但现在 topojson 已重命名为 geo2topo 命令。 geo2topo -o output.json -e data1.csv --id-property=adm1_code,code -p adm1_code,statename=state -- states_topo.json。该命令不起作用。为了添加额外的属性,除了 geo2topo 之外还有不同的命令名称吗?
  • 如果我们没有Node,我们如何使用这个命令行解决方案?我只是在使用<src= 标签来使用 topojsonv1.js 我们可以在文本编辑器中/在 html 中做些什么吗? (除了一次解析一个外部属性)
  • @AnandSonake 我刚刚发布了基于当前命令行界面的答案。
【解决方案2】:

topojson 包已被弃用。以下步骤基于command-line cartography 工作流。这些接口更灵活,但使用起来有点复杂。

安装依赖:

npm install d3-dsv ndjson-cli

将 node_modules/.bin 目录添加到路径中,以便您可以轻松运行命令:

PATH=$(npm bin):$PATH

将 tsv 文件转换为换行符分隔的 json 文件:

tsv2json data.tsv -n > data.ndjson

{"id":"1","code":"AL","name":"Alabama"}
{"id":"2","code":"AK","name":"Alaska"}

将 id 列解析为数字:

ndjson-map '{id: +d.id, code: d.code, name: d.name}' < data.ndjson > data_parsed.ndjson

{"id":1,"code":"AL","name":"Alabama"}
{"id":2,"code":"AK","name":"Alaska"}

提取topojson文件的几何图形:

ndjson-cat topojson.json | ndjson-split 'd.objects.states.geometries' > topojson_geometries.ndjson

{"type":"Polygon","arcs":[[0]],"properties":{"code_2":"AK"}}
{"type":"Polygon","arcs":[[1]],"properties":{"code_2":"AL"}}

加入两个以换行符分隔的 json 文件:

ndjson-join 'd.properties.code_2' 'd.code' topojson_geometries.ndjson data_parsed.ndjson > geometries_data_join.ndjson

[{"type":"Polygon","arcs":[[0]],"properties":{"code_2":"AK"}},{"id":2,"code":"AK","name":"Alaska"}]
[{"type":"Polygon","arcs":[[1]],"properties":{"code_2":"AL"}},{"id":1,"code":"AL","name":"Alabama"}]

将 name 列添加到 topojson 属性并只保留 topojson 几何:

ndjson-map 'd[0].properties.name = d[1].name, d[0]' < geometries_data_join.ndjson > geometries_data_merge.ndjson

{"type":"Polygon","arcs":[[0]],"properties":{"code_2":"AK","name":"Alaska"}}
{"type":"Polygon","arcs":[[1]],"properties":{"code_2":"AL","name":"Alabama"}}

将之前的结果转化为数组,并与原始topojson文件concat:

ndjson-join <(ndjson-cat topojson.json) <(ndjson-reduce < geometries_data_merge.ndjson) > topojson_concat.ndjson

[{
    "type": "Topology",
    "transform": {
        "scale": [0.0015484881821515486, 0.0010301030103010299],
        "translate": [-5.491666666666662, 41.008333333333354]
    },
    "objects": {
        "states": {
            "type": "GeometryCollection",
            "geometries": [{
                    "type": "Polygon",
                    "arcs": [[0]],
                    "properties": {
                        "code_2": "AK"
                    }
                }, {
                    "type": "Polygon",
                    "arcs": [[1]],
                    "properties": {
                        "code_2": "AL"
                    }
                }
            ]
        }
    },
    "arcs": [[[2466, 9916], [-25, -5], [3, -13]], [[2357, 9852], [1, -2], [1, -2]]]
    }, [{
            "type": "Polygon",
            "arcs": [[0]],
            "properties": {
                "code_2": "AK",
                "name": "Alaska"
            }
        }, {
            "type": "Polygon",
            "arcs": [[1]],
            "properties": {
                "code_2": "AL",
                "name": "Alabama"
            }
        }
    ]
]

覆盖原topojson文件的几何图形,保存为普通json文件:

ndjson-map 'd[0].objects.states.geometries = d[1], d[0]' < topojson_concat.ndjson > topojson_data.json

{
    "type": "Topology",
    "transform": {
        "scale": [0.0015484881821515486, 0.0010301030103010299],
        "translate": [-5.491666666666662, 41.008333333333354]
    },
    "objects": {
        "states": {
            "type": "GeometryCollection",
            "geometries": [{
                    "type": "Polygon",
                    "arcs": [[0]],
                    "properties": {
                        "code_2": "AK",
                        "name": "Alaska"
                    }
                }, {
                    "type": "Polygon",
                    "arcs": [[1]],
                    "properties": {
                        "code_2": "AL",
                        "name": "Alabama"
                    }
                }
            ]
        }
    },
    "arcs": [[[2466, 9916], [-25, -5], [3, -13]], [[2357, 9852], [1, -2], [1, -2]]]
}

一行中的所有命令:

ndjson-join <(ndjson-cat topojson.json) <(ndjson-join 'd.properties.code_2' 'd.code' <(ndjson-cat topojson.json | ndjson-split 'd.objects.states.geometries') <(tsv2json data.tsv -n | ndjson-map '{id: +d.id, code: d.code, name: d.name}') | ndjson-map 'd[0].properties.name = d[1].name, d[0]' | ndjson-reduce) | ndjson-map 'd[0].objects.states.geometries = d[1], d[0]' > topojson_data.json

注意事项:

  • 我在 topojson 文件中交换了“AK”和“AL”来检查连接是否真的有效。
  • 最后一个命令(单行之前)仅适用于原始输出,而不适用于给定的漂亮打印版本,其中包含换行符。
  • 我在 Linux 子系统上测试了工作流,因为 ndjson-map 目前在 Windows 上似乎无法正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多