我正在尝试做一些非常简单的事情。我有一个纽约所有国会选区的GeoJSON文件,我只是希望能够在我的SVG元素中查看它。我将其转换为TopoJSON并尝试关注this tutorial(除了我尝试使用新的更新的d3 v4 API)。主要的问题是,我认为地图确实会被渲染,但它非常小。如果我试图扩大它,那么我完全忘记了地图。
这是我的html和d3 js:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>NY State Districts Demo</title>
</head>
<body>
<h1>Hello</h1>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.2/d3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/topojson/3.0.2/topojson.js"></script>
<script>
/* JavaScript goes here */
var width = 960, height = 1160;
var svg = d3.select("body").append("svg").attr("width", width).attr("height", height);
d3.json("./ny_bounds.json", function(error, ny){
if(error) return console.error(error);
console.log(ny);
svg.append("path")
.datum(topojson.feature(ny, ny.objects.ny_bounds))
.attr("d", d3.geoPath().projection(d3.geoAlbersUsa()));
});
</script>
</body>
</html>
Here是指向相关TopoJSON的链接。
我承认我对d3和geo / topoJSON知之甚少,但我只是坚持这一点。如果有人有任何资源,我可以了解更多关于这些主题的内容。但正如我之前所说的,主要问题是地图太小而我似乎无法集中/缩放它。
提前感谢您的帮助。
答案 0 :(得分:2)
您正在使用投影投影数据,该投影旨在投影整个美国,包括夏威夷和阿拉斯加。纽约将成为这个投影领域的一小部分。缩放任何地图投影将放大投影的中心 - d3不知道放大到特定位置,因此当您放大时,纽约将从投影的边缘掉落。
由于AlbersUsa投影是一个复合投影(允许包含夏威夷阿拉斯加),实际上是在一个平面上组合的几个Albers投影。由于其复合性,它更难操纵。为了简单起见,我建议使用普通的Albers投影。这也允许您定制投影到纽约州。
Albers投影有两个标准的平行线,它们是与地球表面相交的投影平面的平行线(它是一个圆锥形投影)。标准平行线应位于感兴趣的区域,一个在下半部分,一个在uppper中(因为这些是与地球相交的平行线,沿着这些平行线最小化失真)。对于纽约州来说,北纬41度和44度的平行线可以工作。
您还需要将投影居中。为此,您需要您感兴趣的区域的地理中心。纽约市中心北纬42.954度,西经75.527度(东经75.527度)。为了使Albers投影居中,在x上旋转(在我们旋转地球仪时旋转经度的倒数)并以y为中心。总之这看起来像:
d3.geoAlbers()
.center([0,42.954])
.rotate([75.527,0])
.parallels([41,44])
.translate([width/2,height/2])
.scale(k) // scale factor
现在您需要确保您的geoPath使用此投影(是的,如果您的宽度或高度不是默认的960x500,则需要指定平移,因为它以投影的中心为中心)。比例放大时会有更大的数字,因此可以让你开始使用2000倍。