将纬度/经度偏移一定量的米的算法


108

我正在寻找一种算法,当给定纬度和经度对以及在笛卡尔坐标(x,y)中以米为单位的向量平移时,它将给我一个新坐标。有点像反向的Haversine。我也可以进行距离和航向变换,但这可能会比较慢并且不那么精确。理想情况下,当我在嵌入式系统上工作时,算法应该很快。精度并不严格,在10米以内就可以了。


因此,您可以很好地将地球建模为一个球体吗?
昏暗

1
是的,这很好,因为我希望偏移量小于1公里。
Thomas O

Answers:


107

如果您的位移不太大(不到几公里)并且您不在极点,请使用快速而肮脏的估计,y方向的111,111米(111.111公里)为1度(纬度),在x方向上的111,111 * cos(纬度)米为1度(经度)。


3
@托马斯:实际上,您可以非常接近两极。我使用1400 m的x和y位移对UTM计算进行了检查(因此总位移为2 km)。结果好到8.6米或更高。最差的纬度(对于这个方向和位移量)为81度:实际向北移动时,近似值实际上会更准确,并且误差会保持在10米以下,直到超过89.6度为止!
Whuber

60
顺便说一句,通过了解一些历史记录就很容易记住这些111111的魔幻数字:法国人最初对电表进行了定义,因此,沿着巴黎子午线从赤道到北极的距离为10 ^ 7米。因此,两个世纪前的法国测量师能力范围内,10 ^ 7/90 = 111,111.1米等于一个纬度。
ub

3
因此,使用公式,如果我想在y方向上从说10.0 N,10.0 E移动+ 100m,我是否只需加上100/111111?如果沿x方向+ 100m移动,它将是100÷(111,111×(cos 10))吗?只要确保我做对了。
Thomas O

5
@Thomas是的,是的。请注意,第二个公式应如何按原样扩展视x位移(通过除以小于1的数字),这是因为当您从赤道移向两极时,经度会变小。唯一可能的障碍是确保您和您的软件平台就“ cos”的含义达成共识:最好将cos(10)解释为10 的余弦,而不是10弧度!(如果不是,则10度= 10 * pi / 180弧度说明了简单的转换。)在这一点上,@ haakon_d提供的代码对您完全有意义。
Whuber

7
有人试图编辑此答案,用“ km”代替“ meters”。他们可能在欧洲用小数点表示逗号。我遵循美国的约定(我也相信这也是国际出版物的约定),即使用逗号将长数字字符串分成三组和小数点“”。而不是逗号。(在前面的注释中清楚地显示了此用法。)为避免歧义,我对答案进行了编辑以清楚地显示逗号和点的含义。
ub

56

就像利德曼在回答中所说的那样,威廉姆斯的航空公式是非常宝贵的资料,要将位移1公里以内的精度保持在10米以内,您可能需要使用更复杂的公式。

但是,如果您愿意接受点距大于200m的点超过10m的误差,则可以使用简化的平地计算。我认为对于1公里以内的偏移量,误差仍将小于50m。

 //Position, decimal degrees
 lat = 51.0
 lon = 0.0

 //Earth’s radius, sphere
 R=6378137

 //offsets in meters
 dn = 100
 de = 100

 //Coordinate offsets in radians
 dLat = dn/R
 dLon = de/(R*Cos(Pi*lat/180))

 //OffsetPosition, decimal degrees
 latO = lat + dLat * 180/Pi
 lonO = lon + dLon * 180/Pi 

这应该返回:

 latO = 51,00089832
 lonO = 0,001427437

7
我只想指出,这与我提供的答案相同,只是您用111,319.5代替了我的每度111,111米的值。在高纬度时,您的值会稍好一些,而在低纬度(0至约40度)时,您的值会稍差。这两个值均符合规定的精度要求。
whuber

1
+1用于提供代码。请注意,它比您怀疑的要准确(误差通常在2000 m内小于5 m)。
ub

1
我想知道是否应该在我的回答中加上一句话,即除了R的值外,这与您的解决方案相同,但为简洁起见,省略了它。谈到精度,只要您不给系统增加任何旋转误差,您就是对的。使用在局部投影坐标系中测量的偏移量,旋转误差可能会变得非常大。
haakon_d

1
这是一个很好的观点:我们隐式地假设x位移至少接近真实的东西向,而y位移接近南北。如果不是,则必须先将它们转换为等效的EW和NS位移(而不仅仅是“东”和“北”),然后再计算等效值。
ub

航空公式方程的d距离参数以弧度为单位,例如(距离/地球半径)。
user1089933

23

我发现,航空处方,这里是伟大的,这些类型的公式和算法。对于您的问题,请查看“经纬度给定的半径和距离”:此处

请注意,如果您想将三角函数的使用率保持在较低水平,则该算法可能对您的使用而言过于复杂。


谢谢你-看起来很理想。虽然我不知道距离是米还是其他度量单位。
Thomas O

2

首先投影点可能很有意义。您可以编写以下伪代码:

falt_coordinate = latlon_to_utm(original_koordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)

其中(x,y)是所需的偏移量。

您不需要使用utm(任何平面坐标系),只要在您所在的地区就可以。

您正在使用什么软件?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.