使用lat/lon + km距离的简单计算?

Phi*_*ham 114 algorithm geometry geolocation

我可以做一个简单的计算,它会将km转换为一个值,我可以将其添加到lat或lon浮点数来计算搜索的边界框吗?它不需要完全准确.

例如:如果给我伦敦,英格兰的纬度/经度(51.5001524,-0.1262362),我想计算那个纬度从那个点开始向西/向西25公里的东西,以及从那个南北25公里的lon点,我需要做什么才能将25km转换成小数加上上面的值?

我正在寻找一般的经验法则,即:1km == +/- 0.XXX

编辑:

我对"lat lon"的原始搜索未返回此结果:

如何计算给定lat/lng位置的边界框?

接受的答案似乎足以满足我的要求.

Jim*_*wis 206

大致的转化次数为:

  • 纬度:1度= 110.574公里
  • 经度:1度= 111.320*cos(纬度)km

这并不能完全纠正地球的极地平坦化 - 因为你可能想要使用WGS84参考椭球(用于GPS的模型)的更复杂的公式.但是对于您的目的,错误可能是微不足道的.

资料来源:http://en.wikipedia.org/wiki/Latitude

注意:请注意,latlong坐标以度表示,而cos大多数(所有?)语言中的函数通常接受弧度,因此需要一定程度的弧度转换.

  • 我的解释:````cos(0°)= 1```` =>因此在赤道上进行计算时没有应用校正因子.经度是那里最宽的.````cos(90°)= 0```` =>在极点,经度在一个点上相遇.没有距离可以计算. (15认同)
  • @Odys:如果你比较位于同一经度线(北/南)的两个点,它们就位于一个大圆上,转换因子就是地球的极地周长除以360度.但是对于东西向测量来说它是不同的,因为(除了赤道)你没有沿着"大圆"测量,所以给定纬度的"周长"更小.并且校正因子结果是纬度的余弦. (5认同)
  • @Stijn:在调用Math.cos()之前,需要将度数从度数转换为弧度. (4认同)
  • 这个近似值有名称和参考吗? (2认同)

ska*_*man 6

如果您使用的是Java,Javascript或PHP,则可以使用一些有趣的复杂(但仍很快)的三角函数来精确地进行这些计算:

http://www.jstott.me.uk/jcoord/

  • 链接已损坏! (4认同)

小智 5

感谢Jim Lewis的精彩回答,我想通过我在 Swift 中的函数来说明这个解决方案:

func getRandomLocation(forLocation location: CLLocation, withOffsetKM offset: Double) -> CLLocation {
        let latDistance = (Double(arc4random()) / Double(UInt32.max)) * offset * 2.0 - offset
        let longDistanceMax = sqrt(offset * offset - latDistance * latDistance)
        let longDistance = (Double(arc4random()) / Double(UInt32.max)) * longDistanceMax * 2.0 - longDistanceMax
        
        let lat: CLLocationDegrees = location.coordinate.latitude + latDistance / 110.574
        let lng: CLLocationDegrees = location.coordinate.longitude + longDistance / (111.320 * cos(lat * .pi / 180))
        return CLLocation(latitude: lat, longitude: lng)
    }
Run Code Online (Sandbox Code Playgroud)

在这个转换距离的函数中,我使用以下公式:

latDistance / 110.574
longDistance / (111.320 * cos(lat * .pi / 180))
Run Code Online (Sandbox Code Playgroud)

  • 我认为应该是“lat * pi / 180” (5认同)