kgi*_*vi3 7 javascript windows geojson d3.js topojson
我正在使用D3.js库从US Census shapefile创建地图.我正在寻找创建一个完整的美国地图,这是没有问题的,以及每个州的地图.
我的工作流程使用人口普查数据,ogr2ogr在命令行根据需要进行了更改,然后由shpescape.com转换为topojson或geojson,因为topojson模块的node.js下载错误(请参阅下面的编辑解决方案)问题).
我的问题更多的是一个实用的问题而不是其他任何问题 - 当提供此代码时(以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);
Run Code Online (Sandbox Code Playgroud)
它不仅在"var states"行抛出一个错误,它说"无法读取未定义的属性类型" - 但我也不知道我应该将什么传递给匿名函数,或者mt_topo.objects .states应该是指.关于这种GIS的事情没有很好的文档.所有人口普查地图都有"状态"功能吗?当你将.shp压缩到topojson时,你会丢失这些信息吗?
简单地说,如果d3.json采用(对象,函数(错误,json)),那么实际工作的示例会是什么样的?
编辑:替代方案和WINDOWS 7 IDIOSYNCRASIES -----
大多数教程都告诉你使用来自node.js的模块,但我在Windows7上,规范的命令行"npm install -g topojson"在"contextify"失败.创建者给我发了一个很好的链接来解决这个问题.
这很重要,因为在topojson的命令行中有一个标志,您可以在其中将geojson中的现有要素打包到topojson中的可访问对象中.例如,上面的代码使用topojson中的"states" - 除非你使用以下命令,否则这是无意义且无法访问的:
topojson -o us.topojson -- states=us_states.json
Run Code Online (Sandbox Code Playgroud)
双连字符和状态之间的空间很重要.然后,您可以通过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);
Run Code Online (Sandbox Code Playgroud)
也就是说,您的问题实际上是要了解人口普查地图是否具有“州”功能。我的猜测是,您使用的任何几何体都没有状态特征,这就是您收到错误的原因。使用 topojson 命令行工具时,功能名称(即 data.objects.x)通常是输入文件的名称,因此如果您的文件是US_Census_2010.shp,您需要将状态定义为
var states = topojson.feature(mt_topo, mt_topo.objects.US_Census_2010)
打开您的mt_geo.json文件并查看您的功能的名称。希望有帮助!
| 归档时间: |
|
| 查看次数: |
5177 次 |
| 最近记录: |