首页 > 编程知识 正文

爬取高德地图,python爬取高德瓦片

时间:2023-05-06 16:09:24 阅读:148318 作者:766

基于高德坐标拾取系统: 高德地图API

1.地址转高德坐标代码:request_coord.py import jsonimport requestsimport coord_trans"""根据地址查询地点"""def request_get(url, param, header): fails = 0 while True: try: if fails >= 20: break ret = requests.get(url=url, params=param, headers=header, timeout=10) if ret.status_code == 200: text = json.loads(ret.text) else: continue except: fails += 1 print('网络连接出现问题, 正在尝试再次请求: ', fails) else: break return textdef request_coords(address): post_url = "https://restapi.amap.com/v3/place/text" request_param = {"s": "rsv3", "children": "", "key": "8325164e247e15eea68b59e89200988b", "page": 1, "offset": 10, "city": 110000, "language": "zh_cn", "platform": "JS", "logversion": 2.0, "sdkversion": 1.3, "appname": "https://lbs.amap.com/console/show/picker", "csid": "7598AB3B-4BE6-4719-951B-9EDBE6331000", "keywords": address} header = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate, sdch, br", "Accept-Language": "zh-CN,zh;q=0.8", "Connection": "keep-alive", "Cookie": "key=8325164e247e15eea68b59e89200988b; guid=f631-e4a9-c4a0-275d; UM_distinctid=16e68043e7113e-0b9c86ad90cb11-4d045769-1fa400-16e68043e728d", "Host": "restapi.amap.com", "Referer": "https://lbs.amap.com/console/show/picker", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"} a = request_get(post_url, request_param, header) pois = a["pois"] print(pois[0]["location"]) accurate_coord = str(pois[0]["location"]).split(",") # 将高德坐标转为WGS84坐标 wgs84_coord = coord_trans.gcj02_to_wgs84(float(accurate_coord[0]), float(accurate_coord[1])) return wgs84_coordrequest_coords("北京市朝阳区奥林匹克森林公园") 2.坐标系统转换代码:coord_trans.py """坐标转换"""import mathx_pi = 3.14159265358979324 * 3000.0 / 180.0pi = 3.1415926535897932384626 # πa = 6378245.0 # 长半轴ee = 0.00669342162296594323 # 偏心率平方coordinate = []lng = []lat = []converted_lng = []converted_lat = []# 火星坐标系(GCJ-02)转百度坐标系(BD-09)# 谷歌、高德——>百度def gcj02_to_bd09(lng, lat): z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_pi) theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_pi) bd_lng = z * math.cos(theta) + 0.0065 bd_lat = z * math.sin(theta) + 0.006 return [bd_lng, bd_lat]# 百度坐标系(BD-09)转火星坐标系(GCJ-02)# 百度——>谷歌、高德def bd09_to_gcj02(bd_lon, bd_lat): x = bd_lon - 0.0065 y = bd_lat - 0.006 z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi) theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi) gg_lng = z * math.cos(theta) gg_lat = z * math.sin(theta) return [gg_lng, gg_lat]# WGS84转GCJ02(火星坐标系)def wgs84_to_gcj02(lng, lat): # 判断是否在国内 if out_of_china(lng, lat): return [lng, lat] dlat = _transformlat(lng - 105.0, lat - 35.0) dlng = _transformlng(lng - 105.0, lat - 35.0) radlat = lat / 180.0 * pi magic = math.sin(radlat) magic = 1 - ee * magic * magic sqrtmagic = math.sqrt(magic) dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi) dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi) mglat = lat + dlat mglng = lng + dlng return [mglng, mglat]# GCJ02(火星坐标系)转GPS84def gcj02_to_wgs84(lng, lat): if out_of_china(lng, lat): return [lng, lat] dlat = _transformlat(lng - 105.0, lat - 35.0) dlng = _transformlng(lng - 105.0, lat - 35.0) radlat = lat / 180.0 * pi magic = math.sin(radlat) magic = 1 - ee * magic * magic sqrtmagic = math.sqrt(magic) dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi) dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi) mglat = lat + dlat mglng = lng + dlng return [lng * 2 - mglng, lat * 2 - mglat]# 百度坐标系转84坐标def bd09_to_wgs84(bd_lon, bd_lat): lon, lat = bd09_to_gcj02(bd_lon, bd_lat) return gcj02_to_wgs84(lon, lat)# 84坐标转百度坐标def wgs84_to_bd09(lon, lat): lon, lat = wgs84_to_gcj02(lon, lat) return gcj02_to_bd09(lon, lat)def _transformlat(lng, lat): ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng)) ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0 ret += (20.0 * math.sin(lat * pi) + 40.0 * math.sin(lat / 3.0 * pi)) * 2.0 / 3.0 ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 * math.sin(lat * pi / 30.0)) * 2.0 / 3.0 return retdef _transformlng(lng, lat): ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng)) ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0 ret += (20.0 * math.sin(lng * pi) + 40.0 * math.sin(lng / 3.0 * pi)) * 2.0 / 3.0 ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 * math.sin(lng / 30.0 * pi)) * 2.0 / 3.0 return ret# 判断是否在国内,不在国内不做偏移def out_of_china(lng, lat): return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。