使用d3.geo.tile插件,示例在地图投影的比例和传递给tile()函数的比例之间都有差异。特别是tile_scale = projection_scale * 2 * Math.PI
。请参阅示例here和here。
这个2 * PI乘法的含义是什么?
答案 0 :(得分:4)
要理解为什么在使用d3.geo.tile插件时应用于比例的附加因子2π,重要的是要知道{使用的投影之间的差异{3}}和绘制光栅图块时使用的那个。
D3使用以下公式实现标准d3.geoMercator()
:
此投影使用以格林威治子午线为中心的单位圆的半径 R = 1 。到目前为止,没有缩放也没有应用任何翻译。投影将根据以下间隔生成输出值:
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()
使用implemented和translation的默认值这一事实常常掩盖了区间的值。您必须明确地将这些设置为.translate([0,0]).scale(1)
以获得上述间隔。
另一方面,Tiles使用稍微修改过的Mercator投影版本scaling。相关公式是
此投影的核心使用与标准墨卡托投影相同的计算。从上面方程式右侧黑色着色的术语可以很容易地看出这一点,这与墨卡托投影使用的术语完全相同。通过应用一些缩放和平移,只需调整输出间隔以更好地满足屏幕显示的需要。
首先,南北纬度超过
的投影被切断从而将整个地图投影到正方形上。之后,有三个调整(在上面的等式中与颜色匹配):
这将产生间隔
的输出值这是所涉及的预测尺度的这种差异,这就是你需要乘以/除以2π的原因。如果您想同时使用d3.geo.mercator()
以及同一地图中的图块,则需要修改比例以相互匹配。
对标准墨卡托投影的纬度施加相同的限制,就像Web墨卡托投影的情况一样,您最终得到以下间隔:
标准墨卡托投影
间隔项目
length =2π。
Web墨卡托投影
间隔项目
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 。这将获得 4 的切片。下一学期
是调整尺度的修正系数,其中包括2π你的问题。
答案 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)返回。经度以弧度为单位输入此函数,因此它具有从-π
到π
的自然范围,即描述圆的整个圆周的2π
角度。
但重点是每个量表的比例因子为effectively arbitrary,并且在预测中不一致。
基本上,2 * Math.PI
表示比例的最大范围,除以此因子意味着将此范围标准化为1
以便于数学运算。