已知起点和距离,计算第二个点

29

使用给定的经纬度值(Point A),我想要计算距离点A X米、方向为0弧度的另一个点B的经纬度,然后显示点B的经纬度值。

示例(伪代码):

PointA_Lat = x.xxxx;
PointA_Lng = x.xxxx;
Distance = 3; //Meters
bearing = 0; //radians

new_PointB = PointA-Distance;

我能够计算两个点之间的距离,但我想知道在知道距离和方位角的情况下如何找到第二个点。

最好使用 PHP 或 Javascript。

谢谢


1
也许这个链接会有帮助:http://www.meridianworlddata.com/Distance-Calculation.asp - stacker
4个回答

49

看起来你正在用米(R)和极角(theta)逆时针测量距离。 对于你的目的(数百米),平面几何应该足够精确。在这种情况下,

dx = R*cos(theta) ; theta measured counterclockwise from due east
dy = R*sin(theta) ; dx, dy same units as R
如果theta是从正北方向顺时针测量的(例如,指南针方位角),则dx和dy的计算略有不同:
dx = R*sin(theta)  ; theta measured clockwise from due north
dy = R*cos(theta)  ; dx, dy same units as R

无论哪种情况,经度和纬度的变化都为:

delta_longitude = dx/(111320*cos(latitude))  ; dx, dy in meters
delta_latitude = dy/110540                   ; result in degrees long/lat

常数110540和111320之间的差异归因于地球的扁率(极圆周长和赤道圆周长不同)。

以下是一个使用您之前问题中的参数的示例:

假设起始位置位于经度-87.62788度,纬度41.88592度, 请找出距离起始位置500米西北方向的点的坐标。

如果我们从正东逆时针测量角度,“西北”对应于theta=135度。R为500米。

dx = R*cos(theta) 
   = 500 * cos(135 deg) 
   = -353.55 meters

dy = R*sin(theta) 
   = 500 * sin(135 deg) 
   = +353.55 meters

delta_longitude = dx/(111320*cos(latitude)) 
                = -353.55/(111320*cos(41.88592 deg))
                = -.004266 deg (approx -15.36 arcsec)

delta_latitude = dy/110540
               = 353.55/110540
               =  .003198 deg (approx 11.51 arcsec)

Final longitude = start_longitude + delta_longitude
                = -87.62788 - .004266
                = -87.632146

Final latitude = start_latitude + delta_latitude
               = 41.88592 + .003198
               = 41.889118

Jimk Lewis:我在这里尝试使用了你的公式(https://dev59.com/MF3Ua4cB1Zd3GeqP8w7A),但是并没有得到完美的圆形,请看一下! - Nyxynyx
这里有另一个公式(https://dev59.com/mIrda4cB1Zd3GeqPL2Z_),它与你的略有不同。哪个更好? - gfan
4
110540和111320这些数字来自哪里? - gfan
2
@gfan:地球表面上一度纬度相当于110540米。一度经度在赤道上相当于111320米。它们之间的差异是因为地球不是一个完美的球体。它在赤道处膨胀,所以赤道周长略大于极地周长。 - Jim Lewis
注意单位;方位/纬度/经度以度为单位 - 我使用弧度的np.sin/cos - 单位必须转换为相同的单位,然后它就可以正常工作了。 - Dimitris
显示剩余5条评论

3

如果您知道3600秒弧是1度(纬度或经度),一海里有1852米,而一海里等于1秒弧,这可能会有所帮助。当然,您要依赖距离相对较短,否则就必须使用球面三角学。


1
球面三角是一个很好的点。如果距离超过几英里,它们将偏离地球并悬空。这是否重要取决于您的用例、精度和目标。也许他不是在处理地球,而是一些平面空间。 - Karl
Karl和akallio,感谢您们的意见。我实际上正在处理一个平坦的表面,距离大约为500米。 - pawelglow
所以只需要确认使用上述转换:500米= 0.2699784秒角? - pawelglow
@akallio:海里是一弧分,而不是一弧秒。这仅在沿着大圆线的情况下成立——一个海里向东或向西并不对应于经度的1/60度,除非在赤道上。 - Jim Lewis

2

这里是使用Swift的更新版本:

let location = CLLocation(latitude: 41.88592 as CLLocationDegrees, longitude: -87.62788 as CLLocationDegrees)

let distanceInMeter : Int = 500
let directionInDegrees : Int = 135

let lat = location.coordinate.latitude
let long = location.coordinate.longitude

let radDirection : CGFloat = Double(directionInDegrees).degreesToRadians

let dx = Double(distanceInMeter) * cos(Double(radDirection)) 
let dy = Double(distanceInMeter) * sin(Double(radDirection))

let radLat : CGFloat = Double(lat).degreesToRadians

let deltaLongitude = dx/(111320 * Double(cos(radLat)))  
let deltaLatitude = dy/110540                   

let endLat = lat + deltaLatitude
let endLong = long + deltaLongitude

使用这个扩展:

extension Double {
    var degreesToRadians : CGFloat {
        return CGFloat(self) * CGFloat(M_PI) / 180.0
    }
}

-2

dx = sin(bearing)
dy = cos(bearing)
x = center.x + distdx;
y = center.y + dist
dy;

dx = 正弦(方位角)
dy = 余弦(方位角)
x = 中心点.x + 距离dx;
y = 中心点.y + 距离
dy;


中心点坐标为:纬度41.88592,经度-87.62788。我的距离是500米。上述计算并没有给出我原始位置右侧500米的坐标。距离格式错误,我正在尝试解决这个问题。 - pawelglow
真的,这取决于方位的约定。如果0表示“向右”,x+表示“向右”,那么交换正弦和余弦...问题中没有给出约定,所以我随意做了一个。 - Chris H
dx = cos(0) = 1,dy = sin(0) = 0,x = 41 + 5001,y = -87 + 5000 - Chris H
如果您想用经度和纬度的度数来表示dx和dy,那么需要考虑cos(latitude)的修正因子。 - Jim Lewis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接