如何向 topojson 文件添加属性?

20

如果有一个名为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,以便两个形状都得到保留。 - Hugolpz
2个回答

18

试着使用这个:

    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": [
            [[2466,9916],[-25,-5],[3,-13]],
            [[2357,9852],[1,-2],[1,-2]]
        ]
    }

来自命令行参考资料维基:

--id-property 功能属性的名称,用于提升为几何标识符

使用此选项和 code_2 属性,您可以将其提升为要素 ID。

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

“加号”:

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

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

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

这就是为什么您必须将 code 添加到 --id-property=code_2,code 选项中。这是如何进行映射的(来自 topojson.jsoncode_2 和来自 data.tsvcode 列)。

然后,输出属性“unemployment”从外部数据文件 unemployment.tsv 生成,该文件定义了输入属性“rate”

在我们的情况下,-p code_2,state=name 指定我们将保留 code_2 属性,并将重命名 name 属性为 state。前面提到的文档维基中的 PropertiesExternal Properties 部分对此问题非常有帮助。


1
如果可以的话,我会+1好几次。 - Hugolpz
1
这个不再起作用了。我有一个 topojson.json 文件,-p 不会添加新属性。它只保留了 geojson 中已经存在的内容。也许我的文件很特别。希望能找到解决方案。 - user3827326
3
你好,我已经查阅了答案并形成了以下命令,但是现在 topojson 已经更名为 geo2topo 命令。geo2topo -o output.json -e data1.csv --id-property=adm1_code,code -p adm1_code,statename=state -- states_topo.json。但是这个命令无法工作。除了 geo2topo 外,是否还有其他命令名称可用于添加额外属性? - AnandSonake
如果我们没有Node,我们如何使用这个命令行解决方案?我只是使用<src=标签来使用topojsonv1.js。除了逐个解析外部属性之外,在文本编辑器/ HTML中有什么可以做的吗? - Arash Howaida
@AnandSonake 我刚刚发布了一个基于当前命令行界面的答案。 - F1refly

1

topojson包已被弃用。以下步骤基于命令行制图工作流程。这些界面更加灵活,但使用起来稍微复杂一些。

安装依赖项:

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"}]

将名称列添加到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文件连接起来:

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上似乎无法正常工作。

这确实是令人惊讶的复杂。 - Hugolpz

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