13

我正在使用 topojson 转换现有的 GeoJSON 数据集,但它没有保留属性。它遵循标准的 GeoJSON 格式,并将属性放置在与几何图形相同级别的“属性”对象中(下面的片段),但是当 topojson 成功完成时,我最终得到了一个可以使用和显示的有效 topojson 数据文件地图,但文件中的任何地方都没有属性。我没有指定属性,默认行为是在这种情况下保留所有属性,所以我很困惑。

{"type": "Feature", "geometry": {"type":"MultiLineString","coordinates":[[[12.06,37.97],[12.064,37.991]],[[12.064,37.991],[28.985,41.018]]]}, "properties": {"pair": 50129,"direction": 0,"month": 12,"priority": 0,"expense": 4.854,"duration": 20.423,"length": 2950.524}}

编辑:我也没有足够的点数来注册 topojson 标记,所以在创建该标记之前,我会将其列为 D3。

4

4 回答 4

21

你在使用-p选项吗?

topojson in.json -o out.json- 删除所有属性

topojson in.json -o out.json -p- 保留所有属性

topojson in.json -o out.json -p prop1,prop2- 只保留 prop1 & prop2

于 2013-01-04T15:10:19.403 回答
2

正如@ow3n 所说,geo2topo不再提供编辑原始属性的方法。因此@james246 很好的答案不再适用于最新的包。

但我终于明白了如何使用ndjson-cli来做到这一点。感谢 Mike Bostock 自己在github 问题线程中的回答,这几乎是复制粘贴,所以网络犹豫看看原件。

首先安装新包:

npm i -g shapefile ndjson-cli topojson-client topojson-server topojson-simplify

然后分三步:

第 1 步:将 Shapefile 转换为以换行符分隔的 GeoJSON 特征。

shp2json -n original.shp > myfile.ndjson

第 2 步:重新定义 GeoJSON 属性,您也可以重命名它们。

ndjson-map 'd.properties = {prop1: d.properties.prop1, p2: d.properties.prop2}, d' \
  < myfile.ndjson \
  > myfile-filtered.ndjson

第 3 步:将换行符分隔的 GeoJSON 转换为 TopoJSON。

geo2topo -n myfile-filtered.ndjson > myfile-topo.json

注意
如果您不再拥有原始文件,您可以使用ndjson-split.shp将您的实际.json文件转换为以换行符分隔的 GeoJSON 功能:

 ndjson-split 'd.features' \
  < myfile.json \
  > myfile.ndjson

然后按照步骤 2中的说明进行操作。

于 2018-09-05T16:13:22.980 回答
1

topojson 中的此功能现已移至geo2topo,不再提供编辑原始属性的方法。

输入要素对象的任何属性和标识符都会传播到输出。如果要转换或过滤属性,请尝试 ndjson-cli,如命令行制图所示。

我发现编写自己的脚本比使用ndjson-cli在命令行上编辑所有属性更容易。

/**
 *  Remove unwanted geojson feature properties
 */

var fs = require('fs');

var inputFile = 'input.geojson',
    outputFile = 'output.geojson',
    remove = ["properties","to","remove"];

function editFunct(feature){
    feature.TID = feature.properties.TID; // set the TID in the feature
    return feature;
}

removeGeojsonProps(inputFile,outputFile,remove,editFunct);

function removeGeojsonProps(inputFile,outputFile,remove,editFunct){

    // import geojson
    var geojson = JSON.parse(fs.readFileSync(inputFile, 'utf8'));

    // for each feature in geojson
    geojson.features.forEach(function(feature,i){

        // edit any properties
        feature = editFunct(feature);

        // remove any you don't want
        for (var key in feature.properties) {   

            // remove unwanted properties
            if ( remove.indexOf(key) !== -1 )
                delete feature.properties[key];
        }
    });

    // write file
    fs.writeFile(outputFile, JSON.stringify(geojson), function(err) {
        if(err) return console.log(err);
        console.log("The file was saved!");
    }); 
}
于 2017-03-16T11:28:31.583 回答
1

我也遇到了这个问题,但@james246 的回答对我不起作用。但是,我找到了一个同样简单的解决方案。

仅当您从同级文件文件夹中删除源 .shp 文件时,才会删除属性数据。shp2geo在应用命令之前,请确保 .shp 和 .dbf 文件位于同一文件夹中。(.dbf 文件包含属性数据。)

无需应用类似条件-p或其他任何条件;默认命令保留属性

于 2017-11-29T07:21:08.137 回答