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

是否有一个简单的计算,我可以做,将公里转换成一个值,我可以添加到 lat 或 lon 浮点数,以计算一个边界框搜索?不需要完全准确。

例如: 如果我在英国伦敦得到一个 lat/lon (51.5001524,-0.1262362) ,我想要计算从这一点开始的 lat 将是东/西25公里,而 lon 将是南/北25公里,我需要做什么才能将25公里转换成小数来加到上面的值?

我正在寻找一个通用的经验法则,即: 1公里 = = +/-0.XXX

编辑:

我最初对“ lat lon”的搜索没有返回这个结果:

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

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

176605 次浏览

近似转换如下:

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

这并不能完全纠正地球的极地扁平化——对于这一点,你可能需要一个更复杂的公式来使用 Wgs84参考椭球体(用于全球定位系统的模型)。但对于您的目的来说,这个错误可能是可以忽略不计的。

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

注意 : 请注意 latlong 坐标以度表示,而 cos函数以大多数(全部?)表示语言通常接受弧度,因此需要一个 度到弧度的换算

如果你使用的是 Java,Javascript 或者 PHP,那么有一个库可以精确地进行这些计算,使用一些有趣的复杂(但仍然很快)的三角函数:

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

Http://www.jstott.me.uk/jcoord/ -使用本库

            LatLng lld1 = new LatLng(40.718119, -73.995667);
LatLng lld2 = new LatLng(51.499981, -0.125313);
Double distance = lld1.distance(lld2);
Log.d(TAG, "Distance in kilometers " + distance);

感谢 吉姆 · 刘易斯的精彩回答,我想通过我在 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))

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

下面是 STContainsgeospace 函数的 SQL 服务器参考页:

Https://learn.microsoft.com/en-us/sql/t-sql/spatial-geography/stcontains-geography-data-type?view=sql-server-ver15

或者如果你不想使用方块和弧度转换,你可以总是使用距离函数来找到你需要的点:

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

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

如果您正确地实现了地理空间索引,那么您的搜索将比您正在使用的方法快得多