python gis 经纬度 库_Python获取各大地图平台经纬度数据,哪家的数据最准确?

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

以下文章来源于菜J学Python ,作者J哥

前言

不知道大家会在什么场合使用地图可视化,对我来说地图可视化的优点除了它可以展示海量的位置数据,更重要的是它可以很酷很炫,给人一种赏心悦目的舒适感。如下是J哥做的一个简单热力图:

热力地图

制作此类可视化地图的前提是获得海量的经纬度数据,数据从何而来?当然是腾讯地图、高德地图和百度地图这些大家耳熟能详的平台。所以今天给大家分享用Python批量获取经纬度的三种方法,并分别评测它们的效率。

一、腾讯地图

首先,咱们需要在腾讯位置服务平台注册并获得一个key,作为位置数据调用的密匙。步骤如下:

腾讯地图开放平台

1、构造函数

获得key以后,咱们就可以构造API数据请求函数tengxun(),将json格式数据中的经纬度解析出来即可,Python代码如下:

importrequestsdeftengxun(addr):

url= "https://apis.map.qq.com/jsapi?" #腾讯地图API接口

para ={"qt": "geoc","addr":addr, #传入地址参数

"output": "json","key": "D7EBZ-NHYKX-UAH4A-74TW4-6M2JE-UHFLY", #即腾讯地图API的key

"pf":"jsapi","ref":"jsapi"}

req= requests.get(url,para) #请求数据

req = req.json() #转为json格式

#print(req)

m = req["detail"]

g= f"{m['pointx']},{m['pointy']}" #解析到经纬度数据

print(g)returng

tengxun(addr="深圳市")

传入自变量“深圳市”,运行Python代码,即可获得深圳市的经纬度数据:

'113.883080,22.553290'

2、读取数据

函数构造好以后,导入准备好的excel文件,文件包含广州500所学校的地址数据。可在「菜J学Python」公众后台回复学校自动获取。

importpandas as pd

df1= pd.read_excel("gz_school.xlsx")

df1.head()

数据预览:

3、应用函数

将学校数据中的地址列应用于前文构造的函数,批量获取500所学校的经纬度数据并进行程序计时。

importtime

time_start= time.time() #程序起始时间

df1['经纬度']=df1['address'].apply(tengxun) #调用函数

time_end = time.time() #程序结束时间

t = time_end-time_start #运行时间

print('共用时%s秒'%t)

通过腾讯地图批量解析500个地址获取经纬度数据共用时约52.40秒,平均1秒钟可以获取9个地址的经纬度。

共用时52.39904499053955秒

4、保存数据

获取到经纬度数据后,保存为excel文件。

df1.head()

df1.to_excel('result.xlsx',index = False)

数据预览:

二、高德地图

同样的,高德也需要提前在高德开放平台注册并创建应用,获取你的专属key。

高德地图开放平台

1、构造函数

importpandas as pdimportrequestsimporttimeimportcsvimportjsondefgaode(addr):

para={'key':'你自己的', #高德地图开放平台申请的key

'address':addr #传入地址参数

}

url= 'https://restapi.amap.com/v3/geocode/geo?' #高德地图API接口

req =requests.get(url,para)

req=req.json()print('-' * 30)

m= req['geocodes'][0]['location']print(m)returnm

gaode(addr="深圳")

2、应用函数

df2 = pd.read_excel('gz_school.xlsx') #读取地址数据

time_start =time.time()

df2['经纬度'] = df2['address'].apply(gaode) #调用函数

time_end =time.time()

t= time_end-time_startprint('共用时%s秒'%t)

通过高德地图批量解析500个地址获取经纬度数据共用时约37.74秒,平均1秒钟可以获取13个地址的经纬度,解析速度高于腾讯地图。

共用时37.740272998809814秒

三、百度地图

百度地图批量获取经纬度方法与高德地图一致。

百度地图开放平台

1、构造函数

importpandas as pdimportrequestsimporttimeimportcsvimportjsondefbaidu(addr):

url= "http://api.map.baidu.com/geocoding/v3/?" #百度地图API接口

para ={"address": addr, #传入地址参数

"output": "json","ak": "你自己的" #百度地图开放平台申请ak

}

req=requests.get(url,para)

req=req.json()#print(req)

print('-' * 30)

m= req["result"]["location"]

g= f"{m['lng']},{m['lat']}"

print(g)returng

baidu(addr="深圳")

2、应用函数

df3 = pd.read_excel('gz_school.xlsx')

time_start=time.time()

df3['经纬度'] = df3['address'].apply(baidu)

time_end=time.time()

t= time_end-time_startprint('共用时%s秒'%t)

通过百度地图批量解析500个地址获取经纬度数据共用时约24.06秒,平均1秒钟可以获取20个地址的经纬度,解析速度高于高德地图和腾讯地图。

共用时24.0550799369812秒

四、小结

仅从解析速度来看,百度地图效率高于高德地图,高德地图高于腾讯地图。当然,解析速度还要考虑程序运行时的网络状况、电脑自身配置等因素。另外,地址数据解析还要考虑准确率,只有综合考虑解析速度和准确率,才能更加客观地判断哪一种方法最优,准确率方面的评测将在以后的文章中进行分享。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用Python根据经纬度裁剪栅格数据可以通过以下步骤实现: 1. 载入需要裁剪的栅格数据经纬度信息。可以使用Python中的(如GDAL、Rasterio)读取栅格数据文件,同时使用Python中的数值处理(如Pandas、Numpy)加载经纬度信息。 2. 确定裁剪区域的范围。根据给定的经纬度范围,将裁剪区域的边界坐标确定下来。 3. 根据裁剪区域的边界坐标,计算出栅格数据中对应的像素行列范围。通过栅格数据的分辨率和起始点坐标,可以将裁剪区域的经纬度范围转换为像素行列的范围。 4. 使用得到的像素行列范围对栅格数据进行裁剪。根据像素行列范围,将栅格数据文件中的对应像素值提取出来。 5. 最后保存裁剪后的栅格数据。可以使用上述的来保存栅格数据文件,并将裁剪后的像素值写入其中。 这样,我们就可以用Python根据经纬度裁剪栅格数据。根据不同的数据的选择,具体的代码实现可能会有所不同。 ### 回答2: Python可以使用GDAL(Geospatial Data Abstraction Library)来根据经纬度裁剪栅格数据。 首先,需要安装GDAL。可以使用pip命令来安装,命令如下: ``` pip install gdal ``` 安装完成后,可以导入GDAL,并使用下面的代码来进行经纬度裁剪: ```python from osgeo import gdal, ogr import numpy as np # 设置要裁剪的经纬度范围 xmin, xmax, ymin, ymax = 10, 20, 30, 40 # 读取栅格数据 input_raster = gdal.Open('input.tif') band = input_raster.GetRasterBand(1) raster_array = band.ReadAsArray() # 获取栅格数据的地理转换信息 transform = input_raster.GetGeoTransform() x_origin = transform[0] y_origin = transform[3] pixel_width = transform[1] pixel_height = transform[5] # 计算裁剪窗口的像素坐标 x_start = int((xmin - x_origin) / pixel_width) x_end = int((xmax - x_origin) / pixel_width) y_start = int((y_origin - ymax) / abs(pixel_height)) y_end = int((y_origin - ymin) / abs(pixel_height)) # 裁剪栅格数据 clipped_array = raster_array[y_start:y_end, x_start:x_end] # 创建裁剪后的栅格数据文件 clipped_raster = gdal.GetDriverByName('GTiff').Create('output.tif', x_end - x_start, y_end - y_start, 1, gdal.GDT_Float32) clipped_raster.SetProjection(input_raster.GetProjection()) clipped_raster.SetGeoTransform([xmin, pixel_width, 0, ymax, 0, -pixel_height]) clipped_raster.GetRasterBand(1).WriteArray(clipped_array) # 关闭栅格数据 clipped_raster = None input_raster = None ``` 以上代码中使用了GDAL的一些基本函数来读取和裁剪栅格数据。根据设置的经纬度范围,计算了在栅格数据中对应的像素坐标,并裁剪了栅格数据。最后,将裁剪后的数据写入一个新的栅格数据文件中。 裁剪完成后,可以使用其他工具如ArcGIS或QGIS等来查看裁剪后的栅格数据文件。 ### 回答3: Python提供了多个来处理栅格数据,常用的包括GDAL、rasterio和xarray。 首先,需要安装相应的。可以使用pip命令安装这些: ``` pip install gdal pip install rasterio pip install xarray ``` 接下来,需要了解要处理的栅格数据的文件格式以及具体的数据结构。通常,栅格数据以地理信息系统(GIS)文件格式存储,如GeoTIFF格式。在使用python处理栅格数据之前,需要先了解数据是如何组织和存储的。 一旦了解了数据的格式和结构,就可以开始裁剪栅格数据了。下面是一个使用rasterio裁剪栅格数据的示例代码: ```python import rasterio def clip_raster(input_file, output_file, min_lon, max_lon, min_lat, max_lat): with rasterio.open(input_file) as src: # 获取栅格数据的空间参考信息 crs = src.crs # 定义裁剪的范围 bounds = (min_lon, min_lat, max_lon, max_lat) # 调整裁剪后的栅格数据的空间参考信息 out_transform, out_width, out_height = rasterio.warp.calculate_default_transform( src.crs, crs, src.width, src.height, *bounds) # 裁剪栅格数据,并保存到输出文件中 with rasterio.open(output_file, 'w', driver='GTiff', width=out_width, height=out_height, transform=out_transform, crs=crs, count=src.count, dtype=src.dtypes[0]) as dst: rasterio.warp.reproject(src, dst, src_transform=src.transform, src_crs=src.crs, dst_transform=out_transform, dst_crs=crs, resampling=rasterio.warp.Resampling.nearest) ``` 以上代码示例使用rasterio裁剪栅格数据。首先,使用`rasterio.open`函数打开待处理的栅格数据文件。然后,根据给定的经纬度范围计算裁剪后的输出栅格数据的空间参考信息。接下来,创建一个新的输出栅格数据文件,并设置其相应的参数,如宽度、高度、变换矩阵等。最后,使用`rasterio.warp.reproject`函数将原始栅格数据投影到新的输出栅格数据文件中,并通过`rasterio.open`打开输出文件,将裁剪后的栅格数据写入其中。 需要注意的是,以上示例仅提供了使用rasterio裁剪栅格数据的一个基本示例。实际操作中,可能需要根据具体的数据格式和处理需求进行相应的调整和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值