为什么这个TopoJSON使用D3渲染得如此之小? (简单例子)

时间:2017-09-20 16:35:26

标签: javascript html d3.js geojson topojson

我正在尝试做一些非常简单的事情。我有一个纽约所有国会选区的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知之甚少,但我只是坚持这一点。如果有人有任何资源,我可以了解更多关于这些主题的内容。但正如我之前所说的,主要问题是地图太小而我似乎无法集中/缩放它。

提前感谢您的帮助。

1 个答案:

答案 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倍。