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



请说明一下这个情况

现在我有两个数组,有附近地方的经纬度,也有用户位置的经纬度,现在我想计算用户位置和附近地方之间的距离,并想在listview中显示它们。

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

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

现在的问题是如何在这个方法中传递这两个纬度和经度相近的数组并得到距离数组

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

查看距离

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

或distanceBetween

计算两个位置之间以米为单位的近似距离,和可选初始和最终轴承之间的最短路径他们。距离和方位使用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;
}

试试这个代码。这里我们有两个经度和纬度值,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);
距离这里

""是地点之间的距离a &locationB (in Meters)

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

据我所知,distanceBetween()是用于遥远的地方,它的输出是一个WGS84椭球体。

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

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

distanceBetween也会给出距离,但它会将距离存储在float数组(results[0])中。如果结果长度为2或更大,则初始轴承存储在结果[1]中。如果结果长度大于等于3,则最终轴承存储在结果[2]

中。

希望这对你有帮助

我用distanceTo来表示A点到B点的距离,我认为这是正确的方法

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

我想自己实现这个,我最终阅读了维基百科页面上的大圆距离公式,因为没有足够的代码可供我使用作为基础。

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

直接使用.distanceTo方法。例:

private fun getDistance(locationA:Location, locationB:Location){
    val distance = locationA.distanceTo(locationB)
}

最新更新