根据经纬度计算米数

  1. public class MapUtils {  
  2.     //private static double EARTH_RADIUS = 6378.137;  
  3.     private static double EARTH_RADIUS = 6371.393;  
  4.     private static double rad(double d)  
  5.     {  
  6.        return d * Math.PI / 180.0;  
  7.     }  
  8.   
  9.     /** 
  10.      * 计算两个经纬度之间的距离 
  11.      * @param lat1 
  12.      * @param lng1 
  13.      * @param lat2 
  14.      * @param lng2 
  15.      * @return 
  16.      */  
  17.     public static double GetDistance(double lat1, double lng1, double lat2, double lng2)  
  18.     {  
  19.        double radLat1 = rad(lat1);  
  20.        double radLat2 = rad(lat2);  
  21.        double a = radLat1 - radLat2;      
  22.        double b = rad(lng1) - rad(lng2);  
  23.        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +   
  24.         Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));  
  25.        s = s * EARTH_RADIUS;  
  26.        s = Math.round(s * 1000);  
  27.        return s;  
  28.     }  
  29.       
  30.       
  31.       
  32.     public static void main(String[] args) {  
  33.         System.out.println(MapUtils.GetDistance(29.490295,106.486654,29.615467,106.581515));  
  34.     }  
  35. }  


2、顺带提一下百度地图提供的计算两地经纬度的方法,很简单的一句话调用,可以自行去看百度地图API试试,计算结果单位:米

[html]  view plain  copy
  1. var map = new BMap.Map("allmap");  
  2. var pointA = new BMap.Point(106.486654,29.490295);  // 点坐标A  
  3. var pointB = new BMap.Point(106.581515,29.615467);  // 点坐标B  
  4. alert(map.getDistance(pointA,pointB)).toFixed(2));  //toFixed(2)意思为保留小数点后两位  

文章出处:https://blog.youkuaiyun.com/vison155142/article/details/52468180

<think>嗯,用户想用Python根据经纬度计算距离。我得先想想怎么回答这个问题。首先,我需要确定用户的需求是什么。可能他们正在开发需要地理位置服务的应用,比如计算两个地点之间的距离,或者是在做数据分析时需要处理经纬度数据。接下来,我得回忆一下常用的计算方法。 记得最常用的方法有Haversine公式,这个公式适合计算地球表面两点间的大圆距离。还有可能需要提到Vincenty公式,不过那个计算更复杂,但精度更高。不过对于大多数应用来说,Haversine应该足够了。然后,可能需要给出具体的实现步骤,包括公式的数学表达和Python代码示例。 首先,得解释一下Haversine公式的原理。需要将经纬度转换为弧度,然后应用公式中的各个步骤,包括计算经度差、纬度差,应用公式中的a和c部分,最后乘以地球半径。这部分需要详细但清晰,确保用户能理解每个步骤。 然后,代码部分。需要导入math模块,定义函数,处理角度转换,计算差值,应用公式,最后返回结果。要注意单位转换,比如将角度转为弧度,地球半径的单位是千还是根据用户需求可能需要调整。 另外,可能需要提到现有的库,比如geopy,它已经实现了这些计算,用户可以直接调用,避免重复造轮子。不过用户可能希望自己实现,所以两者都要提到,但重点放在自己实现的方法上。 还需要考虑用户可能的疑问,比如地球半径的取值,不同方法的精度差异,或者如何处理多个点之间的距离计算。不过用户当前的问题可能只需要基础的单点计算,所以先给出基本方案,再扩展其他方法。 可能还要检查一下公式的正确性,确保代码没有错误。比如,Haversine公式中的正弦平方部分,以及反正弦函数的使用是否正确。同时,测试一下代码,比如用已知经纬度的两个点,看看计算结果是否合理。 最后,总结一下步骤,强调Haversine公式的适用场景,以及使用现有库的好处,让用户可以根据需求选择最适合的方法。确保回答结构清晰,逐步引导用户完成计算过程,同时保证信息的准确性和可靠性。</think>根据经纬度计算距离是地理信息处理中的常见需求,Python中常用Haversine公式实现。以下是分步说明: 1. **数学原理** 采用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}) $$ 其中: - $\phi$ 为纬度(弧度) - $\lambda$ 为经度(弧度) - 地球平均半径 $R = 6371$ km 2. **Python实现步骤** ```python import math def haversine(lon1, lat1, lon2, lat2): # 将角度转换为弧度 lon1, lat1, lon2, lat2 = map(math.radians, [lon1, lat1, lon2, lat2]) # 经纬度差值 dlon = lon2 - lon1 dlat = lat2 - lat1 # Haversine公式 a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2 c = 2 * math.asin(math.sqrt(a)) # 地球半径(千) r = 6371 return c * r # 示例:计算北京(116.40, 39.90)到上海(121.47, 31.23)的距离 distance = haversine(116.40, 39.90, 121.47, 31.23) print(f"距离:{distance:.2f} 公里") # 输出:距离:1068.65 公里 ``` 3. **进阶方法** - **Vincenty公式**:精度更高(误差约0.5mm),但计算复杂度更高 - **geopy库**:内置多种计算方法 ```python from geopy.distance import geodesic beijing = (39.90, 116.40) shanghai = (31.23, 121.47) print(geodesic(beijing, shanghai).km) # 输出:1068.39 ``` 4. **注意事项** - 经纬度坐标应使用WGS84坐标系 - 海平面距离与实际路径距离存在差异 - 密集计算建议使用优化算法或C扩展 选择建议:日常使用推荐geopy库,需要底层实现时用Haversine公式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值