美文网首页程序员
python小程序——计算两地直线距离

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

作者: Island123 | 来源:发表于2017-03-02 21:35 被阅读0次

    (禁止转载)

    今天偶然有朋友提出了这个需求,给出一个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))

    相关文章

      网友评论

        本文标题:python小程序——计算两地直线距离

        本文链接:https://www.haomeiwen.com/subject/nvikgttx.html