【问题标题】:Calculate second point knowing the starting point and distance知道起点和距离计算第二点
【发布时间】:2011-01-12 08:37:39
【问题描述】:

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

示例(伪代码):

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

new_PointB = PointA-Distance;

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

最好使用 PHP 或 Javascript。

谢谢

【问题讨论】:

标签: math trigonometry distance latitude-longitude


【解决方案1】:

您似乎正在测量距离 (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

【讨论】:

  • 感谢 Jim 的编辑示例!对此,我真的非常感激。我现在完全理解这个概念了。
  • Jimk Lewis:我在这里尝试使用你的公式 (stackoverflow.com/questions/8064930/…) 并没有得到一个完美的圆圈,请看看!
  • 嗯,这在全球任何地方都有效吗?似乎只在某些地方有效。我正在尝试在东南方向绘制一个点,有时我最终会改为西北方向。
  • 110540 和 111320,这些数字从何而来?
  • @gfan:地球表面纬度一度等于 110540 米。 1 度经度等于 111320 米(在赤道处)。它们是不同的,因为地球不是一个完美的球体。它在赤道处凸出,因此赤道周长略大于极地周长。
【解决方案2】:

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

【讨论】:

  • 球形三角是一个很好的提升点。如果距离大于几英里,它们将偏离地球并悬在空中。这是否重要取决于您的用例、精度和目标。也许他不是在研究地球仪,而是在某个平坦的空间。
  • Karl 和 akallio,感谢您的意见。我实际上是在平坦的表面上工作,距离约为 500 米。
  • 所以只是为了确认使用上面的转换:500meters = 0.2699784 sec of arc?
  • @akallio:海里是一弧分,而不是弧秒。这只适用于大圆圈——东或西一海里不对应于经度的 1/60 度,除了赤道。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • centerX=41.88592(纬度)和 centerY=-87.62788(经度)我的距离是 500 米。上面的计算没有给我原始位置右侧 500 米的坐标。距离的格式错误,所以我接下来想弄清楚。
    • true,这取决于轴承的约定。如果 0 是“向右”而 x+ 是“向右”,则交换 sin 和 cos...问题中没有给出约定,所以我随机编造了一些东西。
    • dx = cos(0) = 1, dy = sin(0) = 0, x = 41 + 500*1, y = -87 + 500*0
    • 如果要以经纬度表示dx和dy,则涉及到cos(latitude)校正因子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多