Как добавить свойства в файл topojson?
Имеется файл 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
2 ответа
Попробуйте использовать это:
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 имя свойства объекта для продвижения к идентификатору геометрии
Используя code_2
свойство с этой опцией, вы продвигаете его как идентификатор функции.
Добавьте знак " +" перед именем свойства ввода, чтобы привести его значение к числу.
Плюс:
Если свойства, на которые ссылается --id-property, имеют значение null или не определены, они исключаются из объекта выходной геометрии. Таким образом, сгенерированные объекты могут не иметь определенного идентификатора, если входные объекты не имеют свойства с указанным именем.
Итак, когда вы используете +code
а также +code_2
, они, вероятно, undefined
, так как вы не можете конвертировать AK
строковое значение в число.
Здесь свойство ввода "FIPS" приводится к числу и используется в качестве идентификатора функции; аналогично, столбец с именем "FIPS" используется в качестве идентификатора в файле CSV. (Если ваш CSV-файл использует другое имя столбца для идентификатора функции, вы можете указать несколько свойств идентификатора, например:
--id-property=+FIPS,+id
.)
Вот почему вы должны добавить code
к --id-property=code_2,code
вариант. Вот как производится сопоставление (code_2
из топойсона.json и тому code
столбец из data.tsv).
Затем, выходное свойство "безработица" генерируется из файла внешних данныхоциаллорийства, который определяет входное свойство "скорость"
В нашем случае -p code_2,state=name
указывает, что мы будем сохранять code_2
собственность, и мы переименуем name
собственность на state
, Разделы Свойства и Внешние свойства в вышеупомянутой вики документации довольно информативны по этому вопросу.
Пакет 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"}]
Добавьте столбец 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
Примечания:
- Я поменял местами «AK» и «AL» в файле topojson, чтобы проверить, действительно ли соединение работает.
- Последняя команда (перед однострочным) работает только с исходным выводом, а не с данной красиво напечатанной версией, в которой есть символы новой строки.
- Я тестировал рабочий процесс в подсистеме для Linux, поскольку в настоящее время ndjson-map не работает должным образом в Windows.