计算两个地理位置之间的距离

Posted

技术标签:

【中文标题】计算两个地理位置之间的距离【英文标题】:Calculating distance between two geographic locations 【发布时间】:2011-12-24 09:03:49 【问题描述】:

请解释一下这种情况

现在我有两个数组,具有附近地点的纬度和经度,还有用户位置纬度和经度现在我想计算用户位置和附近地点之间的距离,并希望在列表视图中显示它们。

我知道有一种计算距离的方法

public static void distanceBetween (double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results);

现在的问题是如何在这个方法中通过这两个具有附近纬度和经度的数组并获得距离数组。

【问题讨论】:

查看此链接:***.com/questions/5739734/…希望这会对您有所帮助。 感谢您的回复,但我想使用上述方法计算距离。 请澄清,从技术上讲,您只给了我们一个方法签名,这不足以知道在哪里可以找到方法文档。尝试添加有关包含类的信息 停止使用 distanceTo 因为它返回了错误的值:***.com/questions/30664031/… @Karamsa,但在您的链接中描述它可以正常工作。 【参考方案1】:

http://developer.android.com/reference/android/location/Location.html

看远方

返回此位置与该位置之间的大致距离(以米为单位) 给定的位置。距离使用 WGS84 椭球定义。

或距离之间

计算两个位置之间的近似距离(以米为单位),以及 可选的最短路径的初始和最终方位 他们。使用 WGS84 椭球定义距离和方位。

您可以根据纬度和经度创建 Location 对象:

Location locationA = new Location("point A");

locationA.setLatitude(latA);
locationA.setLongitude(lngA);

Location locationB = new Location("point B");

locationB.setLatitude(latB);
locationB.setLongitude(lngB);

float distance = locationA.distanceTo(locationB);

private double meterDistanceBetweenPoints(float lat_a, float lng_a, float lat_b, float lng_b) 
    float pk = (float) (180.f/Math.PI);

    float a1 = lat_a / pk;
    float a2 = lng_a / pk;
    float b1 = lat_b / pk;
    float b2 = lng_b / pk;

    double t1 = Math.cos(a1) * Math.cos(a2) * Math.cos(b1) * Math.cos(b2);
    double t2 = Math.cos(a1) * Math.sin(a2) * Math.cos(b1) * Math.sin(b2);
    double t3 = Math.sin(a1) * Math.sin(b1);
    double tt = Math.acos(t1 + t2 + t3);
   
    return 6366000 * tt;

【讨论】:

这是否给出了两个地方之间的公路距离? 不返回位移(两点之间的最短距离) float pk = (float) (180/3.14169); - 小错误,这不是 Pi... 它应该是 3.14159 或 Math.PI 使用(也 Math 类而不推荐使用 @987654327 @)。 57 票,没有人注意到? :D 有人确认locationA.distanceTo(locationB)是否考虑了海拔高度? 第二个代码块是干什么用的?为什么不直接使用Location. distanceBetween()【参考方案2】:

试试这个代码。这里我们有两个经度和纬度值,并且 selected_location.distanceTo(near_locations) 函数以米为单位返回这些地方之间的距离。

Location selected_location = new Location("locationA");
            selected_location.setLatitude(17.372102);
            selected_location.setLongitude(78.484196);
Location near_locations = new Location("locationB");
            near_locations.setLatitude(17.375775);
            near_locations.setLongitude(78.469218);
double distance = selected_location.distanceTo(near_locations);

这里的“distance”是locationA和locationB之间的距离(Meters

【讨论】:

【参考方案3】:

只有一个用户位置,所以可以迭代附近的地方列表可以调用distanceTo()函数获取距离,如果你喜欢可以存储在一个数组中。

据我了解,distanceBetween() 用于遥远的地方,它的输出是 WGS84 椭球。

【讨论】:

你能建议哪一个提供确切的距离吗?【参考方案4】:
    private static Double _MilesToKilometers = 1.609344;
    private static Double _MilesToNautical = 0.8684;


    /// <summary>
    /// Calculates the distance between two points of latitude and longitude.
    /// Great Link - http://www.movable-type.co.uk/scripts/latlong.html
    /// </summary>
    /// <param name="coordinate1">First coordinate.</param>
    /// <param name="coordinate2">Second coordinate.</param>
    /// <param name="unitsOfLength">Sets the return value unit of length.</param>
    public static Double Distance(Coordinate coordinate1, Coordinate coordinate2, UnitsOfLength unitsOfLength)
    

        double theta = coordinate1.getLongitude() - coordinate2.getLongitude();
        double distance = Math.sin(ToRadian(coordinate1.getLatitude())) * Math.sin(ToRadian(coordinate2.getLatitude())) +
                       Math.cos(ToRadian(coordinate1.getLatitude())) * Math.cos(ToRadian(coordinate2.getLatitude())) *
                       Math.cos(ToRadian(theta));

        distance = Math.acos(distance);
        distance = ToDegree(distance);
        distance = distance * 60 * 1.1515;

        if (unitsOfLength == UnitsOfLength.Kilometer)
            distance = distance * _MilesToKilometers;
        else if (unitsOfLength == UnitsOfLength.NauticalMiles)
            distance = distance * _MilesToNautical;

        return (distance);

    

【讨论】:

【参考方案5】:

distanceTo 将为您提供两个给定位置 ej target.distanceTo(destination) 之间的距离(以米为单位)。

distanceBetween 也为您提供距离,但它会将距离存储在浮点数组中(结果 [0])。文档说如果结果的长度为 2 或更大,则初始方位存储在结果 [1] 中。如果 results 的长度为 3 或更大,则最终方位存储在 results[2] 中

希望这会有所帮助

我使用 distanceTo 来获取从 A 点到 B 点的距离,我认为这是要走的路。

【讨论】:

【参考方案6】:
public double distance(Double latitude, Double longitude, double e, double f) 
        double d2r = Math.PI / 180;

        double dlong = (longitude - f) * d2r;
        double dlat = (latitude - e) * d2r;
        double a = Math.pow(Math.sin(dlat / 2.0), 2) + Math.cos(e * d2r)
                * Math.cos(latitude * d2r) * Math.pow(Math.sin(dlong / 2.0), 2)
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double d = 6367 * c;
                return d;

    

【讨论】:

【参考方案7】:

我想自己实现这一点,我最终阅读了Great-circle distance formula 上的***页面,因为没有代码可读性足以让我用作基础。

C# 示例

    /// <summary>
    /// Calculates the distance between two locations using the Great Circle Distance algorithm
    /// <see cref="https://en.wikipedia.org/wiki/Great-circle_distance"/>
    /// </summary>
    /// <param name="first"></param>
    /// <param name="second"></param>
    /// <returns></returns>
    private static double DistanceBetween(GeoLocation first, GeoLocation second)
    
        double longitudeDifferenceInRadians = Math.Abs(ToRadians(first.Longitude) - ToRadians(second.Longitude));

        double centralAngleBetweenLocationsInRadians = Math.Acos(
            Math.Sin(ToRadians(first.Latitude)) * Math.Sin(ToRadians(second.Latitude)) +
            Math.Cos(ToRadians(first.Latitude)) * Math.Cos(ToRadians(second.Latitude)) *
            Math.Cos(longitudeDifferenceInRadians));

        const double earthRadiusInMeters = 6357 * 1000;

        return earthRadiusInMeters * centralAngleBetweenLocationsInRadians;
    

    private static double ToRadians(double degrees)
    
        return degrees * Math.PI / 180;
    

【讨论】:

以上是关于计算两个地理位置之间的距离的主要内容,如果未能解决你的问题,请参考以下文章

R语言distRhumb函数计算距离实战(两个地理点之间的Rhumb距离)

在iphone中使用谷歌地图计算两个位置之间的距离

如何在php中计算两个位置之间的距离(以公里为单位)?

C、计算两个GPS位置之间的距离?

如何使用它们的经度和纬度值计算两个位置之间的距离

两个 GEO 位置之间的距离 [重复]