当您知道java中的经度和纬度时,以米为单位计算距离

当您知道java中的经度和纬度时,以米为单位计算距离,java,distance,latitude-longitude,Java,Distance,Latitude Longitude,可能重复: 重复: 我需要计算由两个坐标给出的两点之间的距离。我正在从事的项目是一个Java项目,因此Java代码将非常棒,但也可以提供伪代码,然后我可以自己实现:) 您可能知道,有三种方式表示坐标: 度数:分:秒(北纬49度30英尺,西经123度30英尺) 度数:十进制分钟(49°30.0’,-123°30.0’,(49d30.0m,-123d30.0’) 十进制度数(49.5000°,-123.5000°),通常有4-6个十进制数 这是给出坐标的第三种方式,因此首选此值的代码:

可能重复:

重复:
我需要计算由两个坐标给出的两点之间的距离。我正在从事的项目是一个Java项目,因此Java代码将非常棒,但也可以提供伪代码,然后我可以自己实现:)

您可能知道,有三种方式表示坐标:

  • 度数:分:秒(北纬49度30英尺,西经123度30英尺)
  • 度数:十进制分钟(49°30.0’,-123°30.0’,(49d30.0m,-123d30.0’)
  • 十进制度数(49.5000°,-123.5000°),通常有4-6个十进制数
这是给出坐标的第三种方式,因此首选此值的代码:)

基于,我得到了此代码。。这将以米为单位计算结果,而不是以英里为单位:)


在C++中,这样做是:

#define LOCAL_PI 3.1415926535897932385 

double ToRadians(double degrees) 
{
  double radians = degrees * LOCAL_PI / 180;
  return radians;
}

double DirectDistance(double lat1, double lng1, double lat2, double lng2) 
{
  double earthRadius = 3958.75;
  double dLat = ToRadians(lat2-lat1);
  double dLng = ToRadians(lng2-lng1);
  double a = sin(dLat/2) * sin(dLat/2) + 
             cos(ToRadians(lat1)) * cos(ToRadians(lat2)) * 
             sin(dLng/2) * sin(dLng/2);
  double c = 2 * atan2(sqrt(a), sqrt(1-a));
  double dist = earthRadius * c;
  double meterConversion = 1609.00;
  return dist * meterConversion;
}
import org.gavaghan.geodesy.*;

...

GeodeticCalculator geoCalc = new GeodeticCalculator();

Ellipsoid reference = Ellipsoid.WGS84;  

GlobalPosition pointA = new GlobalPosition(latitude, longitude, 0.0); // Point A

GlobalPosition userPos = new GlobalPosition(userLat, userLon, 0.0); // Point B

double distance = geoCalc.calculateGeodeticCurve(reference, userPos, pointA).getEllipsoidalDistance(); // Distance between Point A and Point B
您可以使用,它使用考虑地球表面曲率的

实施过程如下:

#define LOCAL_PI 3.1415926535897932385 

double ToRadians(double degrees) 
{
  double radians = degrees * LOCAL_PI / 180;
  return radians;
}

double DirectDistance(double lat1, double lng1, double lat2, double lng2) 
{
  double earthRadius = 3958.75;
  double dLat = ToRadians(lat2-lat1);
  double dLng = ToRadians(lng2-lng1);
  double a = sin(dLat/2) * sin(dLat/2) + 
             cos(ToRadians(lat1)) * cos(ToRadians(lat2)) * 
             sin(dLng/2) * sin(dLng/2);
  double c = 2 * atan2(sqrt(a), sqrt(1-a));
  double dist = earthRadius * c;
  double meterConversion = 1609.00;
  return dist * meterConversion;
}
import org.gavaghan.geodesy.*;

...

GeodeticCalculator geoCalc = new GeodeticCalculator();

Ellipsoid reference = Ellipsoid.WGS84;  

GlobalPosition pointA = new GlobalPosition(latitude, longitude, 0.0); // Point A

GlobalPosition userPos = new GlobalPosition(userLat, userLon, 0.0); // Point B

double distance = geoCalc.calculateGeodeticCurve(reference, userPos, pointA).getEllipsoidalDistance(); // Distance between Point A and Point B

产生的距离以米为单位。

为什么要转换为浮动,然后再转换回浮动?
返回(浮动)(dist*meterConversion)
地球半径是3958.75英里,而不是公里。因此,上面的代码返回英里。@SwineFaster:在倒数第二行中有一个meterConversion常量,它将英里转换为米。只需使用6369作为地球半径,而不是英里,然后再将其转换为公制。请看一下纬度/经度距离计算器。它有一个到相关源代码的链接(包括解释)和一个到计算背后的数学的链接。这真的很有趣。向你展示了我认为你有问题的那部分公式?您可能需要指定是需要从点a到点B(穿过地球)的直线,还是需要场地上显示的距离。对不起,我记不清他们的名字了。然而,代码似乎相对简单。我成功地使用了这个网站上的代码:*我必须对答案进行一些计算,才能将其转换为欧洲米,但这是非常直接的:)请参见Vicenty公式----如果你关心地球不完全是一个球体,请看“a”“是负的吗?”西维号。纬度在-pi/2和pi/2之间,所以它们的余弦是正的。其他因素是平方的。