您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 用Python转换地理经纬度数据的方法有哪些
地理经纬度数据是GIS(地理信息系统)、导航、气象等领域的基础数据类型。Python凭借丰富的第三方库,成为处理地理坐标数据的利器。本文将详细介绍6种Python转换经纬度数据的方法,涵盖格式转换、坐标系转换、批量处理等场景。
---
## 一、基础格式转换
### 1. 度分秒(DMS) ↔ 十进制(DD)
**场景**:将"30°15'45\"N"格式转换为30.2625
```python
def dms_to_dd(d, m, s, direction):
dd = d + m/60 + s/3600
if direction in ('S', 'W'):
return -dd
return dd
# 示例:转换30°15'45"N
print(dms_to_dd(30, 15, 45, 'N')) # 输出30.2625
def dd_to_dms(dd):
d = int(dd)
m = int((dd - d) * 60)
s = (dd - d - m/60) * 3600
return d, m, s
# 示例:转换30.2625
print(dd_to_dms(30.2625)) # 输出(30, 15, 45.0)
使用正则表达式处理复杂格式:
import re
def parse_dms(dms_str):
parts = re.split('[°\'"]+', dms_str)
return float(parts[0]) + float(parts[1])/60 + float(parts[2])/3600
print(parse_dms('30°15\'45"N')) # 输出30.2625
使用pyproj
库进行精确转换:
from pyproj import Transformer
# WGS84转GCJ02
transformer = Transformer.from_crs("EPSG:4326", "EPSG:4490")
lng, lat = 116.404, 39.915
gcj_lng, gcj_lat = transformer.transform(lat, lng)
print(f"GCJ02坐标: {gcj_lng:.6f}, {gcj_lat:.6f}")
# 反向转换
transformer_rev = Transformer.from_crs("EPSG:4490", "EPSG:4326")
wgs_lng, wgs_lat = transformer_rev.transform(gcj_lat, gcj_lng)
使用geopandas
处理矢量数据:
import geopandas as gpd
gdf = gpd.read_file('input.shp')
gdf = gdf.to_crs("EPSG:3857") # 转换为Web墨卡托投影
gdf.to_file('output.shp')
from geopy.point import Point
from geopy import distance
# 创建Point对象
p = Point("30°15'45\"N 120°10'50\"E")
print(p.latitude, p.longitude) # 30.2625, 120.180556
# 计算两点距离
p1 = (30.2625, 120.180556)
p2 = (31.2345, 121.4567)
print(distance.distance(p1, p2).km) # 输出千米距离
from pyproj import CRS, Transformer
# 定义Albers等面积投影
albers = CRS.from_proj4("""
+proj=aea +lat_1=25 +lat_2=47 +lat_0=36 +lon_0=105
+x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs
""")
transformer = Transformer.from_crs(4326, albers)
x, y = transformer.transform(39.9, 116.4)
import pandas as pd
from pyproj import Transformer
# 读取GPS数据
df = pd.read_csv('gps_points.csv')
# 批量转换坐标系
transformer = Transformer.from_crs("EPSG:4326", "EPSG:32650") # WGS84转UTM 50N
df['x'], df['y'] = transformer.transform(df['lat'], df['lng'])
# 计算移动距离
df['dist'] = ((df['x'].diff()**2 + df['y'].diff()**2)**0.5).fillna(0)
print(f"总行程距离: {df['dist'].sum():.2f}米")
import numpy as np
lats = np.array([39.9, 40.0, 40.1])
lngs = np.array([116.4, 116.5, 116.6])
x, y = transformer.transform(lats, lngs) # 批量转换
from multiprocessing import Pool
def process_point(point):
return transformer.transform(*point)
with Pool(4) as p:
results = p.map(process_point, zip(lats, lngs))
工具 | 适用场景 | 特点 |
---|---|---|
PyProj | 专业坐标系转换 | 支持4000+坐标系 |
GeoPandas | 矢量数据处理 | 基于Pandas的GIS扩展 |
Geopy | 地理编码/反编码 | 集成Google/OSM等API |
Fiona | 文件格式转换 | 读写Shapefile/GeoJSON等 |
Python处理经纬度数据的核心在于: 1. 根据精度需求选择合适的库 2. 批量处理时注意性能优化 3. 明确数据来源的坐标系标准 4. 对关键转换步骤进行结果验证
建议在实际项目中结合PyProj+GeoPandas组合,既能保证转换精度,又能高效处理大规模空间数据。 “`
注:本文代码示例已在Python 3.8 + pyproj 3.4环境下测试通过,实际使用时请根据具体需求调整参数。对于高精度测绘场景,建议咨询专业测绘人员验证转换参数。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。