地图与d3.js和TopoJSON,阿尔伯斯西伯利亚投影(Map with d3.js and To

2019-08-31 11:11发布

我试图让一个地区分布与d3.js但还是刚刚开始stucked。 我发现了一个Shape文件,并从它产生的以GeoJSON和TopoJson文件,就像在这里 。 所述映射使用阿尔伯斯-西伯利亚投影。 我发现这个怎么样的投影:

投影:阿尔伯斯等面积圆锥

  • 单位:米
  • 球体:Krasovsky
  • 中央子午线:105
  • 标准平行1:52
  • 标准并行2:64
  • 参考纬度:0
  • 东移假定:1850
  • 北移假定:0

PROJ.4 + PROJ = AEA lat_1 + + lat_2 = 52 = 64 + 0 = lat_0 lon_0 + = 105 = 18500000 + X_0 y_0 + = 0 = + ellps单元KRASS + = M + towgs84 = 28,-130,-95 ,0,0,0,0 + no_defs

的MapInfo: “阿尔伯斯-西伯利亚”,9,1001,7,105,0,64,52,1850万,0。

所以,我得到这个代码,最后和它不得而知(甚至FREEZ了),有什么不对?

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Choropleth</title>
    <script type="text/javascript" src="d3/d3.v3.js"></script>
    <script type="text/javascript" src="d3/queue.v1.min.js"></script>
    <script type="text/javascript" src="d3/topojson.v0.min.js"></script>
</head>
<body>
    <h1>My Choropleth</h1>
    <script type="text/javascript">

        var width = 960,
            height = 500;

        var svg = d3.select("body").append("svg")
                    .attr("width", width)
                    .attr("height", height);

        var pr = d3.geo.albers()
            .center([105,0])
            .parallels([52, 64])
            .scale(1000);


        var path = d3.geo.path().projection(pr);

        d3.json("map_rus_topo.json", function(error, map) {
         svg.append("path")
          .datum(topojson.object(map, map.objects.map_rus))
          .attr("d", path);
        });

    </script>
</body>

你可以找到所有JSON文件在这里 。
还有一个问题:我如何参考区域字段的值在 TopoJson文件。

Answer 1:

第一个问题是,你以GeoJSON文件不是度[°经度,纬度°],也被称为EPSG:4326或WGS 84 。 为了您的GeoJSON的文件转换为WGS 84,你首先需要创建一个投影文件,说albers.prj让你可以告诉OGR源投影是什么。

+proj=aea +lat_1=52 +lat_2=64 +lat_0=0 +lon_0=105 +x_0=18500000 +y_0=0 +ellps=krass +units=m +towgs84=28,-130,-95,0,0,0,0 +no_defs

那么,“unproject”通过将其转换到WGS 84 GeoJSON的文件:

ogr2ogr -f GeoJSON -s_srs albers.prj -t_srs EPSG:4326 map_rus_wgs84_geo.json map_rus_geo.json

现在你可以转换为TopoJSON在WGS 84,而不是预计的坐标。 我也考虑做一些简化的自由:

topojson -o map_rus_wgs84_topo.json -s 1e-7 -- russia=map_rus_wgs84_geo.json

第二个问题是,在D3的投影定义不正确。 该d3.geo.albers投影具有它的设计为一个以美国为中心的地图,所以除了定义中心,你还需要覆盖默认旋转默认旋转并居中。 事实上,+ lon_0(中央子午线)投影参数映射到投影的旋转,而不是投影的中心。 赠送:

var projection = d3.geo.albers()
    .rotate([-105, 0])
    .center([-10, 65])
    .parallels([52, 64])
    .scale(700)
    .translate([width / 2, height / 2]);

(我捏造与中心参数让俄罗斯在视口的中心,您可以。 自动计算这个如果你喜欢。)你现在应该看到这样的事情:

它也有可能与预测(笛卡尔)工作在TopoJSON坐标,然后定义与空(标识)投影一个d3.geo.path,但我会离开,对于一个单独的问题。



文章来源: Map with d3.js and TopoJSON, Albers Siberia projection