java - уравнение - Вычисляя расстояние между двумя точками, используя широту долготы, что я делаю неправильно?




расстояние между точками на прямой (4)

Вот моя попытка, это всего лишь фрагмент моего кода:

final double RADIUS = 6371.01;
double temp = Math.cos(Math.toRadians(latA))
            * Math.cos(Math.toRadians(latB))
            * Math.cos(Math.toRadians((latB) - (latA)))
            + Math.sin(Math.toRadians(latA))
            * Math.sin(Math.toRadians(latB));
    return temp * RADIUS * Math.PI / 180;

Я использую эти формулы для получения широты и долготы:

x = Deg + (Min + Sec / 60) / 60)

Вот функция Java, которая вычисляет расстояние между двумя точками lat / long .

редактировать

Я нашел еще одну ссылку на код .

И, размещенный ниже, на всякий случай, когда он снова исчезнет.

    private double distance(double lat1, double lon1, double lat2, double lon2, char unit) {
      double theta = lon1 - lon2;
      double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
      dist = Math.acos(dist);
      dist = rad2deg(dist);
      dist = dist * 60 * 1.1515;
      if (unit == 'K') {
        dist = dist * 1.609344;
      } else if (unit == 'N') {
        dist = dist * 0.8684;
        }
      return (dist);
    }

    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    /*::  This function converts decimal degrees to radians             :*/
    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    private double deg2rad(double deg) {
      return (deg * Math.PI / 180.0);
    }

    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    /*::  This function converts radians to decimal degrees             :*/
    /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
    private double rad2deg(double rad) {
      return (rad * 180.0 / Math.PI);
    }

    System.out.println(distance(32.9697, -96.80322, 29.46786, -98.53506, 'M') + " Miles\n");
    System.out.println(distance(32.9697, -96.80322, 29.46786, -98.53506, 'K') + " Kilometers\n");
    System.out.println(distance(32.9697, -96.80322, 29.46786, -98.53506, 'N') + " Nautical Miles\n");

Вот страница с примерами javascript для различных сферических вычислений. Самый первый на странице должен дать вам то, что вам нужно.

http://www.movable-type.co.uk/scripts/latlong.html

Вот код Javascript

var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad(); 
var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
        Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) *
        Math.sin(dLon/2) * Math.sin(dLon/2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c;

Где 'd' будет удерживать расстояние.


Примечание: это решение работает только на короткие расстояния.

Я попытался использовать предложенную формулой dommer для приложения и нашел, что это хорошо надолго, но в моих данных я использовал все очень короткие расстояния, а почта Доммера делала очень плохо. Мне нужна была скорость, и более сложные гео-калькулы работали хорошо, но были слишком медленными. Таким образом, в случае, если вам нужна скорость, и все вычисления, которые вы делаете, коротки (возможно <100 м или около того). Я нашел, что это небольшое приближение отлично работает. он предполагает, что мир плоский, вы не используете его, поэтому не используйте его на больших расстояниях, он работает, приближая расстояние до одной широты и долготы в заданной широте и возвращая расстояние Пифагора в метрах.

public class FlatEarthDist {
    //returns distance in meters
    public static double distance(double lat1, double lng1, 
                                      double lat2, double lng2){
     double a = (lat1-lat2)*FlatEarthDist.distPerLat(lat1);
     double b = (lng1-lng2)*FlatEarthDist.distPerLng(lat1);
     return Math.sqrt(a*a+b*b);
    }

    private static double distPerLng(double lat){
      return 0.0003121092*Math.pow(lat, 4)
             +0.0101182384*Math.pow(lat, 3)
                 -17.2385140059*lat*lat
             +5.5485277537*lat+111301.967182595;
    }

    private static double distPerLat(double lat){
            return -0.000000487305676*Math.pow(lat, 4)
                -0.0033668574*Math.pow(lat, 3)
                +0.4601181791*lat*lat
                -1.4558127346*lat+110579.25662316;
    }
}

Эта article Википедии содержит формулы и пример. Текст находится на немецком языке, но расчеты говорят сами за себя.





latitude-longitude