如何用Pandas转换度分秒经纬度为十进制并绘制地图散点图?
度分秒坐标处理与散点图绘制方案
Pandas本身没有内置的度分秒(DMS)转十进制坐标的功能,你需要先把DMS格式转换为十进制格式,才能在Pandas中处理并绘制散点图。下面是具体实现方法:
1. 自定义DMS转十进制函数
自己写一个简单函数解析DMS字符串,计算十进制坐标即可,注意方向标识(E/W、N/S):E和N为正,W和S为负。
import pandas as pd import re def dms_to_decimal(dms_str): # 匹配方向、度、分、秒 match = re.match(r'([NSEW])?\s*(\d+)°(\d+)\'(\d+)\"', dms_str.strip()) if not match: return None dir, deg, min, sec = match.groups() decimal = int(deg) + int(min)/60 + int(sec)/3600 # 根据方向调整正负 if dir in ['W', 'S']: decimal = -decimal return decimal
2. Pandas中批量转换
假设你的数据存在CSV文件中,列名为经度和纬度,读取后用apply批量转换:
# 读取数据 df = pd.read_csv('站点数据.csv') # 转换为十进制坐标 df['经度_decimal'] = df['经度'].apply(dms_to_decimal) df['纬度_decimal'] = df['纬度'].apply(dms_to_decimal)
3. 绘制散点图
转换完成后,可使用Matplotlib做基础可视化,或用Folium做交互式地图:
Matplotlib基础散点图
import matplotlib.pyplot as plt plt.scatter(df['经度_decimal'], df['纬度_decimal']) plt.xlabel('经度(十进制)') plt.ylabel('纬度(十进制)') plt.title('站点坐标散点图') plt.show()
Folium交互式地图散点图
import folium # 以坐标均值为地图中心 m = folium.Map(location=[df['纬度_decimal'].mean(), df['经度_decimal'].mean()], zoom_start=10) # 添加每个站点标记 for idx, row in df.iterrows(): folium.Marker( location=[row['纬度_decimal'], row['经度_decimal']], popup=f"站点{idx+1}" ).add_to(m) # 保存地图 m.save('站点地图.html')
内容的提问来源于stack exchange,提问作者Maximilian Bähr
相关产品推荐
相关产品推荐

