'''
用google api获取区名 & 路名
'''
from loguru import logger
import functools
import requests
import math
def wgs84ToGcj02(local):
'''谷歌坐标系转高德坐标系'''
lat, lng = local
def _transformlat(lng, lat):
PI = 3.1415926535897932384626
ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * \
lat + 0.1 * lng * lat + 0.2 * math.sqrt(abs(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 ret
def _transformlng(lng, lat):
PI = 3.1415926535897932384626
ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \
0.1 * lng * lat + 0.1 * math.sqrt(abs(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
PI = 3.1415926535897932384626
ee = 0.00669342162296594323
a = 6378245.0
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 [mglat, mglng]
@functools.lru_cache
def translate(en_roadname=''):
url = "https://www.google.com.hk/async/translate?vet=12ahUKEwi0oYrNpLKGAxXEEUQIHZbtCoAQqDh6BAgHEDI..i&ei=P9JWZvSFI8SjkPIPlturgAg&opi=89978449&yv=3&cs=1&_fmt=pc"
payload = f"async=translate,sl:en,tl:zh-CN,st:{en_roadname},id:1716965969049,qc:true,ac:false,_id:tw-async-translate,_pms:s,_fmt:pc"
headers = {your chrome headers}
response = requests.request("POST", url, headers=headers, data=payload)
r = (response.text.split('span'))
text = (r[9])
cn_roadname = (text[text.find('>') + 1:text.find('<')])
logger.debug(f"{en_roadname}===>>>{cn_roadname}")
return cn_roadname
def get_district(loc):
loc = wgs84ToGcj02(loc)
url = "https://www.google.com/search"
payload = {"tbm":"map", "q":f"{loc[0]}, {loc[1]}", "tch":'1'}
response = requests.get(url, params=payload)
text = (response.text)
# print(text)
aa = text.split(',\\"')
addr = ((aa)[14].split('\",')[0]).split(',')[:3]
# print(addr)
a = (map(translate, addr))
print([i for i in a])
district = addr[0]
district_name = translate(district)
print(district_name)
def get_road(loc):
try:
loction = wgs84ToGcj02(loc)
loc = str(loction).strip("[]")
url = "https://www.google.com/search"
payload = {"tbm": "map", "q": f"{loc}", "tch": '1'}
google_headers = {your chrome headers}
response = requests.get(url, headers=google_headers, params=payload)
text = (response.text)
if "区" in text:
road_name = text[text.find("区") + 1:text.find("邮政编码")]
elif 'District' in text:
road_name = text[text.find("District") + 1:text.find("邮政编码")]
if len(road_name) < 10:
logger.debug(f"{loction} =》google =》{road_name}")
roadname = road_name.strip()
return roadname
except:
logger.debug(f"{loc} NO Road !")
return None
if __name__ == '__main__':
loc = [39.865342372144276, 116.35873212851321]
get_district(loc)
get_road([23.10064402384218, 113.37220326672845])
执行效果:
稍微改一下也可以获取全部地址信息。
注意: 需要有可以访问W网的权限,如公司的网络。