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

时间:2009-08-10 07:14:24

标签: algorithm geometry geolocation

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

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

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

修改

我对“lat lon”的原始搜索没有返回此结果:

How to calculate the bounding box for a given lat/lng location?

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

6 个答案:

答案 0 :(得分:195)

大致的转化次数为:

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

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

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

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

答案 1 :(得分:5)

如果你正在使用Java,Javascript或PHP,那么有一个库可以使用一些有趣的复杂(但仍然很快)的三角函数来完成这些计算:

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

答案 2 :(得分: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。

答案 3 :(得分:1)

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

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

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

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

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

答案 4 :(得分:0)

http://www.jstott.me.uk/jcoord/ - 使用此库

if (count($located) > 0) {
    echo '<table>';

    foreach($located as $locate){
        echo "<tr><td>".$locate['computer_number']."</td><td>".$locate['name']."</td><"</td><td><img src=". base_url()."inc/images/confirm.png width='45' height='30' border='0' class='computer_number' data-id='".$locate['computer_number']."'/></td></tr>";
    }
    echo '</table>';
}

答案 5 :(得分:0)

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