地址(地点)经纬度批量互转及坐标系转换方法(白嫖!!!)

在进行地理数据分析或地图服务开发及搞地理科研学术时,地址与经纬度的互转是一个常见的需求。本文将介绍如何利用免费资源和工具,实现地址到经纬度的批量互相转换,零成本彻底解决这个问题!

目录

1、小量级转换开源工具

2、较大量级的转换方法

3、坐标系转换

结语


1、小量级转换开源工具

首先推荐这个开源的网站:Map location:https://maplocation.sjfkai.com/

作者集成了api,可以进行地址和经纬度的互相转换

优点

  • 支持百度、谷歌、高德三家平台的服务。
  • 可以选择不同的坐标系。
  • 完全免费。

缺点

  • 只能通过网页版使用。
  • 每次处理的数据条数有限。
  • 需要手动复制粘贴数据。

一般的处理已经足够使用!

2、较大量级的转换方法

如果要处理大量的数据,就要借助api来进行处理。

经过多方比对,建议使用腾讯位置服务:https://lbs.qq.com/dev/console/quota/account

首先访问腾讯位置服务控制台,进去之后修改账户额度,将可分配额度全都给你需要的功能上(注意不要超了),处理完后大概就是下图这个样子:

在图中可以看到前面对应的有接口地址,我们设置完得到key之后我写个调用代码,通过在本地运行脚本进行批量的转换,代码无毒可放心食用:

import pandas as pd
import requests as req
from urllib.parse import quote
from tqdm import tqdm
import time

# 腾讯地图API的Key
# KEY = '' #可以申请多个key交替使用
KEY = '5xxBZ-xxxxL-6SxxPF-EYxxV-QxxRH-AxxxC'

# CSV文件路径
CSV_PATH= r"C:\Users\xx2\Desktop\111.xlsx"

# 每日配额成功处理上限
SUCCESS_LIMIT = 10000
# 连续失败上限
FAILURE_LIMIT = 20

# 请求URL前缀
URL_PREFIX = 'https://apis.map.qq.com/ws/geocoder/v1/?address='

def get_cor(address, key):
    """
    获取单个地址对应坐标
    :param address: 地址名称
    :param key: 腾讯地图API的Key
    :return: 字典类型的经纬度坐标,格式:{'lat': 36.112438, 'lng': 114.393631}
    """
    # 对地址进行URL编码
    address_encoded = quote(address)
    url = f'{URL_PREFIX}{address_encoded}&key={key}'
    response = req.get(url)
    data = response.json()

    if data.get('status') == 0:
        return data.get('result').get('location')
    else:
        return None

if __name__ == '__main__':
    # 读取CSV文件
    df = pd.read_excel(CSV_PATH,engine='openpyxl')

    # 如果不存在,则添加新列用于存储经纬度
    if 'longitude' not in df.columns:
        df['longitude'] = None
    if 'latitude' not in df.columns:
        df['latitude'] = None

    success_count = 0
    failure_count = 0

    # 遍历每一行,获取地址信息并调用API获取经纬度
    for index, row in tqdm(df.iterrows(), total=df.shape[0], desc="Processing"):
        if pd.isnull(row['longitude']) or pd.isnull(row['latitude']):
            address = row['地点']
            if pd.notnull(address):
                full_address = '北京市' + address  # 在地址前加上“北京市”
                cor = get_cor(full_address, KEY)
                if cor:
                    # 写入经纬度
                    df.at[index, 'longitude'] = cor.get('lng')
                    df.at[index, 'latitude'] = cor.get('lat')
                    success_count += 1
                    failure_count = 0  # 成功后重置失败计数
                    print(f"处理成功: {full_address} -> (lng: {cor.get('lng')}, lat: {cor.get('lat')})")
                else:
                    df.at[index, 'longitude'] = 0
                    df.at[index, 'latitude'] = 0
                    failure_count += 1
                    print(f"处理失败: {full_address}")
            else:
                df.at[index, 'longitude'] = 0
                df.at[index, 'latitude'] = 0

            # 每处理完5条记录,暂停1秒
            if success_count % 5 == 4:
                time.sleep(1)

            # 保存并中断条件
            if success_count >= SUCCESS_LIMIT or failure_count >= FAILURE_LIMIT:
                temp_save_path = CSV_PATH.replace('.csv', f'_temp_{index}.csv')
                df.to_csv(temp_save_path, index=False)
                print(f"由于达到限制,在记录 {index} 处保存到 {temp_save_path}")
                break

    # 保存最终更新后的CSV文件
    df.to_excel(CSV_PATH, index=False)
    print(f"最终保存到 {CSV_PATH}")

以上代码需要注意几点:

1、每次使用一个key

2、脚本是通过读取本地的csv或者excel文件来进行处理,读取其中的“地点”列来调用api进行处理,读取本地文件地址为csv_path,例子中用的是excel的文件类型,如果是csv的话在read函数那改改就行,小白的话建议直接让chatgpt或者kimi给你改。

3、改功能就改URL前缀。

4、此代码中处理的都为北京的数据,所以为了减少误差,在处理之前都加上了“北京市”前缀,如果你要处理全国的就把此前缀删了,处理确定的某地可以对其进行修改。

5、最终处理完是在文档中加上了对应的经纬度列,为了避免出错请先另存原文件。

最终可以完美实现将文件中每一条地点都批量转换成经纬度,经过测试,很快很好用(最麻烦的部分就是写代码了但是已经调试好了)!!!

如果你的需求还是比较大的话,可以多注册几个账号,得到多个key,交替使用,基本上几十万的数据一天就能全都转换完。

注意:腾讯位置服务转换出来的坐标系为GCJ02坐标系,需要其他坐标系的话可以借助坐标系转换工具进行转换,我也尝试了许多方法,最终选择以下工具。

3、坐标系转换

坐标系转换,推荐开源免费的工具,原创作者——地学大数据,需要安装包的直接搜也可以私聊。

结语

通过上述方法,您可以高效地实现地址到经纬度的批量转换,无论是小规模的数据处理还是大规模的数据转换需求,都有相应的解决方案。希望这篇文章能帮助到有需要的朋友。啊哒哒哒哒大!如果有想学习arcgis和arcgis pro的使用教程和地理分析方法的盆友们点点赞之后更新哦~

猜你喜欢

转载自blog.csdn.net/weixin_46451009/article/details/141359236