1

给定地球表面上的正方形 ABCD(Equirectangular),A 和 B 在格林威治子午线上,B 和 C 在子午线经度 = 10⁰:

A( 0.0; 50.0)          C(10.0; 50.0)

B( 0.0; 40.0)          B(10.0; 40.0)

鉴于我的 D3js dataviz 在d3.geo.mercator()投影中工作,我的正方形垂直变换了r= mercator_height in px/width in px大约 1.5 的比率。

如何准确计算这个墨卡托变换比r

注意:这是非线性的,因为它暗示了一些1/cos()[2]。


编辑:我很想我们应该首先d3.geo.mercator()在屏幕上重新投影每个点(如何?哪种语法?),所以D3做所有的硬数学。然后我们可以 GET 点的像素坐标,所以我们可以计算长度 AB 和长度 AC 以像素为单位,最后r=AC/AB. 另外,如何将十进制度坐标转换为所选的投影像素坐标函数有点麻烦d3.geo.<PROJECTIONNAME>()

[2]:墨卡托:比例因子沿子午线随纬度变化?

4

1 回答 1

1

我将假设这些点是 A: (0, 50), B: (0, 40), C: (10, 50) 和 D: (10, 40)。由点(A、C、D、B)包围的特征将使用 equirectangular 投影看起来像一个正方形。现在,这些点是经度、纬度对,您可以使用 计算点之间的大弧距离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距离pBpC

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

如果使用 equirectangular 投影作为参考,则可以使用点之间的欧几里德距离(就好像它们在平面中一样):

var ratioAB = dist(A, B) / pDistAB, // 0.3169822629659431  degrees/pixels
    ratioAC = dist(A, C) / pDistAC; // 0.44999999999999984 degrees/pixels
于 2014-08-20T13:52:10.667 回答