Python 根据百度 API 获得经纬度,根据经纬度计算城市间距离

百度提供的查询经纬度的 api 为:

http://api.map.baidu.com/geocoder?address=您要查询的地址&output=xml&key=您要输入的key

一个现成的 key 为:f247cdb592eb43ebac6ccd27f796e2d2

返回 json

我们以西安市的经纬度信息为例:

地址栏输入:

http://api.map.baidu.com/geocoder?address=西安&output=json&key=f247cdb592eb43ebac6ccd27f796e2d2

返回如下 json 信息:

{
    "status":"OK",
    "result":{ "location":{ "lng":108.953098, "lat":34.2778 }, "precise":0, "confidence":12, "level":"\u57ce\u5e02" } }

返回 xml

地址栏输入:

http://api.map.baidu.com/geocoder?address=西安&output=xml&key=f247cdb592eb43ebac6ccd27f796e2d2

返回如下 xml 信息:

<GeocoderSearchResponse>
    <status>OK</status>
    <result>
        <location>
            <lat>34.2778</lat>
            <lng>108.953098</lng>
        </location>
        <precise>0</precise>
        <confidence>12</confidence>
        <level>城市</level>
    </result>
</GeocoderSearchResponse>

解析返回的 xml ,获得城市的经纬度

loc_cache = {}
key = 'f247cdb592eb43ebac6ccd27f796e2d2'
def getlocation(addr):
    from urllib import urlopen
    from xml.dom.minidom import parseString
    doc = urlopen('http://api.map.baidu.com/geocoder?address=%s&output=xml&key=%s'%(addr, key))
    dom = parseString(doc.read())
    lat = doc.getElementsByTagName('lat')[0].firstChild.data
    lng = doc.getElementsByTagName('lng')[0].firstChild.data
    return map(float, (lat, lng))

根据经纬度计算城市间距离

def distance(a1, a2):
    loc1, loc2 = getlocation(a1), getlocation(a2)
    latdiff = loc1[0]-loc2[0]
    lngdiff = loc1[1]-loc2[1]
    miles = ((69.1*latdiff)**2 + (53.0*lngdiff)**2)**.5
    return miles*1.6092953

if __name__ == '__main__':
    print getlocation('项城市')
    print getlocation('西安市')
    print distance('项城市', '西安市')

# [33.27447, 114.89338]
# [34.2778, 108.953098]
# 518.801728496

你可能感兴趣的:(Python 根据百度 API 获得经纬度,根据经纬度计算城市间距离)