如何在地图上通过半径和中心计算东北坐标

时间:2019-03-18 18:40:17

标签: javascript google-maps math 2d coordinates

我有这个公式:

var bounds = map.getBounds();

var center = bounds.getCenter();
var ne = bounds.getNorthEast();

// r = radius of the earth in statute miles
var r = 3963.0;  

// Convert lat or lng from decimal degrees into radians (divide by 57.2958)
var lat1 = center.lat() / 57.2958; 
var lon1 = center.lng() / 57.2958;
var lat2 = ne.lat() / 57.2958;
var lon2 = ne.lng() / 57.2958;

// distance = circle radius from center to Northeast corner of bounds
var dis = r * Math.acos(Math.sin(lat1) * Math.sin(lat2) + 
  Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1));

它通过NE和中心计算半径。 我需要:用给定的半径和中心在用js编写的地图上计算NE坐标的公式。

1 个答案:

答案 0 :(得分:1)

好吧,首先我想这将有助于了解所用公式的来源。 在此之前,请注意,我将使用标准的数学坐标。这与地理上的经纬度有所不同,但应该易于转换

因此,球体上的点为(x,y,z)= r*(cos p sin t, sin p sin t, cos t)。因此p是从xy的角度,而tz轴的角度。

如果您有两个点(p,t)和(q,u),我们可以将第一个点旋转到p = 0,即绕x轴旋转。比点具有坐标(0,t)(q-p,u)。现在,我们围绕y旋转这些点,以使第一个点成为北极。

[ cos t, 0, -sin t]   [x]     [ cos t, 0, -sin t]   [ cos(q-p) sin(u)]
[    0   1,   0   ] . [y]  =  [    0   1,   0   ] . [ sin(q-p) sin(u)] 
[ sin t, 0,  cos t]   [z]     [ sin t, 0,  cos t]   [       cos(u)    ]

比以前新的z

z_new = sin(t) cos(q-p) sin(u) + cos(t)cos(u)

从这里到北极的弧长自然是

alpha = arcsin( sin(t) cos(q-p) sin(u) + cos(t)cos(u) )

,对于真实距离,我们必须乘以球体的半径r

现在相反。我们有一个点(p,t),并且想要(q,u),因为它的方向是与北方beta的角度d与北方成一个角度(p,t)。首先,我们将点(Pi + beta, d/r)设置为北极。这就是第二个点(p,t)(如果ccw,注角在数学上为正)。必须旋转该系统,以使北极到达给定的[ cos t, sin t, 0] [ cos p, 0, sin p] [x] [ -sin p, cos t, 0] . [ 0 1, 0 ] . [y] [ 0 , 0 , 1] [ -sin p, 0, cos p] [z] 。这是通过

完成的
(Pi + beta, d/r) = (gamma, theta)

设置z_new = -sin(p)cos(gamma)sin(theta)+cos(p)cos(theta) 我们得到

u = arccos( z_new )

因此:

x_new = cos(t) ( cos(p)cos(gamma)sin(theta) + sin(p)cos(theta) ) + sin(theta)sin(gamma)sin(theta)

最后:

x_new = cos(q)sin(u)

作为u,我们知道q = arccos( xnew / sin(u) ) = arccos( xnew / sqrt( 1 - z_new ) )

{{1}}

我希望我一切都好,并记住这是典型的数学极坐标,并且必须将其转换为地理上的正弦/余弦用法和角度定义