1 classMethod:2 def __init__(self):3 self.keys =KEY()4 self.k =self.keys.random_key()5 self.event_loop =asyncio.get_event_loop()6
7 #访问网址
8 async defget_response(self, base_url_, params_):9 """
10 :param base_url_: 网址11 :param params_: 访问网址的参数字典12 :return: 访问网址的响应内容13 """
14 async with ClientSession(connector=TCPConnector(verify_ssl=False)) as session:15 whileTrue:16 try:17 async with session.get(base_url_, params=params_) as r:18 response_ =await r.json()19 infocode = int(response_['infocode'])20 if infocode == 10000:21 returnresponse_22 else:23 print(infocode)24 print("切换key,重新查询中")25 self.k =self.keys.random_key()26 params_['key'] =self.k27 exceptclient_exceptions.ClientConnectorError:28 print('wait a moment')29 for i in range(60, 0, -1):30 print("倒计时{}秒".format(i), flush=True, end="\b" * 10)31 time.sleep(1)32 exceptException as e:33 print(e)34 for i in range(60, 0, -1):35 print("倒计时{}秒".format(i), flush=True, end="\b" * 10)36 time.sleep(1)37
38 #gps坐标转化高德坐标
39 defexchange(self, coordinate):40 """
41 :param coordinate: 坐标 经度,纬度|经度,纬度……42 :return: 高德坐标43 """
44 base_url = 'https://restapi.amap.com/v3/assistant/coordinate/convert'
45 task =[]46 for c incoordinate:47 _params_ = {'locations': c, 'coordsys': 'gps', 'output': 'json', 'key': self.k}48 task.append(self.get_response(base_url, _params_))49
50 response = self.event_loop.run_until_complete(asyncio.gather(*task))51 result =[]52 for r inresponse:53 result.append(r['locations'])54 returnresult55
56 #获取行政区信息
57 def get_region(self, coordinate_array, batch=False):58 """
59 :param coordinate_array: 坐标数组 【"经度,纬度",……】60 :param batch: 批量查询61 :return: 省,市,区(县),详细地址62 """
63
64 #坐标转换
65 coordinate =[]66 for c incoordinate_array:67 coordinate +=[c]68 coordinate =self.exchange(coordinate)69
70 task =[]71 for c incoordinate:72 base_url = 'https://restapi.amap.com/v3/geocode/regeo'
73 _params_ = {'location': c, 'extensions': 'all',74 'output': 'json', 'key': self.k, 'batch': str(batch).lower()}75 task.append(self.get_response(base_url, _params_))76 response_array = self.event_loop.run_until_complete(asyncio.gather(*task))77
78 for response inresponse_array:79 if notbatch:80 province = response['regeocode']['addressComponent']['province']81 city = response['regeocode']['addressComponent']['city']82 district = response['regeocode']['addressComponent']['district']83 address = response['regeocode']['formatted_address']84 pois = [[r['type'].split(';')[0], float(r['distance'])] for r in response['regeocode']['pois'][:3]]85
86 yieldprovince, city, district, address, pois87 else:88 regeocodes = response['regeocodes']89 result =[]90 for r inregeocodes:91 r['pois'] = sorted(r['pois'], key=lambda x: x['distance'])92 result.append(93 (94 r['addressComponent']['province'],95 r['addressComponent']['city'],96 r['addressComponent']['district'],97 r['formatted_address'],98 [[i['type'].split(';')[0], float(i['distance'])] for i in r['pois'][:3]]99 )100 )101 yieldresult102
103 #获取POI信息(多边形搜索--矩形搜索)
104 def get_poi(self, coordinate_array, lon_gap, lat_gap, poi_type, output_poiname=False):105 """
106 :param coordinate: 【【经度,纬度】,【经度,纬度】】 矩形的中心经纬度107 :param lon_gap: 矩形经度间隔108 :param lat_gap: 矩形纬度间隔109 :param poi_type: 查询POI类型110 :param output_poiname: 输出POI name111 :return: 相应poi数量112 """
113 #坐标转换
114 coordinate =[]115 for c incoordinate_array:116 coordinate += [c[0]-lon_gap/2, c[1]+lat_gap/2, c[0]+lon_gap/2, c[1]-lat_gap/2]117 coordinate =self.exchange(coordinate)118
119 base_url = 'https://restapi.amap.com/v3/place/polygon'
120
121 task =[]122 for i in range(0, len(coordinate), 4):123 params = {'polygon': '{},{}|{},{}'.format(coordinate[i], coordinate[i+1], coordinate[i+2], coordinate[i+3]),124 'types': poi_type, 'output': 'json', 'key': self.keys.random_key(), 'page': 1, 'offset': 20}125
126 task.append(self.get_response(base_url, params))127 response = self.event_loop.run_until_complete(asyncio.gather(*task))128
129 for r inresponse:130 n = int(r['count'])131 task =[]132 ifoutput_poiname:133 print('Crawling POI {} name'.format(poi_type))134 name = ['{}({})'.format(e['name'], e['typecode']) for e in r['pois']]135 while params['page'] < ceil(n/20):136 params['page'] += 1
137 task.append(self.get_response(base_url, params))138 result = self.event_loop.run_until_complete(asyncio.gather(*task))139 for res inresult:140 name += ['{}({})'.format(e['name'], e['typecode']) for e in res['pois']]141
142 yieldn, name143 else:144 yieldn145
146 defget_distance(self, coordinate_array):147 """
148 :param coordinate_array: [o_lon, o_lat, d_lon, d_lat]149 :return:150 """
151 #坐标转换
152 coordinate =[]153 for c incoordinate_array:154 coordinate +=c155 coordinate =self.exchange(coordinate)156
157 base_url = 'https://restapi.amap.com/v3/direction/driving'
158 task =[]159
160 for i in range(0, len(coordinate), 2):161 parameters ={162 'key': self.keys.random_key(), 'strategy': 2, 'nosteps': 1, 'extensions': 'base',163 'origin': coordinate[i],164 'destination': coordinate[i+1]165 }166 task.append(self.get_response(base_url, parameters))167 response = self.event_loop.run_until_complete(asyncio.gather(*task))168
169 for r inresponse:170 yield float(r['route']['paths'][0]['distance'])