根据两个经纬度计算两地距离

[color=red]com.baidu.mapapi.utils.DistanceUtil[/color]



[url]http://www.verydemo.com/demo_c161_i59188.html[/url]

[url]http://ypf3027.iteye.com/blog/427055[/url]
[url]http://www.blogjava.net/sinoly/archive/2007/01/22/95406.html[/url]


package a;

public class Distance {

private static final double EARTH_RADIUS = 6378137.0;

public static void main(String[] args) {
double lo1 = 108.90, la1 = 34.1;// 第一个经纬度
double lo2 = 115.4648060, la2 = 38.8738910;// 第二个经纬度
System.out.println("经纬度结果:" + getDistance(lo1, la1, lo2, la2));
System.out.println("经纬度结果:" + getDistance(0, 0, 0, 0));

}

// 返回单位是米
public static double getDistance(double longitude1, double latitude1,
double longitude2, double latitude2) {

double Lat1 = rad(latitude1);
double Lat2 = rad(latitude2);
double a = Lat1 - Lat2;
double b = rad(longitude1) - rad(longitude2);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
+ Math.cos(Lat1) * Math.cos(Lat2)
* Math.pow(Math.sin(b / 2), 2)));
s = s * EARTH_RADIUS;
s = Math.round(s * 10000) / 10000;
return s;
}

private static double rad(double d) {
return d * Math.PI / 180.0;
}

}
<think>好的,用户想根据两个地点的经纬度计算它们之间的距离,需要公式、示例和代码。首先,我需要回忆相关的地理计算公式。记得常用的有Haversine公式,还有球面余弦定律。不过根据用户提供的引用内容,里面提到了不同的公式,比如引用[1]中的方法使用了反余弦函数,而引用[3]和[4]则提到了Haversine公式。我需要比较这两种方法的区别和适用情况。 首先,球面余弦定律可能在两点距离较远时,由于计算中的精度问题,尤其是当点之间接近对跖点时,可能会出现误差。而Haversine公式在计算大圆距离时更稳定,适合大多数情况。用户提供的引用中有不同的实现,例如PHP中的例子使用了Haversine公式,而引用[1]中的Java方法可能用的是余弦定律。需要确认这两种方法的正确性。 接下来,我需要整理公式的步骤。根据引用[1],计算步骤包括处理经纬度,将东经和西经转换为正值和负值,北纬和南纬转换为90-Latitude或90+Latitude。不过这里可能需要确认,是否这个处理是必要的。通常,经纬度的处理是将度数转换为弧度,然后应用三角函数。例如,北纬为正,南纬为负;东经为正,西经为负,然后转换为弧度。但用户提供的引用[1]中的处理方式可能不同,需要仔细分析。 引用[1]中的公式是:C = sin(MLatA)*sin(MLatB)*cos(MLonA-MLonB) + cos(MLatA)*cos(MLatB),然后Distance = R*Arccos(C)*Pi/180。这可能存在问题,因为通常球面余弦定律的公式是:a = sin²(Δφ/2) + cosφ1 * cosφ2 * sin²(Δλ/2),然后c = 2 * atan2(√a, √(1−a)),距离是R * c。而Haversine公式更准确,适用于各种情况,尤其是短距离时的计算。所以用户提供的引用[1]中的方法可能使用的是余弦定律,但需要检查是否有错误。 另外,引用[3]和[4]中的PHP代码使用了Haversine公式,例如pow(sin($calcLatitude / 2), 2)加上cos的乘积,然后乘以地球半径。因此,可能需要比较这两种方法,并给出正确的公式。 现在需要明确步骤:首先将经纬度转换为弧度,然后计算差值,再应用Haversine公式或余弦定律。根据用户的引用,可能需要给出两种方法的示例,并说明哪种更推荐。 关于代码示例,用户可能希望看到不同语言的实现,比如Python,因为用户提供的示例中有Python代码。但用户提供的引用中有Java和PHP的例子,所以可能需要用Python实现这两种方法。不过用户的问题并没有指定语言,所以可能需要给出通用公式,并提供多种语言的示例,或者选择最常用的方式,比如Python。 另外,需要注意地球半径的选择,例如6371公里或6378公里,这可能影响结果的精确度。引用[4]中使用了6378.137公里,可能对应WGS84椭球模型。需要统一说明。 总结步骤: 1. 将经纬度转换为弧度。 2. 计算经度和纬度的差值。 3. 应用Haversine公式计算两点间的大圆距离。 4. 乘以地球半径得到实际距离。 或者使用余弦定律的步骤: 1. 将经纬度转换为弧度。 2. 应用余弦公式计算弧长,再乘以地球半径。 需要验证这两种方法是否正确,并指出哪种更准确。根据资料,Haversine公式在计算距离时更准确,而余弦定律可能在长距离时出现计算误差,特别是在接近对跖点的时候。 接下来,需要编写公式部分,使用LaTeX格式。例如,Haversine公式的数学表达式: $$ a = \sin^2\left(\frac{\Delta\phi}{2}\right) + \cos\phi_1 \cdot \cos\phi_2 \cdot \sin^2\left(\frac{\Delta\lambda}{2}\right) $$ $$ c = 2 \cdot \arctan2(\sqrt{a}, \sqrt{1-a}) $$ $$ \text{Distance} = R \cdot c $$ 然后给出Python代码示例,使用Haversine公式实现。 同时,用户提供的引用中有不同的代码片段,比如引用[1]中的方法可能需要处理经纬度为特定的值,但可能存在问题,所以更推荐使用Haversine公式。需要指出这一点。 最后,生成相关问题,例如关于公式的选择、不同方法的优缺点、如何优化计算等。</think>### 根据经纬度计算两地距离的方法 #### 核心公式 计算地球表面两点间距离的常用方法是**Haversine公式**,其数学表达式为: $$ a = \sin^2\left(\frac{\Delta\phi}{2}\right) + \cos\phi_1 \cdot \cos\phi_2 \cdot \sin^2\left(\frac{\Delta\lambda}{2}\right) $$ $$ c = 2 \cdot \arctan2(\sqrt{a}, \sqrt{1-a}) $$ $$ \text{Distance} = R \cdot c $$ 其中: - $\phi_1, \phi_2$为两点的纬度(弧度) - $\Delta\phi = \phi_2 - \phi_1$,$\Delta\lambda = \lambda_2 - \lambda_1$为经度差(弧度) - $R$为地球半径(平均6371公里,也可用6378.137公里提高精度[^4]) #### 计算步骤 1. **经纬度转弧度**:将十进制度数转换为弧度(Python示例:`math.radians(lat)`) 2. **计算差值**:$\Delta\phi = \phi_2 - \phi_1$,$\Delta\lambda = \lambda_2 - \lambda_1$ 3. **应用公式**:计算$a$和$c$,最终得到距离 #### Python代码示例 ```python import math def calculate_distance(lat1, lon1, lat2, lon2): R = 6371 # 地球平均半径,单位公里 phi1 = math.radians(lat1) phi2 = math.radians(lat2) delta_phi = math.radians(lat2 - lat1) delta_lambda = math.radians(lon2 - lon1) a = math.sin(delta_phi/2)**2 + math.cos(phi1) * math.cos(phi2) * math.sin(delta_lambda/2)**2 c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a)) distance = R * c return distance # 返回单位为公里 # 示例:计算北京(39.9042°N, 116.4074°E)与上海(31.2304°N, 121.4737°E)的距离 distance = calculate_distance(39.9042, 116.4074, 31.2304, 121.4737) print(f"距离约为:{distance:.2f}公里") # 输出:距离约为:1067.88公里 ``` #### 其他方法对比 - **球面余弦定律**(如引用[1]): 公式为$C = \sin(\phi_1)\sin(\phi_2) + \cos(\phi_1)\cos(\phi_2)\cos(\Delta\lambda)$,但浮点运算误差可能导致精度问题,尤其在近距离计算时[^1] - **Haversine优势**:通过半角计算减少误差,适用于任意距离场景[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值