用Python分析经纬度数据

本文介绍如何使用Python批量获取腾讯地图、高德地图及百度地图的经纬度数据,并对比了这三种方法的效率。
部署运行你感兴趣的模型镜像

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

热力地图

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

一、腾讯地图

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

腾讯地图开放平台

1、构造函数

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

import requests

def tengxun(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)
    return g
tengxun(addr="深圳市")

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

'113.883080,22.553290'

2、读取数据

函数构造好以后,导入准备好的excel文件,文件包含广州500所学校的地址数据。

import pandas as pd
df1 = pd.read_excel("gz_school.xlsx")
df1.head()

数据预览:

3、应用函数

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

import time
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、构造函数

import pandas as pd
import requests
import time
import csv
import json

def gaode(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)
        return m
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_start
print('共用时%s秒'%t)

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

共用时37.740272998809814秒

三、百度地图

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

百度地图开放平台

1、构造函数

import pandas as pd
import requests
import time
import csv
import json

def baidu(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)
    return g
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_start
print('共用时%s秒'%t)

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

共用时24.0550799369812秒

四、小结

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

Python 会交互的绘图库 Plotly!

取数,取数,取个屁啊!

后台回复“入群”即可加入小z数据干货交流群

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 使用 Python经纬度坐标筛选和提取地理空间数据 #### 准备工作 为了能够按照给定的经纬度坐标从地理空间数据集中筛选并提取所需的信息,通常会涉及到读取矢量或栅格格式的空间数据。对于矢量数据而言,GeoPandas 是一个强大的工具;而对于栅格数据,则更多依赖于 Rasterio 或者 ArcPy 这样的库。 #### 数据加载与预处理 当面对的是 CSV 文件中的经纬度列表时,可以通过 Pandas 来高效地导入这些数据[^3]: ```python import pandas as pd data = pd.read_csv('coordinates.csv') # 假设有一个名为 coordinates 的CSV文件 ``` 如果目标是从遥感影像中抽取像素值,那么先要确定每个坐标对应的行列号。这一步骤涉及到了解图像的原点位置 (`yOrigin`) 和像元大小 (`pixelHeight`), 如下所示[^2]: ```python def get_pixel_location(coord_y, yOrigin, pixelHeight): """根据纬度计算所在行""" loc_y = int((float(coord_y) - yOrigin) / pixelHeight) return loc_y ``` #### 提取 Landsat 影像数据 针对 Landsat 卫星影像,Google Earth Engine (GEE) 平台提供了便捷的方法来依据地理位置查询路径/行编号,并进一步下载指定区域内的多光谱扫描仪(MSS)/专题制图仪(TM)/增强型TM(ETM+)/OLI-TIRS传感器所记录的数据集[^1]。这里给出一段简单的 GEE Python API 示例代码用于检索某一点位附近的 Landsat 场景: ```python import ee ee.Initialize() point_of_interest = ee.Geometry.Point([-76.0, 45.0]) # 替换为实际兴趣点的位置 landsat_collection = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA').filterBounds(point_of_interest) image_info = landsat_collection.getInfo() print(image_info['features'][0]['properties']['WRS_PATH'], image_info['features'][0]['properties']['WRS_ROW']) ``` 上述脚本展示了如何通过设定几何对象(即 `ee.Geometry.Point()` 方法创建的兴趣点)作为过滤条件,从而缩小搜索范围至特定地点周围的 Landsat 图像集合内。之后调用了 `.getInfo()` 获取具体属性信息,包括 WRS 路径和行数。 #### 批量提取站点处的格网数值 如果有多个监测站或者其他类型的固定采样点需要分析其覆盖下的网格单元特征值的话,可以考虑采用循环结构遍历所有待处理条目,并借助之前定义好的辅助函数完成定位操作后再执行抽样过程[^4]。 ```python for index, row in data.iterrows(): lat, lon = row['latitude'], row['longitude'] # 计算当前样本点位于哪个像元上... pass # 此处省略了具体的实现逻辑 # ...进而访问该像元的内容。 value_at_point = raster_data.get_value(lat, lon) # 需要自定义此方法以适应不同源数据格式 ``` 以上就是基于 Python 实现按经纬度坐标筛选及提取地理空间数据的主要流程和技术要点概述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值