给定地球表面的正方形ABCD(等方体),带a &在格林尼治子午线上;C在子午线经度= 10⁰:
A( 0.0; 50.0) C(10.0; 50.0)
B( 0.0; 40.0) B(10.0; 40.0)
给定我的D3js数据可视化在d3.geo.mercator()
投影中工作,我的正方形由比例r= mercator_height in px/width in px
垂直转换约1.5。
如何准确计算这个墨卡托变换比r
?
注意:这是非线性的,因为它意味着一些1/cos()
[2]。
编辑:我很想认为我们应该首先在屏幕上使用d3.geo.mercator()
重新投影每个点(如何?哪种语法?),所以D3
做所有困难的数学。然后我们可以获取点的像素坐标,这样我们就可以计算像素长度AB和长度AC,最后计算r=AC/AB
。此外,这是一个位如何将十进制度坐标转换为所选d3.geo.<PROJECTIONNAME>()
的投影像素坐标函数?
[2]: Mercator:尺度因子沿子午线随纬度的变化?
我将假设这些点是A:(0,50), B:(0,40), C:(10,50)和D:(10,40)。被点(A, C, D, B)包围的特征看起来像一个使用等矩形投影的正方形。现在,点是经纬度对,你可以用d3.geo.distance
计算点之间的大弧距离。这将给出两点之间的角距离。例如:
// Points (lon, lat)
var A = [ 0, 50],
B = [ 0, 40],
C = [10, 50],
D = [10, 40];
// Geographic distance between AB and AC
var distAB = d3.geo.distance(A, B), // 0.17453292519943306 radians
distAC = d3.geo.distance(A, C); // 0.11210395570214343 radians
现在,这些距离是点之间的角度,正如你所看到的,特征不是正方形。如果我们使用D3墨卡托投影投影点:
// The map will fit in 800 px horizontally
var width = 800;
var mercator = d3.geo.mercator()
.scale(width / (2 * Math.PI));
// Project (lon, lat) points using the projection, to get pixel coordinates.
var pA = mercator(A), // [480, 121] (rounded)
pB = mercator(B), // [480, 152] (rounded)
pC = mercator(C); // [502, 121] (rounded)
现在使用欧几里得距离来计算投影点pA
, pB
和pC
之间的距离。
function dist(p, q) {
return Math.sqrt(Math.pow(p[0] - q[0], 2) + Math.pow(p[1] - q[1], 2));
}
var pDistAB = dist(pA, pB), // 31.54750649588999 pixels
pDistAC = dist(pA, pC); // 22.22222222222223 pixels
如果你使用角距离作为参考,你会得到两个比率,一个是AB,另一个是AC:
var ratioAB = distAB / pDistAB, // 0.005532384159178197 radians/pixels
ratioAC = distAC / pDistAC; // 0.005044678006596453 radians/pixels
如果你使用等矩形投影作为参考,你可以使用点之间的欧几里得距离(就好像它们在一个平面上):
var ratioAB = dist(A, B) / pDistAB, // 0.3169822629659431 degrees/pixels
ratioAC = dist(A, C) / pDistAC; // 0.44999999999999984 degrees/pixels