利用百度地图,根据经纬度找到对应的具体街道

利用百度地图,根据经纬度找到对应的具体街道

最近在做一个数据处理的工作,偶然碰到了要根据经纬度匹配对应的地点。因为百度地图和真实的地理信息比较有一点的差距,于是可以先对数据进行一些处理。

下面上代码

import json
import urllib.request
import math

def z_turn(x,y):
    
    #gcj02坐标转百度坐标
    z = math.sqrt(x * x + y * y) + 0.00002 * math.sin(y * math.pi)
    theta = math.atan2(y, x) + 0.000003 * math.cos(x * math.pi)
    bd09_Lng = z * math.cos(theta) + 0.0065
    bd09_Lat = z * math.sin(theta) + 0.006
    lat = str(bd09_Lng)
    lng = str(bd09_Lat)
    return lat,lng

def Format(lat,lng):
    
    #导入百度地图API,AK
    url = "http://api.map.baidu.com/geocoder/v2/?location=" + lat + "," + lng + "&output=json&pois=1&ak=YWdGplhYjUGQ3GtpKNeuTM2S"
    req = urllib.request.urlopen(url)  # json格式的返回数据
    res = req.read().decode("utf-8")  # 将其他编码的字符串解码成unicode
    m = json.loads(res)
    jsonResult = m.get('result')
    address = jsonResult.get('addressComponent')
    #省
    province = address.get('province')
    #城市
    city = address.get('city')
    #县区
    district = address.get('district')
    #街道
    street = address.get('street')
    #街道编号
    street_n = address.get('streetNumber')
    print("省(直辖市):{0},市:{1},县(区):{2},街道:{3},街道编码:{4}".format(province,city,district,street,street_n))
    
if __name__ == '__main__':
    
    x = float(input())
    y = float(input())
    '''
    测试数据
    x = 39.90733345
    y = 116.391244079988
    '''
    lat,lng = z_turn(x,y)
    Format(lat,lng)

查询结果

省(直辖市):北京市,市:北京市,县(区):西城区,街道:西长安街,街道编码:None

要提醒大家经纬度的精确程度,决定了返回的是否更具体

顺便补充一下根据经纬度求两点间距离

使用数学方法

lng1, lat1, lng2, lat2 = map(radians, [lng1, lat1, lng2, lat2])
dlon=lng2-lng1
dlat=lat2-lat1
a=sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 
dis=2*asin(sqrt(a))*6371*1000
print(dis)

使用经纬度

from geopy.distance import great_circle
newport_ri = (41.49008, -71.312796)
cleveland_oh = (41.499498, -81.695391)
print(great_circle(newport_ri, cleveland_oh).miles)

使用球面距离

from geopy.distance import vincenty
newport_ri = (41.49008, -71.312796)
cleveland_oh = (41.499498, -81.695391)
print(vincenty(newport_ri, cleveland_oh).miles)

你可能感兴趣的:(日常学习)