zoukankan      html  css  js  c++  java
  • 从百度地图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()
  • 相关阅读:
    swift对比object-c
    Swift : missing argument label 'xxx' in call
    Swift: missing argument label 'xxx' in call
    Swift 闭包(六)
    求教贴,一个可能很白痴的问题,有时间又很闲的大神给解决下
    Swift “ambiguous use of operator '>'”
    swift 之嵌套的理解 func chooseStepFunction(backwards: Bool) -> (Int) -> Int
    苹果新的编程语言 Swift 语言进阶(七)--枚举、结构、类
    苹果新的编程语言 Swift 语言进阶(六)--函数和闭包
    触摸板PCB制作-TM12
  • 原文地址:https://www.cnblogs.com/tmyyss/p/4209641.html
Copyright © 2011-2022 走看看