如何将多对象 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.json
和bar.json
组合成foobar.json
:
上面的 foobar.json 看起来像这样:
"type": "Topology",
"transform": …,
"objects":
"foo": …,
"bar": …
,
"arcs": …
现在,我有foobar.json
,如何从中提取foo.json
?
注意:
我不需要将 TopoJSON 转换为 GeoJSON。 foobar.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);
现在变量foo
和bar
保存最初存储在各自文件中的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 文件的主要内容,如果未能解决你的问题,请参考以下文章
Automapper - 将多对多关联映射到平面对象的最佳实践