gpt4 book ai didi

javascript - 使用 D3.js 只渲染 topojson map 的一部分

转载 作者:可可西里 更新时间:2023-11-01 13:14:38 24 4
gpt4 key购买 nike

我正在使用 D3.js 库根据美国人口普查 shapefile 创建 map 。我希望创建一个完整的美国 map ,这没问题,并且每个州都有一张 map 。

我的工作流程使用人口普查数据,由 ogr2ogr 在命令行根据需要进行更改,然后由 shpescape.com 转换为 topojson 或 geojson,这是由于 node.js 下载 topojson 模块时的错误(编辑后的解决方案见下文)针对这个特定问题)。

我的问题比其他任何问题都更像是一个实际问题——当出现此代码时(根据 http://bl.ocks.org/mbostock/4707858 建模):

            var width = 640,
height = 500;

var projection = d3.geo.albers();

var path = d3.geo.path()
.projection(projection);

var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);

d3.json("mt_geo.json", function(error, mt_topo) {
var states = topojson.feature(mt_topo, mt_topo.objects.states),
state = states.features.filter(function(d) { return d.id === 34; })[0];
projection
.scale(1)
.translate([0,0]);
var b = path.bounds(state),
s = .95 / Math.max ((b[1][0]-b[0][0])/width, (b[1][1]-b[0][1])/height),
t = [(width-s*(b[1][0]+b[0][0]))/2, (height-s*(b[1][1]+b[0][1]))/2];
projection
.scale(s)
.translate(t);
svg.append("path")
.datum(states)
.attr("class", "feature")
.attr("d", path);
svg.append("path")
.datum(topojson.mesh(us, us.objects.states,function(a, b) {return a !== b;}))
.attr("d", path);
svg.append("path")
.datum(state)
.attr("class", "outline")
.attr("d", path);

它不仅在“var states”行抛出一个错误“无法读取未定义的属性类型”——而且我也不知道我应该将什么传递给匿名函数,或者什么mt_topo.objects.states 应该是指。没有关于此类 GIS 事物的良好文档。所有的人口普查 map 都有“州”特征吗?将 .shp 压缩为 topojson 时会丢失该信息吗?

简单地说,如果 d3.json 采用 (object, function(error, json)),那么实际有效的例子会是什么样子?

编辑:解决方法和 WINDOWS 7 特性 -----

大多数教程告诉您使用 node.js 中的模块,但我使用的是 Windows7,规范命令行“npm install -g topojson”在“上下文化”时失败。创作者给我发了一个很好的link解决上述问题。

这很重要,因为在 topojson 的命令行中有一个标志,您可以在其中将 geojson 中的现有功能打包到 topojson 中的可访问对象中。例如,上面的代码在 topojson 中使用了“states”——除非您使用以下命令,否则这是无意义且无法访问的东西:

topojson -o us.topojson -- states=us_states.json

双连字符和状态之间的空格很重要。然后您可以通过 us.objects.states 访问状态,如上面的原始代码所示。

最佳答案

你非常接近。在没有测试您的代码的情况下,我发现了一个主要问题。 JSON 回调的第二个参数是 mt_topo,您在定义

时使用它

var states = topojson.feature(mt_topo, mt_topo.objects.states)

但是,稍后您使用 us 作为回调对象,大概是因为 Mike Bostock 在您引用的示例中使用了它。相反,它应该是这样的:

svg.append("path")
.datum(topojson.mesh(mt_topo, mt_topo.objects.states,function(a, b) {return a !== b;}))
.attr("d", path);

也就是说,您的问题实际上是关于人口普查 map 是否具有“状态”功能。我的猜测是您使用的任何几何体都没有状态特征,这就是您收到错误的原因。使用 topojson 命令行工具时,要素名称(即 data.objects.x)通常是输入文件的名称,因此如果您的文件是 US_Census_2010.shp,您需要定义状态作为

var states = topojson.feature(mt_topo, mt_topo.objects.US_Census_2010)

打开您的 mt_geo.json 文件并查看您的功能的名称。希望对您有所帮助!

关于javascript - 使用 D3.js 只渲染 topojson map 的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18835347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com