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

问题描述 投票:0回答:7

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

例如:如果给我一个英国伦敦的纬度/经度(51.5001524,-0.1262362),我想计算从该点向东/向西 25 公里的经度是多少,以及从该点向北/向南 25 公里的经度是多少那么,我需要做什么才能将 25 公里转换成小数以添加到上面的值中?

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

编辑:

我最初搜索“lat lon”没有返回此结果:

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

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

algorithm geometry geolocation
7个回答
279
投票

大致换算为:

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

这并不能完全纠正地球极地扁平化的情况 - 为此,您可能需要使用 WGS84 参考椭球体(用于 GPS 的模型)的更复杂的公式。但对于您的目的而言,该错误可能可以忽略不计。

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

警告:请注意,经纬度坐标以度数表示,而大多数(所有?)语言中的

cos
函数通常接受弧度,因此需要度到弧度的转换


5
投票

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

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


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

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

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

1
投票

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);

1
投票

有趣的是我没有看到提到 UTM 坐标。

https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system

至少如果你想将公里添加到同一区域,它应该很简单(在Python中:https://pypi.org/project/utm/

utm.from_latlon 和 utm.to_latlon。


0
投票

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

这里是 STContains 地理空间函数的 SQL Server 参考页面:

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

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

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


0
投票

在 R 中呢?我试图找出两个样本收集区域的距离。我有经度和纬度(度)格式的两个样本收集地点的坐标。我需要找到两者之间的距离(以公里为单位),这意味着我需要将坐标转换为公里。我在这种情况下使用 R。你认为我可以做同样的事情吗?

© www.soinside.com 2019 - 2024. All rights reserved.