使用纬度/经度和公里距离的简单计算?


119

我可以做一个简单的计算,将km转换为一个值,将该值添加到lat或lon float中,以计算搜索的边界框吗?它不需要完全准确。

例如:如果给了我英国伦敦的经纬度(51.5001524,-0.1262362),我想计算从那一点开始东/西25公里的经纬度,以及那个北/南25公里的经度。点,我需要怎么做才能将25公里转换为十进制以添加到上述值?

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

编辑:

我对“ lat lon”的原始搜索未返回以下结果:

如何计算给定经纬度位置的边界框?

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


Answers:


220

大致转换为:

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

对于地球的极地平坦度,这并不完全正确-因为您可能想要使用WGS84参考椭球(用于GPS的模型)更复杂的公式。但是对于您而言,该错误可能可以忽略不计。

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

注意:请注意,拉特隆坐标是以度表示的,而cos大多数(所有)语言中的函数通常都接受弧度,因此需要度到弧度的转换


您在第二个公式中表示cos(经度)吗?
奥德斯2014年

1
您是怎么想到的?我丢失了一些东西,请您详细说明经度计算吗?Ty
Odys 2014年

5
@Odys:如果要比较位于同一条经度线(北/南)上的两个点,它们位于一个大圆上,转换因子就是地球的极周长除以360度。但这与东西方向的测量有所不同,因为(除赤道外)您不是沿“大圆”测量,因此在给定纬度下的“周长”较小。校正因子证明是纬度的余弦。
Jim Lewis

17
我的解释:cos(0°) = 1=>因此,在赤道进行计算时没有应用校正因子。经度是那里最宽的。cos(90°) = 0=>在极点,经度汇合为一点。没有要计算的距离。
珍妮·奥赖利2014年

4
@Stijn:在调用Math.cos()之前,您需要将度数转换为弧度。
吉姆·刘易斯




1

感谢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)
    }

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

latDistance / 110.574
longDistance / (111.320 * cos(lat / .pi / 180))

我认为应该是“ lat * pi / 180”
magamig

1

为什么不使用正确制定的​​地理空间查询?

这是STContains地理空间功能上的SQL Server参考页:

https://docs.microsoft.com/zh-cn/sql/t-sql/spatial-geography/stcontains-geography-data-type?view=sql-server-ver15

或者,如果您不想使用box和radian转换,则cna始终使用distance函数来查找所需的点:

DECLARE @CurrentLocation geography; 
SET @CurrentLocation  = geography::Point(12.822222, 80.222222, 4326)

SELECT * , Round (GeoLocation.STDistance(@CurrentLocation ),0) AS Distance FROM [Landmark]
WHERE GeoLocation.STDistance(@CurrentLocation )<= 2000 -- 2 Km

几乎所有数据库都应该具有类似的功能。

如果正确实施了地理空间索引,您的搜索将比您使用的方法更快


1
请花点时间通读编辑帮助帮助中心。堆栈溢出上的格式与其他站点不同。
Dharman
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.