从百度地图API接口批量获取地点的经纬度

今天我同事要做一个规划,需要获取Excel中的2000多个地址的经纬度。问我有没有办法,正好我这段时间学习 Python,想了一下,觉得可以。于是就写了一个以下的代码。刚开始觉得差不多两个小时可以搞定,结果花费了半天多,汗。。。主要是在卡从百度地图 API获取的是坐标总是不对。后来网上查资料才明白,原来从百度API获取的是墨卡托坐标,而实际使用的是WGS84坐标。

 1 #!/usr/bin/python
 2 #coding:utf-8
 3  
 4 import xlrd
 5 import xlwt
 6 import requests
 7 import urllib
 8 import math
 9 import re
10  
11 pattern_x=re.compile(r"x":(".+?"))
12 pattern_y=re.compile(r"y":(".+?"))
13  
14 def mercator2wgs84(mercator):
15     #key1=mercator.keys()[0]
16     #key2=mercator.keys()[1]
17     point_x=mercator[0]
18     point_y=mercator[1]
19     x=point_x/20037508.3427892*180
20     y=point_y/20037508.3427892*180
21     y=180/math.pi*(2*math.atan(math.exp(y*math.pi/180))-math.pi/2)
22     return (x,y)
23  
24 def get_mercator(addr):
25     quote_addr=urllib.quote(addr.encode(utf8))
26     city=urllib.quote(u齐齐哈尔市龙.encode(utf8))
27     province=urllib.quote(u黑龙江省.encode(utf8))
28     if quote_addr.startswith(city) or quote_addr.startswith(province):
29         pass
30     else:
31         quote_addr=city+quote_addr
32     s=urllib.quote(u北京市.encode(utf8))
33     api_addr="http://api.map.baidu.com/?qt=gc&wd=%s&cn=%s&ie=utf-8&oue=1&fromproduct=jsapi&res=api&callback=BMap._rd._cbk62300"%(quote_addr
34 ,s)
35     req=requests.get(api_addr)
36     content=req.content
37     x=re.findall(pattern_x,content)
38     y=re.findall(pattern_y,content)
39     if x:
40         x=x[0]
41         y=y[0] 
42         x=x[1:-1]
43         y=y[1:-1]
44         x=float(x)
45         y=float(y)
46         location=(x,y)
47     else:
48         location=()
49     return location
50  
51 def run():
52     data=xlrd.open_workbook(Book2.xls)
53     rtable=data.sheets()[0]
54     nrows=rtable.nrows
55     values=rtable.col_values(0)
56      
57     workbook=xlwt.Workbook()
58     wtable=workbook.add_sheet(data,cell_overwrite_ok=True)
59     row=0
60     for value in values:
61         mercator=get_mercator(value)
62         if mercator:
63             wgs=mercator2wgs84(mercator)
64         else:
65             wgs=(NotFound,NotFound)
66         print "%s,%s,%s"%(value,wgs[0],wgs[1])
67         wtable.write(row,0,value)
68         wtable.write(row,1,wgs[0])
69         wtable.write(row,2,wgs[1])
70         row=row+1
71  
72     workbook.save(data.xls)
73  
74 if __name__==__main__:
75     run()

 

从百度地图API接口批量获取地点的经纬度

上一篇:C#中的委托和Lambda表达式


下一篇:Delphi 中的 procedure of object