知道附近的地理坐标

时间:2012-09-21 06:47:33

标签: math

我正在使用地理坐标(纬度,经度)。我有一个墙角的坐标。

我想知道左下角右边10厘米处的坐标。我不确定是否有可能。

感谢。

1 个答案:

答案 0 :(得分:3)

简单方法

由于纬度和经度是非欧几里得表面(球面2空间)上的坐标系统,因此直接使用它们非常尴尬。

我建议如下。将两个坐标转换为3D笛卡尔向量:

z = R * sin(latitude);
Rcoslat = R * cos(latitude);
x = Rcoslat * cos(longitude);
y = Rcoslat * sin(longitude);

R = 6378 km地球的(平均)半径。请注意,大多数计算机语言中的大多数trig函数都使用弧度中的参数,因此在获取pi/180sin()之前,您必须将cos()的任何度数乘以v1 = (x1 y1 z1) v2 = (x2 y2 z2)

对墙的一侧的两个坐标执行此操作会为您提供两个向量

v3 = v1-v2  (if v1 is your leftmost coordinate)
v3 = v2-v1  (if v2 is your leftmost coordinate)

这些向量之间的差异将为您提供正确的方向:

v3

L = sqrt( v3x*v3x + v3y*v3y + v3z*v3z ) (width of the wall) v4 = v3/L * (L+10cm) = v3 * (1 + 10cm/L) 的长度是墙的宽度。将其延伸10厘米以获得新的矢量:

R

请注意,你必须在那里做一些单位杂耍,因为如果以公里为单位Lhypotxy = hypot( v4x, v4y) latitude = atan2( v4z, hypotxy ) longitude = atan2( v4y, v4x ) 也将以公里为单位。

现在你有了新的矢量,你可以将它转换回纬度/经度:

atan2

其中hypot(a,b)是四象限反正切,sqrt(a*a+b*b)只是计算atan2的一种相当标准的方法,可大大降低数值上/下溢的风险。请再次注意,大多数计算机语言中180/pi的输出将为弧度,因此如果您希望以度为单位的纬度/经度,则必须将结果乘以{ {1}}。

更准确的方法

上述方法由于某些简化而产生一些错误,这些简化在小规模(例如普通的日常墙壁)上几乎不可察觉。但是你的墙实际上是中国的长城,那么你会发现这些错误变得非常不可接受。

所犯错误是由于这些假设:

  1. 纬度和经度是球体上的坐标。通常,他们不是。如果它们来自某种质量的GPS接收器,它们会描述地球reference ellipsoid上的坐标。 这些坐标与笛卡尔向量之间的转换稍微复杂一些。

  2. 差异向量v3就是一个向量。向量是直线段,而连接点v1v2的实际线略微弯曲(因为地球不平坦)。因此,将v3扩展为查找v4会引入错误。您实际上必须扩展弯曲的行。同样,这可以简单地完成(通过假设地球再次是球体,并使用交叉和点积),或更准确地(通过延伸地球上的参考椭球线)。

  3. 这些修正是非常具体的,可能会变得非常长而且非常难看,所以我会把它留在这里。我认为"简单方法"无论如何,上面满足你的需要。

    然而,如果你需要更准确地做到这一点:如果你聪明,你将使用一些现有的Geo软件库。如果您更聪明,您将查找所有公式和相关信息并自行实施,发现您的实施有错误和副作用,纠正它们并再次学习:)