用google api获取区名 & 路名

'''
用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网的权限,如公司的网络。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值