Как добавить свойства в файл 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.
Другие вопросы по тегам