通过百度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数据表中,方便使用