我正在使用地理坐标(纬度,经度)。我有一个墙角的坐标。
我想知道左下角右边10厘米处的坐标。我不确定是否有可能。
感谢。
答案 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/180
或sin()
之前,您必须将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
请注意,你必须在那里做一些单位杂耍,因为如果以公里为单位L
,hypotxy = hypot( v4x, v4y)
latitude = atan2( v4z, hypotxy )
longitude = atan2( v4y, v4x )
也将以公里为单位。
现在你有了新的矢量,你可以将它转换回纬度/经度:
atan2
其中hypot(a,b)
是四象限反正切,sqrt(a*a+b*b)
只是计算atan2
的一种相当标准的方法,可大大降低数值上/下溢的风险。请再次注意,大多数计算机语言中180/pi
的输出将为弧度,因此如果您希望以度为单位的纬度/经度,则必须将结果乘以{ {1}}。
上述方法由于某些简化而产生一些错误,这些简化在小规模(例如普通的日常墙壁)上几乎不可察觉。但是你的墙实际上是中国的长城,那么你会发现这些错误变得非常不可接受。
所犯错误是由于这些假设:
纬度和经度是球体上的坐标。通常,他们不是。如果它们来自某种质量的GPS接收器,它们会描述地球reference ellipsoid上的坐标。 这些坐标与笛卡尔向量之间的转换稍微复杂一些。
差异向量v3
就是一个向量。向量是直线段,而连接点v1
和v2
的实际线略微弯曲(因为地球不平坦)。因此,将v3
扩展为查找v4
会引入错误。您实际上必须扩展弯曲的行。同样,这可以简单地完成(通过假设地球再次是球体,并使用交叉和点积),或更准确地(通过延伸地球上的参考椭球线)。
这些修正是非常具体的,可能会变得非常长而且非常难看,所以我会把它留在这里。我认为"简单方法"无论如何,上面满足你的需要。
然而,如果你需要更准确地做到这一点:如果你聪明,你将使用一些现有的Geo软件库。如果您更聪明,您将查找所有公式和相关信息并自行实施,发现您的实施有错误和副作用,纠正它们并再次学习:)