给定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#code
和topojson.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
发布于 2013-08-26 23:59:58
尝试使用以下命令:
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
]
]
]
}
-- id - property 要提升为几何id的要素属性的名称
通过将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.json的code_2
和来自data.tsv的code
列)。
然后,从外部数据文件unemployment.tsv生成输出属性“
”,该文件定义了输入属性"rate“。
在我们的示例中,-p code_2,state=name
指定我们将保留code_2
属性,并将name
属性重命名为state
。前面提到的文档维基中的属性和外部属性部分在这个问题上提供了非常丰富的信息。
发布于 2021-07-30 18:28:44
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文件连接:
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
备注:
https://stackoverflow.com/questions/18444261
复制相似问题