python小程序——计算两地直线距离

(禁止转载)

今天偶然有朋友提出了这个需求,给出一个A地点与一系列B地点,需要计算AB之间的直线距离。

看了下高德百度地图之类貌似都是道路距离,不太好找得到直线距离的查询方式。所以就干脆自己写一个吧。

大概流程是先读出来存在文件中的B地址,并连同A地地址一起通过使用高德地图api转化为经纬度,然后通过经纬度来计算两地的直线距离,并将结果写在一个文件中。

言语表达能力不善,直接看流程图吧


python小程序——计算两地直线距离_第1张图片

先看看运行表现

A地地址为杭州西湖,B地地址保存在1.txt中。

运行结果按照输入保存在2.txt文件中,单位为km.

python小程序——计算两地直线距离_第2张图片

贴上代码供参考(删掉了个人的高德地图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))

你可能感兴趣的:(python小程序——计算两地直线距离)