利用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)

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 可以使用Python中的第三方库,如geopandas和shapely,来获取全球海岸线点的坐标。具体步骤如下: 1. 下载全球海岸线的shapefile文件,可以从Natural Earth网站上下载。 2. 使用geopandas读取shapefile文件,并将其转换为shapely的Polygon对象。 3. 使用shapely的boundary方法获取Polygon对象的边界,即海岸线。 4. 使用shapely的simplify方法对海岸线进行简化,以减少点的数量。 5. 使用shapely的coords方法获取海岸线的所有点的坐标。 6. 将坐标保存到文件中,或者在地图上绘制海岸线。 注意:获取全球海岸线点的坐标需要大量的计算资源和时间,建议使用高性能计算机或云计算服务。 ### 回答2: 要利用Python获取全球海岸线点的坐标,可以使用地理信息系统(GIS)的数据源和相关的Python库。以下是一个概述的步骤: 1. 获取GIS数据源:全球海岸线点的坐标数据通常可以从公共数据集中获得。常用的数据源包括OpenStreetMap、Natural Earth和USGS等。这些源可以提供包含海岸线的矢量数据。 2. 安装Python库:准备安装和使用一些常用的Python库,如Geopandas、Folium和Shapely等。 3. 导入数据:将GDB数据导入到Python的工作环境中,可以使用Geopandas库的read_file()函数,该函数用于读取各种GIS文件格式,如Shapefile、GeoJSON等。 4. 过滤和选择海岸线数据:根据需要,可以使用Geopandas库提供的空间查询功能,如.intersects()函数来选择感兴趣的区域或海岸线类型。 5. 提取坐标数据:使用Geopandas库的to_crs()函数将数据转换为所需的坐标系。然后使用.geometry属性提取每个几何图形的坐标列表。 6. 数据可视化:使用Folium库可以将提取的坐标数据绘制在地图上。可以设置不同的标记或线条来显示所有海岸线点的位置和路径。 通过上述步骤,在Python环境中可以方便地获取全球海岸线点的坐标数据,并且对数据进行分析和可视化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值