Python利用百度地图api批量获取地址经纬度

1.pip安装xlrd,xlwt,requests模块.

2.在工程目录处放置地点Excel文件。

python2.7.13代码:

#coding:utf-8
import xlrd
import xlwt
import requests
import urllib
import math
import re

pattern_x = re.compile(r'"x":(".+?")')
pattern_y = re.compile(r'"y":(".+?")')


def mercator2wgs84(mercator):
    # key1=mercator.keys()[0]
    # key2=mercator.keys()[1]
    point_x = mercator[0]
    point_y = mercator[1]
    x = point_x / 20037508.3427892 * 180
    y = point_y / 20037508.3427892 * 180
    y = 180 / math.pi * (2 * math.atan(math.exp(y * math.pi / 180)) - math.pi / 2)
    return (x, y)


def get_mercator(addr):
    quote_addr = urllib.quote(addr.encode('utf8'))
    city = urllib.quote(u'兰州市'.encode('utf8'))
    province = urllib.quote(u'甘肃省'.encode('utf8'))
    if quote_addr.startswith(city) or quote_addr.startswith(province):
        pass
    else:
        quote_addr = quote_addr
    s = urllib.quote(u'北京市'.encode('utf8'))
    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
    , s)
    req = requests.get(api_addr)
    content = req.content
    x = re.findall(pattern_x, content)
    y = re.findall(pattern_y, content)
    if x:
        x = x[0]
        y = y[0]
        x = x[1:-1]
        y = y[1:-1]
        x = float(x)
        y = float(y)
        location = (x, y)
    else:
        location = ()
    return location


def run():
    data = xlrd.open_workbook('Book2.xlsx')
    rtable = data.sheets()[0]
    nrows = rtable.nrows
    values = rtable.col_values(0)

    workbook = xlwt.Workbook()
    wtable = workbook.add_sheet('data', cell_overwrite_ok=True)
    row = 0
    for value in values:
        mercator = get_mercator(value)
        if mercator:
            wgs = mercator2wgs84(mercator)
        else:
            wgs = ('NotFound', 'NotFound')
        print "%s,%s,%s" % (value, wgs[0], wgs[1])
        wtable.write(row, 0, value)
        wtable.write(row, 1, wgs[0])
        wtable.write(row, 2, wgs[1])
        row = row + 1

    workbook.save('data.xls')


if __name__ == '__main__':
    run()

  运行即可得到data.xls结果文件。

PS:py2和Py3有些些不同。

python3.6.1代码

# coding:utf-8
import xlrd
import xlwt
import requests
import urllib
import math
import re

pattern_x = re.compile(r'"x":(".+?")')
pattern_y = re.compile(r'"y":(".+?")')


def mercator2wgs84(mercator):
    # key1=mercator.keys()[0]
    # key2=mercator.keys()[1]
    point_x = mercator[0]
    point_y = mercator[1]
    x = point_x / 20037508.3427892 * 180
    y = point_y / 20037508.3427892 * 180
    y = 180 / math.pi * (2 * math.atan(math.exp(y * math.pi / 180)) - math.pi / 2)
    return (x, y)


def get_mercator(addr):
    quote_addr = urllib.parse.quote(addr.encode('utf8'))
    city = urllib.parse.quote(u'兰州市'.encode('utf8'))
    province = urllib.parse.quote(u'甘肃省'.encode('utf8'))
    if quote_addr.startswith(city) or quote_addr.startswith(province):
        pass
    else:
        quote_addr = quote_addr
    s = urllib.parse.quote(u'北京市'.encode('utf8'))
    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
        , s)
    req = requests.get(api_addr)
    content = req.text
    x = re.findall(pattern_x, content)
    y = re.findall(pattern_y, content)
    if x:
        x = x[0]
        y = y[0]
        x = x[1:-1]
        y = y[1:-1]
        x = float(x)
        y = float(y)
        location = (x, y)
    else:
        location = ()
    return location


def run():
    data = xlrd.open_workbook('Book2.xls')
    rtable = data.sheets()[0]
    nrows = rtable.nrows
    values = rtable.col_values(0)

    workbook = xlwt.Workbook()
    wtable = workbook.add_sheet('data', cell_overwrite_ok=True)
    row = 0
    for value in values:
        mercator = get_mercator(value)
        if mercator:
            wgs = mercator2wgs84(mercator)
        else:
            wgs = ('NotFound', 'NotFound')
        print("%s,%s,%s" % (value, wgs[0], wgs[1]))
        wtable.write(row, 0, value)
        wtable.write(row, 1, wgs[0])
        wtable.write(row, 2, wgs[1])
        row = row + 1

    workbook.save('data.xls')


if __name__ == '__main__':
    run()

  

posted @ 2017-07-05 23:09  reboot777  阅读(8320)  评论(2编辑  收藏  举报