Chuang Ye

Python计算两个经纬度之间的距离

2019-07-14 python 经纬度
Word count: 632 | Reading time: 2min


【需求:计算多个居住地与工作地到本次案例的距离】

读取经纬度地址的数据

Excel中的数据
这一步把excel中经纬度数据存储到列表中

1
2
3
4
5
6
7
8
9
10
11
def read_excel():
ExcelFile=xlrd.open_workbook(r'E:\\python_pratice\\July6_project\\dizhi_zhuan_jingweidu_juli_jisuan\\2.xlsx')
#print (ExcelFile.sheet_names())
sheet = ExcelFile.sheet_by_index(0)
address = sheet.col_values(0)
jingweidu=sheet.col_values(1)
for i in range(0,len(jingweidu)):
print(i)
s1=sheet.cell(i, 1).value
print(s1)
B.append(s1)

计算两个经纬度之间的距离

计算经纬度之间的距离有多种方法,比如Great-Circle距离(基于球面余弦公式)和基于Haversine公式 等。这些方法考虑的要点都很多,实际应用计算保留几位小数的情况下可以使用以下我使用的方法,要想十分精确,那就请
出门右转,Google一下

基于Haversine公式计算距离

经纬度计算距离公式

公式解析

1
2
3
4
5
Lung1 Lat1表示A点经纬度, Lung2 Lat2表示B点经纬度;
a=Lat1-Lat2 为两点纬度之差 b=Lung1-Lung2 为两点经度之差;
6378.137为地球半径,单位为千米;
计算出来的结果单位为千米,若将半径改为米为单位则计算的结果单位为米
计算精度与谷歌地图的距离精度差不多,相差范围在0.2米以下

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def distance_calc_two(startloc , endloc):
startloc = startloc + ',' + endloc

# 将十进制度数转化为弧度
lon1 , lat1 ,lon2 , lat2 = map(radians,[float(i) for i in startloc.split(',')])

# haversine公式
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))

# 地球平均半径
r = 6371
finally_result = str('%.3f'%(r * c))
distance.append(finally_result)
print(finally_result + u'公里')

startloc和endloc这两个参数为起点与终点的经纬度,之后将经纬度转为弧度,方便之后的计算,最后就是实现haversine公式。

注意:这里r的取值也可以精确到6378.137,视自己情况而定。

All Codes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from math import radians,sin,cos,asin,sqrt
import xlrd

distance=[]
B=[]
def distance_calc_two(startloc , endloc):
startloc = startloc + ',' + endloc
lon1 , lat1 ,lon2 , lat2 = map(radians,[float(i) for i in startloc.split(',')])
#print(lon1,lat1,lon2,lat2)
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
r = 6371
finally_result = str('%.3f'%(r * c))
distance.append(finally_result)

def read_excel():
ExcelFile=xlrd.open_workbook(r'E:\\python_pratice\\July6_project\\dizhi_zhuan_jingweidu_juli_jisuan\\2.xlsx')
sheet = ExcelFile.sheet_by_index(0)
address = sheet.col_values(0)
jingweidu=sheet.col_values(1)
for i in range(0,len(jingweidu)):
s1=sheet.cell(i, 1).value
B.append(s1)

if __name__ == '__main__':
startloc='114.504952,38.045749'
read_excel()
for i in B:
distance_calc_two(startloc,i)
print(distance)
with open('3.txt','w') as f:
for i in distance:
f.write(i+'\n')

最后结果如下:
result

< PreviousPost
OH MY JANICE
NextPost >
Python调用高德API批量获得经纬度