交互式 d3 邮政编码分区统计 - WA 州
Interactive d3 zip code choropleth - WA state
正如标题所说,我正在尝试使用 d3 制作交互式分区统计。我找到了一个有趣的例子,我正在尝试为另一个位置复制它。具体来说,我正在尝试在邮政编码级别绘制华盛顿州。
我已经添加了目前可能被编辑的代码,它基于此示例,这里是显示最终结果的现场演示。
这适用于加利福尼亚州,但是当更改邮政编码topojson州(到华盛顿州(时,该图不起作用。也没有明确的错误。错误可能在于拓扑的差异。
这是加利福尼亚的地形图,这里是华盛顿的版本。
以下是为每个拓扑打印的第一个值。
California topojson:
{
"type": "Topology",
"objects": {
"zip": {
"type": "GeometryCollection",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"geometries": [
{
"type": "Polygon",
"properties": {
"zipcode": 94601
},
"arcs": [
[
0,
1,
2,
3,
4,
5
]
]
}
华盛顿托波伊森:
{
"type": "Topology",
"objects": {
"tl_2010_53_zcta510": {
"type": "GeometryCollection",
"crs": {
"type": "name",
"properties": {
"name": "urn:ogc:def:crs:OGC:1.3:CRS84"
}
},
"geometries": [
{
"type": "Polygon",
"properties": {
"zipcode": "98822"
},
"arcs": [
[
0,
1,
2,
3
],
[
4
]
]
}
以下是main.js
函数。我认为这并检查两个拓扑文件可以帮助找到问题可能出在哪里。基本上唯一更改的是topojson文件,然后main.js
函数应该反映这些更改。
此外,"fake_data.csv"仅表示一系列邮政编码:值对:
zip,values
98001,1
98002,1
98003,1
98004,2
98005,2
98006,2
主.js
(function chart() {
var width = 1000,
height = 1200,
centered;
var rateById = d3.map();
var quantize = d3.scale.quantize()
.domain([0, 100000])
.range(d3.range(9).map(function(i) { return "q" + i + "-9"; }));
var projection = d3.geo.albersUsa()
.scale(6000)
.translate([2300, 680]);
var path = d3.geo.path()
.projection(projection);
var svg = d3.select("#ca-chart").append("svg")
.attr("width", width)
.attr("height", height);
var tooltip = d3.select("#ca-chart").append("div")
.attr("class", "tooltip")
.style("opacity", 0);
svg.append("rect")
.attr("class", "background")
.attr("width", width)
.attr("height", height)
.on("click", clicked);
var g = svg.append("g");
// These are the two lines that are different from the working example
queue()
.defer(d3.json, "https://gist.githubusercontent.com/martinbel/e14cd6ecd565914f53af/raw/e3a3a8332c20fe3cee6d7fd2a9ac01ad43f7aaa4/WA.topojson")
.defer(d3.csv, "fake_data.csv", function(d) { rateById.set(d.zip.toString(), +d.values); })
.await(ready);
function ready(error, zipcode) {
var features = topojson.feature(zipcode, zipcode.objects.tl_2010_53_zcta510).features;
g.append("g")
.attr("class", "state")
.selectAll("path")
.data(topojson.feature(zipcode, zipcode.objects.tl_2010_53_zcta510).features)
.enter().append("path")
.attr("d", path)
.attr("stroke", "#333")
.attr("stroke-width", "1.5px")
.attr("fill", "#fff");
g.append("g")
.attr("class", "zipcodes")
.selectAll("path")
.data(features)
.enter().append("path")
.attr("class", getColorClass)
.attr("d", path)
.on("click", clicked)
.on("mouseover", mouseover)
.on("mouseout", mouseout);
}
function getColorClass(d) {
return quantize(rateById.get(d.properties.zipcode));
}
function getPopulation(d) {
return rateById.get(getZip(d)).toString();
}
function getZip(d) {
return d && d.properties ? d.properties.zipcode : null;
}
function mouseout(d) {
d3.select(this)
.style("stroke", null);
tooltip.transition()
.duration(250)
.style("opacity", 0);
}
function mouseover(d) {
d3.select(this.parentNode.appendChild(this))
.style("stroke", "#F00");
tooltip.transition()
.duration(250)
.style("opacity", 1);
tooltip
.html("<p><strong>Zipcode: " + getZip(d) + "<br>Population: " + getPopulation(d) + "</strong></p>")
.style("left", (d3.event.pageX + 25) + "px")
.style("top", (d3.event.pageY - 28) + "px");
}
function clicked(d) {
var x, y, k;
if (d && centered !== d) {
var centroid = path.centroid(d);
x = centroid[0];
y = centroid[1];
k = 8; // control zoom depth
centered = d;
} else {
x = width / 2;
y = height / 2;
k = 1;
centered = null;
}
g.selectAll("path")
.classed("active", centered && function(d) { return d === centered; });
g.transition()
.duration(750)
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")scale(" + k + ")translate(" + -x + "," + -y + ")")
.style("stroke-width", 1.5 / k + "px");
}
d3.select(self.frameElement).style("height", height + "px");
}());
拓扑文件是按以下方式生成的:
curl -O "ftp://ftp2.census.gov/geo/tiger/TIGER2010/ZCTA5/2010/tl_2010_53_zcta510.zip"
unzip "tl_2010_53_zcta510.zip"
ogr2ogr -f GeoJSON -s_srs crs:84 -t_srs crs:84 tl_2010_53_zcta510.geojson tl_2010_53_zcta510.shp
topojson -o tl_2010_53_zcta510.topojson --properties zipcode=ZCTA5CE10 tl_2010_53_zcta510.geojson
问题是您正在绘制活动查看区域之外的路径。试试这个作为你的projection
,你会看到路径。
var projection = d3.geo.albersUsa()
// .scale(6000)
// .translate([2300, 680]);
您必须编辑华盛顿的缩放/平移...当您这样做时,使您的 SVG width
和height
巨大(10000 像素左右(可能会有所帮助,这样您就可以看到地图的最终位置。
这解决了显示地图并显示地图而无需手动破解参数的问题。实际上,诀窍是使用支持 .center()
方法的投影,albersUsa
不支持。然后,整理比例参数就容易多了。
var projection = d3.geo.mercator()
.center([-120.574951, 47.361153])
.scale(5000)
.translate([(width) / 2, (height)/2]);
在此之后,出现了其他一些问题。
相关文章:
- Java-彩票统计解析器
- 统计ajax返回数据中的html元素
- 如何使用jQuery对多个文本区域进行字数统计
- 关于使用image.src进行统计的问题
- 使用Javascript从Strobe Media Playback获取统计信息
- Javascript统计计算器
- 更改阿尔戈利亚即时搜索.js统计模板
- 时间序列统计(如相关性、傅里叶变换)
- JSnice如何进行统计重命名,重命名Javascript变量
- 统计网站中点击次数最多的视频
- 随机数生成器,what'我的方法/统计数据有问题吗?[JS]
- Javascript;Cookie:统计所有页面的访问量
- 如何在Javascript中混合使用英语和汉语进行字数统计
- jQuery统计背景图像的纵横比并更改元素的填充值
- 在网站上显示该网站的GA统计数据
- 如何统计复选框的复选值总数
- 相关视频与部分内容详细信息和统计-Youtube API V3
- 我怎么知道MYSQL统计中哪个字段不匹配
- 从 SQL 数据库自动更新统计信息
- 交互式 d3 邮政编码分区统计 - WA 州