栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

利用python,根据地址获取地址边界坐标(百度坐标)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

利用python,根据地址获取地址边界坐标(百度坐标)

第一步:#根据地址获取location (地理编码)

相关百度api地址:逆地理编码 gc | 百度地图API SDK

 

第二步:#根据location查找uid (地点检索,圆形区域检索)

相关百度api地址:地点检索 | 百度地图API SDK

 

第三步:#根据uid查找范围地址边界location

边界服务API需要申请,所以这里我直接给出网上搜到地址。 

http://map.baidu.com/?reqflag=pcmap&from=webmap&qt=ext&uid=680fb703ea53819c8ab988a9&ext_ver=new&l=18

根据uid查找范围地址边界坐标是百度米坐标,需要把它转换成百度坐标。详细操作见文章后面代码。

第四步:#写入csv文件中

将结果写入CSV文件

 完整代码如下:代码里面的ak秘钥是我自己的(随时都可能关闭),如果你需要运行代码,请你自己去申请一个。,

import requests     # 导入网页请求模块
import pandas as pd

# 百度米转百度经纬度
def meter2Degree(x, y):
    url = "http://api.map.baidu.com/geoconv/v1/?coords="+ x + "," + y + "&from=6&to=5&output=json&ak=2ro14GtmiRpkr043MkihyPHtumir0WoY"
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}  # 构造请求头
    response = requests.get(url, headers = header)  # 发出请求
    answer = response.json()  # json化
    result = answer["result"]
    lng = result[0]["x"]
    lat = result[0]["y"]
    return lng, lat

# 提取百度米坐标字符串,转为经纬度坐标串
def coordinateToPoints(coordinates):
    points = ""
    if coordinates and coordinates.index("-") >= 0:
        coordinates = coordinates.split("-")
        temp_coordinates = coordinates[1]
        if temp_coordinates and temp_coordinates.index(",") >= 0:
            temp_coordinates = temp_coordinates.replace(";", "").split(",")
            temp_points = []
            for i in range(0, len(temp_coordinates), 2): 
                x = temp_coordinates[i]
                y = temp_coordinates[i + 1]
                point = {}
                point["x"] = x
                point["y"] = y
                temp_points.append(point)
            lng_list=[]
            lat_list=[]
            for point in temp_points:
                x = point["x"]
                y = point["y"]
                lng, lat = meter2Degree(x, y)
                points += str(lng) + "," + str(lat) + ";n"
                lng_list.append(lng)
                lat_list.append(lat)
    return points,lng_list,lat_list


# 获取边界
def getBorder(uid):
    #url = "http://map.baidu.com/?pcevaname=pc4.1&qt=ext&ext_ver=new&l=12&uid=" + str(uid)
    url='http://map.baidu.com/?pcevaname=pc4.1&qt=ext&ext_ver=new&l=12&uid='+ str(uid)
    #http://map.baidu.com/?reqflag=pcmap&from=webmap&qt=ext&uid=680fb703ea53819c8ab988a9&ext_ver=new&l=18
    #http://map.baidu.com/?reqflag=pcmap&from=webmap&qt=ext&uid=82c5a8f4194f859fede4a513&ext_ver=new&l=18
    #http://map.baidu.com/?pcevaname=pc4.1&qt=ext&ext_ver=new&l=12&uid=82c5a8f4194f859fede4a513
     #http://map.baidu.com/?pcevaname=pc4.1&qt=ext&ext_ver=new&l=12&uid=82c5a8f4194f859fede4a513
    #print(url)
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}  # 构造请求头
    response = requests.post(url, headers = header)  # 发出请求
    answer = response.json()  # json化
    content = answer["content"]
    points = ""
    lng_list=[]
    lat_list=[]
    
    if "geo" in content and content["geo"] != None and content["geo"] != "":
        geo = content["geo"]
        points,lng_list,lat_list = coordinateToPoints(geo)
    
    return points,lng_list,lat_list



def getlocation(address):
    url='https://api.map.baidu.com/geocoding/v3/?address='+str(address)+'&city=深圳市&output=json&ak=2ro14GtmiRpkr043MkihyPHtumir0WoY'
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}  # 构造请求头
    response = requests.post(url, headers = header)
    #response = requests.get(url=url)
    json_content = response.json()
    if json_content['status']==0:
        lng=json_content['result']['location']['lng'] #经度
        lat=json_content['result']['location']['lat'] #纬度
        #print(str(lng)+' '+str(lat))
        return lng,lat

def getUid(address,lng,lat):
    url='https://api.map.baidu.com/place/v2/search?query='+str(address)+'&location='+str(lat)+','+str(lng)+'&output=json&radius=10&ak=2ro14GtmiRpkr043MkihyPHtumir0WoY'
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}  # 构造请求头
    response = requests.post(url, headers = header)
    json_content = response.json()
    if json_content['status']==0:
        uid=json_content['results'][0]['uid']
        return uid

if __name__ == "__main__":
    #需要查询的地址
    address='南湖街道向西村'
    
    #根据地址获取location (地理编码)
    lng,lat=getlocation(address)
    #根据location查找uid (地点检索,圆形区域检索)
    uid=getUid(address,lng,lat)

    #根据uid查找范围地址边界location
    geo,lng_list,lat_list=getBorder(uid)
    
    #写入csv文件中
    df = pd.DataFrame(columns=['经度','纬度'])
    index = 0
    for  i in range(len(lng_list)):
        df.loc[index] = [lng_list[i],lat_list[i]]
        #print(lng_list[i])
        index = index + 1
    df.to_csv(str(address)+'-边界经纬度.csv',mode='a', index=0)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/998333.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号