如何将多对象 TopoJSON 文件中的一个对象提取到另一个单独的 TopoJSON 文件

Posted

技术标签:

【中文标题】如何将多对象 TopoJSON 文件中的一个对象提取到另一个单独的 TopoJSON 文件【英文标题】:How to extract one object in a multi-objects TopoJSON file to another separate TopoJSON file 【发布时间】:2016-02-28 03:01:46 【问题描述】:

使用:

topojson -o foobar.json -- foo.json bar.json

我们可以将两个foo.jsonbar.json 组合成foobar.json

上面的 foobar.json 看起来像这样:


    "type": "Topology",
    "transform": …,
    "objects": 
        "foo": …,
        "bar": …
    ,
    "arcs": …

现在,我有foobar.json,如何从中提取foo.json

注意:

我不需要将 TopoJSON 转换为 GeoJSON。 foob​​ar.json 也可以是 TopoJSON 格式。我只需要减小 foobar.json 的大小并删除 'bar' 对象及其对应的弧。

例如这里的us.json https://gist.github.com/mbostock/4090846#file-us-json,包括三个对象:'counties'、'states'和'landlines'。我只需要状态。

【问题讨论】:

【参考方案1】:

您可以使用客户端库从您的 TopoJSON 对象中提取 foo。假设这里 foobar 持有您的 TopoJSON 对象:

var foo = topojson.feature(foobar, foobar.objects.foo),
    bar = topojson.feature(foobar, foobar.objects.bar);

现在变量foobar 保存最初存储在各自文件中的Feature/FeatureCollection。请参阅存储库 wiki 上的客户端 API 参考:

https://github.com/mbostock/topojson/wiki/API-Reference#client-api

在cmets和问题编辑之后编辑:

另一个选项可能是从您的 TopoJSON 中的 objects 对象中手动删除其他属性。如何做到这一点取决于您可以使用的语言。以php为例:

$string = file_get_contents('foobar.json');
$topojson = json_decode($string);
unset($topojson->objects->bar);
$string = json_encode($topojson);
file_put_contents('foo.json', $string);

问题是之后在 TopoJSON 中会有未使用的弧,但据我了解,您可以使用命令行界面的 prune 方法修剪这些弧:

从指定拓扑中删除任何未使用的弧。

https://github.com/mbostock/topojson/wiki/API-Reference#prune

【讨论】:

感谢这个客户端解决方案。但我真的需要使用命令行界面来解决这个问题。我需要缩小 json 文件并删除那些不必要的部分。 既然你在命令行上工作,难道不是一开始就不捆绑 json 并创建单独的 topojson 对象吗?如果没有,您始终可以使用 Node.js 在服务器端使用客户端库。坦率地说,我认为使用服务器端命令行界面是不可能的。其目的是将 GeoJSON 编码为 TopoJSON。它无法将 TopoJSON 解码为 GeoJSON。这就是客户端库的用途。 问题是我一开始就没有 foo.json 和 bar.json 。我只有 foobar.json。比如这里的us.jsongist.github.com/mbostock/4090846#file-us-json,里面包含了'counties'、'states'和'landlines'三个对象。我只需要状态。 我在答案中添加了另一个选项,但不确定它的有效性,因为我无法在 atm 测试它。希望对你有帮助,祝你好运

以上是关于如何将多对象 TopoJSON 文件中的一个对象提取到另一个单独的 TopoJSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的topojson文件与数据图一起使用?

如何按坐标过滤 GeoJSON/TopoJSON 数据?

Automapper - 将多对多关联映射到平面对象的最佳实践

将坐标值放在topojson美国地图上

CORS XMLHttpRequest 使用 POST 将多部分表单数据发送到 Softlayer 对象存储失败

平滑 D3.js/GeoJSON/TopoJSON/Shapefile 中的弧线/绘图点(沿途某处)