如何编写计算地球上两点之间距离的Java程序?

时间:2012-10-28 08:15:38

标签: java math latitude-longitude radians earthdistance

我知道如何开始它,我知道如何放入扫描仪和所有东西,但在学校,我从来没有真正了解经度和纬度公式以及如何将这些点转换为弧度。所以我几乎坚持这个Java问题。以下是我到目前为止的情况:

import java.util.*;

class DistanceCalculator {

    // Radius of the earth in km; this is the class constant.
    public static final double Radius = 6372.795; 

    /**
     * This program computes the spherical distance between two points on the surface of the Earth.
     */

    public static void main(String[] args) {
        Scanner console = new Scanner(System.in);
        intro();

        System.out.print("Longitude (degrees.minutes) ");
        double Longitude = console.nextDouble();
        System.out.print("Latitude (degrees.minutes) ");
        double Latitude = console.nextDouble(); 
    }

    public static double distFrom(double lat1, double lng1, double lat2, double lng2); 
        double Latitude = Math.toRadians(...);  
    }

    public static void intro() {
        System.out.println("This program computes the spherical distance between two points on the surface of the Earth.");
        System.out.println("\tPlease start by entering the longitude and the latitude of location 1.");
    }
}

在Java IDE中,他们说没有使用经度和纬度点(intro();下面的点),我知道为什么,因为我还没有真正定义它们。 我知道我错过了经度和纬度的公式。在我的书中,它希望我使用余弦的球面定律,因为我从未在学校学到这一点,无论我从我所寻求的网站上学习公式有多难,我都不知道如何转移它到Java语言 另一个问题是,如何将度数和分钟从经度/纬度点转换为弧度?我必须使用Math.toRadians的东西吗?哦,是的,我的回答必须是公里。

更新:你们中的一些人正在谈论的数学函数让我很困惑。在学校(我是一个高中生),即使在数学IB SL,我的老师从未教我们如何找到长/拉。点...但。所以我很难掌握。由于余弦公式的球面定律在线,我基本上只是采用该公式并将其转换为“java语言”并将其插入我的程序中吗?

4 个答案:

答案 0 :(得分:3)

您需要搜索的关键字是"Haversine formula"

一种更容易理解的方法,但对于小距离而言不太准确的方法是回想一下,可以使用点积计算两个向量AB之间的角度: / p>

  

A⋅B= | A | * | B | * cos(theta)

所以,如果你将你的极地纬度/长对转换为3D笛卡尔坐标(是的,你需要使用Math.toRadians()Math.cos()Math.sin()来做到这一点,然后计算点积后,您将获得cos(theta),因此请使用Math.acos()获取theta

然后,您可以将距离计算为D = R * theta,其中R是地球的半径,theta保持为弧度。

答案 1 :(得分:0)

我建议您详细了解WGS84

Mathematical explanations here.

答案 2 :(得分:-1)

您可以查看此链接以获取逻辑。

http://aravindtrue.wordpress.com/2009/06/30/calculate-distance-using-latitude-and-longitude-php-mysql/

PHP中的功能......我不懂Java。所以有人编辑我的帖子。这是PHP函数:

function getDistanceBetweenPointsNew($latitude1, $longitude1,
$latitude2, $longitude2, $unit = 'Mi')
{
    $theta = $longitude1 - $longitude2;
    $distance = (sin(deg2rad($latitude1)) *
    sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) *
    cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
    $distance = acos($distance);
    $distance = rad2deg($distance);
    $distance = $distance * 60 * 1.1515;
    switch($unit)
    {
        case 'Mi': break;
        case 'Km' : $distance = $distance *1.609344;
    }
    return (round($distance,2));
}

也是为了从MySQL数据库中获取价值:

Calculate distance given 2 points, latitude and longitude

我试图创建一个java函数,我不知道它是否有效。

试试这个。如果有人可以提供帮助,请尝试编辑我的java代码。

import java.math.BigDecimal;

public static double round(double unrounded, int precision, int roundingMode)
{
    BigDecimal bd = new BigDecimal(unrounded);
    BigDecimal rounded = bd.setScale(precision, roundingMode);
    return rounded.doubleValue();
}

public static double distFrom(double lat1, double lng1, double lat2, double lng2, String unit)
{
    double theta = lng1 - lng2;

    double distance = (
        Math.sin(Math.toRadians(lat1)) * Math.sin(Math.toRadians(lat2))
     )+(
        Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.cos(Math.toRadians(theta))
     );
    distance = Math.acos(distance);
    distance = Math.toDeg(distance);
    distance = distance * 60 * 1.1515;

    switch(unit)
    {
        /* Mi = miles, Km = Kilometers */
        case "Mi"   : 
            break;
        case "Km"   : 
            distance = distance *1.609344;
            break;
    }
    distance = round(distance, 2, BigDecimal.ROUND_HALF_UP);
    return distance;
}

答案 3 :(得分:-1)

     import java.util.*;

       public class SphericalDistance {
public static void main(String[] args){
System.out.println(" This program computes the spherical distance\n between two points, 1 and 2.");
System.out.println(" Please enter the latitude and longitude for \n each point as a pair of integers, degrees \n followed by minutes:");
System.out.print("Latitude 1:");
    Scanner s=new Scanner(System.in);
    double latangledeg = s.nextDouble();
    double latanglemin = s.nextDouble()/60;

    double phideg = latangledeg + latanglemin;
    double phi1 = phideg * Math.PI/180;


    System.out.print("Longitude 1:");

    double lonangledeg = s.nextDouble();
    double lonanglemin = s.nextDouble()/60;

    double lambdadeg = lonangledeg + lonanglemin;
    double lambda1 = lambdadeg * Math.PI/180;


    System.out.println("Latitude 2:");

    double latangledeg2 = s.nextDouble();
    double latanglemin2 = s.nextDouble()/60;

    double phideg2 = latangledeg2 + latanglemin2;
    double phi2 = phideg2 * Math.PI/180;


    System.out.println("Longitude 2:");

    double lonangledeg2 = s.nextDouble();
    double lonanglemin2 = s.nextDouble()/60;

    double lambdadeg2 = lonangledeg2 + lonanglemin2;
    double lambda2 = lambdadeg2 * Math.PI/180;


    double lambdaf = lambda2 - lambda1;
    double angdistance = Math.acos(Math.sin(phi1)*Math.sin(phi2) + Math.cos(phi1)*Math.cos(phi2)*Math.cos(lambdaf));
    System.out.println("Angular Distance = " + angdistance + " radians");
    int distancekm = (int)(angdistance * 6372.795);
    int distancemi = (int) (distancekm * .621371);
    System.out.println("Distance         = " + distancekm + " kilometers");
    System.out.println("Distance         = " + distancemi + " miles");

    s.close();
}

}