Java中经纬度计算两点距离与区域校验的五种方法
2024.01.18 05:39浏览量:58简介:本文介绍了在Java中根据经纬度计算两点距离的五种方法,并提供了校验经纬度是否在圆/多边形区域内的算法推荐。通过这些方法,您可以轻松地处理地理空间数据,并进行相关的地理计算。
在Java中,根据经纬度计算两点之间的距离有多种方法。以下为您推荐五种常见的方法:
- 使用Haversine公式:Haversine公式是一个常用的计算两点之间球面距离的公式。它基于地球的近似椭球形状,适用于大多数情况。以下是一个使用Haversine公式的示例:
public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {double dLat = Math.toRadians(lat2 - lat1);double dLon = Math.toRadians(lon2 - lon1);lat1 = Math.toRadians(lat1);lat2 = Math.toRadians(lat2);double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +Math.cos(lat1) * Math.cos(lat2) *Math.sin(dLon / 2) * Math.sin(dLon / 2);double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));double distance = EARTH_RADIUS * c; // EARTH_RADIUS is the Earth radius in kilometers (6371km by default)return distance;}
- 使用Vincenty’s formulae:Vincenty’s formulae是一种更精确的计算两点之间距离的方法,适用于需要更高精度的应用。以下是一个使用Vincenty’s formulae的示例:
```java
public static double calculateDistanceVincenty(double lat1, double lon1, double lat2, double lon2) {
final int EARTH_RADIUS = 6371; // Earth radius in kilometers (by default)
double a = 6086980; // major axis of Earth ellipsoid (in meters)
double b = 6356300; // minor axis of Earth ellipsoid (in meters)
double f = 1 / 298.257223563; // flattening of Earth ellipsoid
double L = Math.toRadians(lon2 - lon1);
double U1 = Math.atan((1 - f) Math.tan(Math.toRadians(lat1)));
double U2 = Math.atan((1 - f) Math.tan(Math.toRadians(lat2)));
double sinU1 = Math.sin(U1);
double cosU1 = Math.cos(U1);
double sinU2 = Math.sin(U2);
double cosU2 = Math.cos(U2);
double lambda = L;
double lambdaP = 2 Math.PI;
double sinSigma = 0;
double cosSigma = 0;
double sigma = 0;
double cosSqAlpha = 0;
double cos2SigmaM = 0;
double C = f / 16384 100000; // fictitious constant (arc seconds)
int iterLimit = 100; // maximum number of iterations for Vincenty’s formulae
while (Math.abs(lambda - lambdaP) > 1e-12 && —iterLimit > 0) {
double sinLambda = Math.sin(lambda);
double cosLambda = Math.cos(lambda);
sinSigma = Math.sqrt((cosU2 sinLambda) (cosU2 sinLambda) +
(cosU1 sinU2 - sinU1 cosU2 cosLambda) (cosU1 sinU2 - sinU1 cosU2 cosLambda));
if (sinSigma == 0) return 0; // co-incident points (infinity distance)
cosSigma = sinU1 sinU2 + cosU1 cosU2 * cosLambda;
sigma = Math.atan2(sinSigma, cosSigma); // calculate the arc length [rad] between two

发表评论
登录后可评论,请前往 登录 或 注册