计算知道起点和距离的第二点

使用纬度和经度值(A点),我试图计算另一个B点,X点距离A点0弧度。然后显示B点纬度和经度值。

示例(伪代码):

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

我能够计算两点之间的距离,但我想find的是知道距离和方位的第二点。

最好在PHP或Javascript。

谢谢

看来你正在测量以米为单位的距离(R),从正东逆时针方向(θ)。 而为了你的目的(米的狩猎),平面的几何形状应该足够精确。 在这种情况下,

 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度处,从起始位置find西北500米点的坐标。

如果我们从正东逆时针测量angular度,“西北”对应于θ= 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 

如果你知道3600秒的弧度是1度(纬度或长度),海里有1852米,弧度是1海里,这可能会有所帮助。 当然,你要看的距离相对较短,否则你将不得不使用球面三angular。

这里是使用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 } } 

dx = sin(方位)
dy = cos(方位)
x = center.x + dist dx;
y = center.y + dist dy;