138

是否有一个简单的计算可​​以将 km 转换为可以添加到 lat 或 lon 浮点数以计算搜索边界框的值?它不需要完全准确。

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

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

编辑:

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

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

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

4

6 回答 6

253

大致的换算如下:

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

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

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

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

于 2009-08-10T07:32:49.193 回答
5

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

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

于 2009-08-10T07:41:13.090 回答
3

感谢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))
于 2019-07-23T07:55:46.093 回答
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);
于 2017-02-20T06:26:26.947 回答
1

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

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

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

utm.from_latlon 和 utm.to_latlon。

于 2018-08-23T16:26:38.617 回答
1

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

这是 STContains 地理空间函数的 SQL 服务器参考页面:

https://docs.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

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

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

于 2020-01-23T19:41:29.310 回答