使用D3.js只渲染一个topojson地图的一部分

我正在使用D3.js库从美国人口普查shapefile创build地图。 我正在寻找创build一个完整的美国地图,这是没有问题的,并为每个国家的地图。

我的工作stream使用普查数据,在命令行中根据需要由ogr2ogr进行更改,然后由shpescape.com将其转换为topojson或geojson,这是由于topojson模块的node.js下载中存在错误(请参阅下面的编辑解决scheme以了解此特定内容问题)。

我的问题更多的是一个实用的问题,而不是其他任何东西 – 当提出这个代码(模拟closureshttp://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); 

它不仅会在“无法读取属性未定义的types”的“var states”行中抛出一个错误 – 但是我也不知道我应该传递给匿名函数,还是mt_topo.objects 。状态应该是指。 这种GIS的东西没有很好的文档。 所有人口普查地图都有“国家”特征吗? 当你将.shp压缩到topojson时,你会丢失这些信息吗?

简单地说,如果d3.json需要(对象,函数(错误,JSON)),那么这个工作的例子实际上是什么样子?

编辑:替代方法和WINDOWS 7 IDIOSYNCRASIES – –

大多数教程都告诉你使用node.js中的模块,但是我使用的是Windows7,规范的命令行“npm install -g topojson”在调用时失败了。 创造者给了我一个很好的链接来解决这个问题。

这很重要,因为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); 

这就是说,你的问题是真正了解人口普查地图是否具有“州”特征。 我的猜测是,你使用的任何几何都没有状态特征,这就是为什么你得到一个错误。 当使用topojson命令行工具时,特性名称(即data.objects.x)通常是输入文件的命名,所以如果你的文件是US_Census_2010.shp ,你想要定义状态为

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

打开你的mt_geo.json文件,看看你的功能命名。 希望有所帮助!

表示地图的GeoJSON文件通常具有一个或多个特征。 每个功能可能有零个或多个属性。 通常,这些属性用于存储地点的元数据(州名,县等)。 你可以阅读你的GeoJSON文件,看看它有什么属性,并使用这些属性来显示或隐藏功能。

将文件从GeoJSON转换为TopoJSON时, 可以保留或删除原始属性 。 例如,教程Let's Make a Map中的uk.json文件中的特征和点具有属性name