如何将 MKT 表达式转换为 Albers 投影上的 D3 选项?

How to translate MKT expression to D3 options on Albers projection?

这是标准的 MKT 表达式 (here also translated to Proj.4 string) of Albers conicEqualArea for official Statistical Grid of Brazil:

PROJCS["Conica_Equivalente_de_Albers_Brasil",
    GEOGCS["GCS_SIRGAS2000",
        DATUM["D_SIRGAS2000",
            SPHEROID["Geodetic_Reference_System_of_1980",6378137,298.2572221009113]],
        PRIMEM["Greenwich",0],
        UNIT["Degree",0.017453292519943295]],
    PROJECTION["Albers"],
    PARAMETER["standard_parallel_1",-2],
    PARAMETER["standard_parallel_2",-22],
    PARAMETER["latitude_of_origin",-12],
    PARAMETER["central_meridian",-54],
    PARAMETER["false_easting",5000000],
    PARAMETER["false_northing",10000000],
    UNIT["Meter",1]]

DATUM 是 WGS 84("SIRGAS2000" 是它的别名)。

如何将所有细节转换为 D3.js v5 参数化?

我尝试了明显的中心和平行线,但这还不够

var projection = d3.geoConicEqualArea()
  .parallels([-2,-22])  // IS IT?
  .scale(815)
  //.rotate([??,??]) // HERE THE PROBLEM... 
  .center([-54, -12])  // IS IT?

PS: D3 的文档在哪? geoConicEqualArea() 的 D3 源代码没有任何线索。

转换为 d3 Albers 投影的部分如下:

    PROJECTION["Albers"],
    PARAMETER["standard_parallel_1",-2],
    PARAMETER["standard_parallel_2",-22],
    PARAMETER["latitude_of_origin",-12],
    PARAMETER["central_meridian",-54],

你有平行线,现在你需要旋转。另请注意,对于任何 D3 投影,旋转都应用于中心坐标。通常,您需要在 x 轴上旋转并在 y 轴上居中:

d3.geoAlbers()
 .parallels([-2,-22])
 .center([0,-12])
 .rotate([54,0])
 .translate([width/2,height/2])
 .scale(k)

我沿 x 轴向相反方向旋转(旋转了我下方的地球,使我位于中央子午线之上,因此我旋转了 -x)。然后我以 y 为中心。最后,我进行翻译,使中央经度和子午线的交点在地图中居中,并应用适当的比例值。

如果我想以不同的区域为中心但保持投影不变,我可以修改projection.center(),但请记住,此处提供的坐标是相对于旋转的。我还可以使用 projection.fitSize()projection.fitExtent(),它们都为投影设置 'translate' 和 'scale' 值。 None of center/scale/translate 更改 D3 投影中的失真。

当然这不是投影的真实复制,因为坐标 space 单位是像素,如果不做一些额外的工作,您仍然无法直接以米为单位测量距离。