为什么投影与瓷砖的比例值存在差异?

时间:2015-11-04 08:28:30

标签: d3.js maps

使用d3.geo.tile插件,示例在地图投影的比例和传递给tile()函数的比例之间都有差异。特别是tile_scale = projection_scale * 2 * Math.PI。请参阅示例herehere

这个2 * PI乘法的含义是什么?

2 个答案:

答案 0 :(得分:4)

要理解为什么在使用d3.geo.tile插件时应用于比例的附加因子,重要的是要知道{使用的投影之间的差异{3}}和绘制光栅图块时使用的那个。

D3

D3使用以下公式实现标准d3.geoMercator()

  

Mercator projection

     

Mercator x formula

此投影使用以格林威治子午线为中心的单位圆的半径 R = 1 。到目前为止,没有缩放也没有应用任何翻译。投影将根据以下间隔生成输出值:

  

Mercator y formula

     

Mercator x interval

在D3 v4中,Mercator y interval

export function mercatorRaw(lambda, phi) {
  return [lambda, log(tan((halfPi + phi) / 2))];
}
D3 v3使用了略微不同的符号,它更接近于上面提到的公式,当然,它等同于更新的实现:

function d3_geo_mercator(λ, φ) {
  return [λ, Math.log(Math.tan(π / 4 + φ / 2))];
}

d3.geo.mercator()使用implementedtranslation的默认值这一事实常常掩盖了区间的值。您必须明确地将这些设置为.translate([0,0]).scale(1)以获得上述间隔。

瓦片

另一方面,Tiles使用稍微修改过的Mercator投影版本scaling。相关公式是

  

Web Mercator

     

Web Mercator x formular

此投影的核心使用与标准墨卡托投影相同的计算。从上面方程式右侧黑色着色的术语可以很容易地看出这一点,这与墨卡托投影使用的术语完全相同。通过应用一些缩放和平移,只需调整输出间隔以更好地满足屏幕显示的需要。

首先,南北纬度超过

的投影被切断
  

Web Mercator y formular

从而将整个地图投影到正方形上。之后,有三个调整(在上面的等式中与颜色匹配):

  1. 将原点移动到左上角(0,0) - 用π调整为蓝色。
  2. 将间隔标准化为 [0,1] - 以绿色除以
  3. 向上缩放以适合 256×256 的区域 - 乘以红色 256
  4. 这将产生间隔

    的输出值
      

    Cut off limit for latitudes

    这是所涉及的预测尺度的这种差异,这就是你需要乘以/除以的原因。如果您想同时使用d3.geo.mercator()以及同一地图中的图块,则需要修改比例以相互匹配。

    对标准墨卡托投影的纬度施加相同的限制,就像Web墨卡托投影的情况一样,您最终得到以下间隔:

    标准墨卡托投影

    间隔项目

      

    Web Mercator intervals

    length =2π

    Web墨卡托投影

    间隔项目

      

    Mercator intervals

    length = 256

    在设置投影比例时更正了

    var projection = d3.geoMercator()
        .scale((1 << 12) / 2 / Math.PI );
    

    使用简单取幂数学,可以将缩放因子重写为

    (1 << 4) * (1 << 8) / 2 / Math.PI
    

    并进一步

    (1 << 4) * 256 / ( 2 * Math.PI )
    

    第一项(1 << 4)等于 2 4 ,这是要使用的实际缩放系数: 16 。这将获得Web Mercator intervals 4 的切片。下一学期

      

    zoom level

    是调整尺度的修正系数,其中包括你的问题。

答案 1 :(得分:0)

某些d3投影,包括d3.geo.mercator(在这些示例中使用)具有自然尺度,经度范围从π

var s = d3.geo.mercator().translate([0,0]).scale(1);
s([180, 0]); // [3.141592653589793, 0]
s([-180, 0]); // [-3.141592653589793, 0]

这是一个简单的默认比例,因为正如您在d3.geo.mercator投影(Wikipedia formula)中看到的那样,投影x值与经度角成线性比例。如果您将Web墨卡托投影视为展开和展平完美球体,那么这将非常有意义 - 球体周围的1度将等于x距离的1个单位。因此D3实现根本不会缩放经度 - 它只是将其作为x值(see code)返回。经度以弧度为单位输入此函数,因此它具有从π的自然范围,即描述圆的整个圆周的角度。

但重点是每个量表的比例因子为effectively arbitrary,并且在预测中不一致。

基本上,2 * Math.PI表示比例的最大范围,除以此因子意味着将此范围标准化为1以便于数学运算。