(禁止转载)
今天偶然有朋友提出了这个需求,给出一个A地点与一系列B地点,需要计算AB之间的直线距离。
看了下高德百度地图之类貌似都是道路距离,不太好找得到直线距离的查询方式。所以就干脆自己写一个吧。
大概流程是先读出来存在文件中的B地址,并连同A地地址一起通过使用高德地图api转化为经纬度,然后通过经纬度来计算两地的直线距离,并将结果写在一个文件中。
言语表达能力不善,直接看流程图吧
先看看运行表现
A地地址为杭州西湖,B地地址保存在1.txt中。
运行结果按照输入保存在2.txt文件中,单位为km.
贴上代码供参考(删掉了个人的高德地图API key,要运行需自己先去申请一个):
# -*- coding: utf-8 -*-
import json
import urllib.request
from math import*
#根据经纬度换算出两地直线距离
def Distance(Lng_A,Lat_A,Lng_B,Lat_B):
ra=6378.140 #赤道半径
rb=6356.755 #极半径 (km)
flatten=(ra-rb)/ra #地球偏率
rad_lat_A=radians(Lat_A)
rad_lng_A=radians(Lng_A)
rad_lat_B=radians(Lat_B)
rad_lng_B=radians(Lng_B)
pA=atan(rb/ra*tan(rad_lat_A))
pB=atan(rb/ra*tan(rad_lat_B))
xx=acos(sin(pA)*sin(pB)+cos(pA)*cos(pB)*cos(rad_lng_A-rad_lng_B))
c1=(sin(xx)-xx)*(sin(pA)+sin(pB))**2/cos(xx/2)**2
c2=(sin(xx)+xx)*(sin(pA)-sin(pB))**2/sin(xx/2)**2
dr=flatten/8*(c1-c2)
distance=ra*(xx+dr)
return distance
#根据地名得出该地的经纬度
def getLngLat(place):
place = urllib.parse.quote(place)
url = "http://restapi.amap.com/v3/geocode/geo?address=%s&output=JSON&key=**************"%(place)
req = urllib.request.urlopen(url)
data = req.read().decode('utf-8')
jsonData = json.loads(data)
Lng=float(jsonData['geocodes'][0]['location'].split(',',1)[0])
Lat=float(jsonData['geocodes'][0]['location'].split(',',1)[1])
return Lng,Lat
print("本程序通过经纬度转换计算的方式来计算一个A地点与一系列B地点之间的直线距离")
print("请输入你想查询的基准A地点:(请尽量详尽以免有误)")
a = input()
print("请输入你存放B地址的文件名:(请与程序放置在同一目录下)")
dir_B = input()
print("请输入你想保存结果的文件名称")
dir_Ans = input()
print("运算中,请稍等。。。")
A_Lng,A_Lat=getLngLat(a)
file = open(dir_B)
fo = open(dir_Ans,"w")
while 1:
line = file.readline()
if not line:
break
B_Lng,B_Lat = getLngLat(line)
ans = Distance(B_Lng,B_Lat,A_Lng,A_Lat)
ans = round(ans,4)
fo.write(str(ans)+'\n')
fo.close()
print("运算结束,结果已经保存在%s中"%(dir_Ans))
网友评论