第二周学习随笔

通过百度api分析具体位置信息,得到经纬度,在经过百度api反向定位得到具体行政区域和行政代码

    (1)注册百度api开发者认证

    (2)代码

              

import urllib.request, urllib.parse, urllib.error
import json
import hashlib
import pymysql


MyAK = 'oOmFBqWYx6KvNzb8G7XnYjIAtk48eYb1'
MySK = 's8sztf0aQgKlq9sdI1YdEWmLnLotZmQi'
lat = 0
lng = 0
list = {}  # 声明一个字典
lis=[]
def JingWei(address):
    global lat, lng
    # 产生sn码
    queryStr = "/geocoding/v3/?address=" + address + '&output=json&ak=' + MyAK
    encodedStr = urllib.parse.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")
    rawStr = encodedStr + MySK
    sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())

    # 生成url
    url = urllib.parse.quote("http://api.map.baidu.com" + queryStr + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]")
    #print('Retrieving', url)

    # 从API读取数据
    uh = urllib.request.urlopen(url)
    data = uh.read().decode()
    #print('Retrieved', len(data), 'characters')

    # 解析数据
    try:
        js = json.loads(data)
    except:
        js = None

    if not js or 'status' not in js or js['status'] != 0:
        lat=39.102799316295325
        lng=117.33027724053414
    else:
    # 获取经纬度坐标和地址类型
        lat = js["result"]["location"]["lat"]
        lng = js["result"]["location"]["lng"]
        #print('纬度', lat, '经度', lng)
        level = js["result"]["level"]
        #print('地址类型', level)


# 基于百度地图API下的经纬度信息来解析地理位置信息
def getlocation(lat, lng):
    #print(lat,"ss",lng)
    url = '/reverse_geocoding/v3/?ak='+MyAK+'&output=json&coordtype=wgs84ll&location='+str(lat)+','+str(lng)
    encodedStr = urllib.parse.quote(url, safe="/:=&?#+!$,;'@()*[]")
    rawStr = encodedStr + MySK
    sn = (hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest())
    # 生成url
    url = urllib.parse.quote("http://api.map.baidu.com" + url + "&sn=" + sn, safe="/:=&?#+!$,;'@()*[]")
    #print('Retrieving', url)
    req = urllib.request.urlopen(url)  # json格式的返回数据
    res = req.read().decode("utf-8")  # 将其他编码的字符串解码成unicode
    #print(json.loads(res))
    return json.loads(res)


def jsonFormat(lat, lng):
    str = getlocation(lat, lng)
    global list
    lis = []
    list={}
    # get()获取json里面的数据
    jsonResult = str.get('result')
    address = jsonResult.get('addressComponent')
    # 省
    province = address.get('province')
    # 城市
    city = address.get('city')
    # 城市等级
    city_level = address.get('city_level')
    # 县级
    district = address.get('district')
    # 区划代码
    adcode=address.get('adcode')
    list['province'] = province+city+district
    list['adcode'] = adcode
    return list


def select_wcdw():
    #打开数据库连接
    db=pymysql.connect("localhost","root","704794513","dbtest")
    #是同cursor()方法获取操作游标
    cursor=db.cursor()
    #sql查询语句
    sql="SELECT  SUBSTRING(wanchengdanwei,1,15) FROM keji"
    cursor.execute(sql)
    datalist=[]
    alldata=cursor.fetchall()
    for s in alldata:
        datalist.append(s[0])
    return datalist

def insert():
    list

    table ='keji2'
    db = pymysql.connect(host='localhost', user='root', password='704794513', port=3306, db='dbtest')
    cursor = db.cursor()
    keys = ','.join(list.keys())
    values = ','.join(['%s'] * len(list))
    sql = 'insert into {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE '.format(table=table, keys=keys,
                                                                                          values=values)
    update = ','.join(['{key}=%s'.format(key=key) for key in list])
    sql += update
    try:
        if cursor.execute(sql, tuple(list.values()) * 2):
            print("successful!")
            db.commit()
    except Exception as e:
        print('failed!', e)
        db.rollback()
    db.close()


if __name__ == "__main__":
    datalist=select_wcdw()
    num=range(len(datalist))
    for i in num:
        JingWei(datalist[i])
        jsonFormat(lat,lng)

        print(list.get('province'),list.get('adcode'))
        insert()

      此处我将得到的行政区域信息和行政代码通过函数直接加入了mysql数据表中,方便使用

    

猜你喜欢

转载自www.cnblogs.com/jhl1234/p/12466954.html