我正在尝试使用 D3 框架 (http://mbostock.github.com/d3/) 绘制美国州的轮廓,但在生成实际 SVG 数据时遇到问题。我已经编写了我的代码以遵循 Chloropleth 示例(因为它最接近于该项目所需的内容),确保提供的数据采用 geoJSON 格式,并且 AFAIK 的后端部分工作正常。
问题是,当我查看 DOM 时,该<svg>
对象仅包含一个<g>
元素(根据示例,我手动创建了该元素),并且没有任何子<path>
元素应该位于它之下。我的代码似乎与示例完全相同,并且我的数据看起来正确,尽管我输出的是 MultiPolygons 而不是示例使用的 Polygon 对象。
我们的应用程序是一个带有 jQuery 的 RoR 项目(我们只使用 D3 来实现 SVG 和地理功能)。测试页面尝试根据从美国各州的下拉选择中的选择,在<svg>
名为 的 div 下创建一个元素:theArea
$(document).ready( function() {
$("#chooser_state").change( function() {
var status = "#status";
var statebox = "#chooser_state";
var theArea = "#theArea"
var url = "/test/get_state_geom";
var data = { state: $(statebox).val() };
$(status).text("Request sent...");
$.post(url, jQuery.param(data), function(resp) {
$(status).text("Received response: " + resp["message"]);
$(theArea).empty();
var path = d3.geo.path();
var svg = d3.select(theArea).append("svg");
var state = svg.append("g").attr("id", "state_view");
var features = resp.payload.features;
$(status).text("Created SVG object");
state.selectAll("path")
.data(features)
.enter()
.append("path")
.attr("d", path );
});
});
});
我们提供给 D3 的数据如下所示:
{
'type' => 'Feature',
'id' => '01',
'properties' => {
'name' => 'Colorado'
},
'geometry' => {
'type' => 'MultiPolygon',
'coordinates' => [
[
[
[
-106.190553863626,
40.9976070173843
],
[
-106.061181,
40.996998999999995
],
< -- and so on -- >
]
]
]
}
}
有人能告诉我我们做错了什么吗?我是地理和地理信息系统的新手。我怀疑问题出在data()
函数上,因为它看起来应该<path>
为每个对象创建空白对象Feature
(尽管目前我们只有一个),但 D3 文档似乎不清楚(并且难以理解)。
编辑:只是想补充一点,我们生成的 geoJSON 是由 GeoRuby gem 的 geoJSON 扩展创建的。实际的地图线来源于美国人口普查局制图边界文件的合并数据,这些数据被转换为 SQL 并使用 postGIS 保存。我的一部分怀疑 geoJSON 扩展做错了什么,所以这是我的下一个攻击途径。