当您知道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个十进制数 这是给出坐标的第三种方式,因此首选此值的代码:
重复:
- 度数:分:秒(北纬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之间,所以它们的余弦是正的。其他因素是平方的。