百度提供的查询经纬度的 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