Python地理坐标系和投影坐标系转换

这篇博客介绍了地理坐标系统(GCS)和投影坐标系统(PCS)的相关概念,如WGS84、UTM,并详细阐述了如何使用Python的Pyproj库进行两者之间的转换。转换方法包括通过EPSG Code和坐标系统名称。同时提醒,在投影坐标系中无法直接计算两点的大圆距离。
Python3.8

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

0 相关名词

在开始之前,有必要了解一下相关名词:

  1. 地心地固坐标系(Earth-Centered, Earth-Fixed,ECEF),简称地心坐标系。
  2. 地理坐标系统(Geographic Coordinate System,GCS)1,坐标系是地心坐标系,用经纬度表示球面上的点。
  3. 世界大地测量系统(World Geodetic System, WGS),比如WGS84,是一种地理坐标系统,用于全球定位系统(GPS)。
  4. 投影坐标系统(Projection Coordinate System,PCS)2
  5. 通用横轴墨卡托投影(Universal Transverse Mercator,UTM),是一种投影方法。

关于地理坐标系和投影坐标系更详细的解释可以查看这篇文章:你必须知道的地理坐标系和投影坐标系

地理坐标系统有不同的基准和方法,比如:Xian_1980,Beijing_1954,WGS_1984等。投影坐标系统也有不同的基准和方法,UTM和UPS等。每一个地理坐标系统(GCS)和投影坐标系统(PCS)都有一个独特的EPSG代码,代码可在 EPSG 网站查询。

有一篇介绍Pyproj进行地理投影坐标系转换的文章3,但不够全面。其中提到arcgis网站上查询 地理坐标系投影坐标系 的方法很实用但不全。

1 地理和投影坐标系统相互转换

整理使用Python的第三方库 Pypro4 转换经纬度表示的地理坐标系统到投影坐标系统。

Pypro模块共有两个函数:

函数描述
test()运行模块测试
transform(p1, p2, x, y, z=None, radians=False)用法:x2, y2, z2 = transform(p1, p2, x1, y1, z1, radians=False),将在坐标系统p1下的点(x1, y1, z1)转换到p2坐标系统下

1.1 使用EPSG Code转换

转换经纬度到的投影坐标系统;转换一个投影坐标系统到另一个投影坐标系统;反向转换,把投影坐标系统上的点转换到地理坐标系统:

>>> p1 = pyproj.Proj(init='epsg:26915') # 一个投影坐标系统EPSG Code
>>> p2 = pyproj.Proj(init='epsg:26715') # 另一个投影坐标系统EPSG Code
>>> x1, y1 = p1(-92.199881,38.56694) # 投影到EPSG Code为26915的投影坐标系统
>>>> '%9.3f %11.3f' % (x1,y1)
'569704.566 4269024.671'
>>> x2, y2 = pyproj.transform(p1,p2,x1,y1) # 转换一个投影坐标系统到另一个投影坐标系统
>>> '%9.3f %11.3f' % (x2,y2)
'569722.342 4268814.027'
>>> '%8.3f %5.3f' % p2(x2,y2,inverse=True) # 反向转换
' -92.200 38.567'

用元组传入多个点

>>> lats = (38.83,39.32,38.75) # 所有纬度组成的元组
>>> lons = (-92.22,-94.72,-90.37) # 所有精度组成的元组
>>> x1, y1 = p1(lons,lats) # 转换经纬度到投影坐标系统
>>> x2, y2 = pyproj.transform(p1,p2,x1,y1) # 转换一个投影坐标系统到另一个投影坐标系统
>>> lons, lats = p2(x2,y2,inverse=True) # 反向转换

1.2 使用基准名称转换

除了使用EPSG Code之外,还可以显示指定坐标系统名称

>>> p1 = pyproj.Proj(proj='latlong',datum='WGS84') # WGS84,GPS使用的地理坐标系统,EPSG Code为4326
>>> x1 = -111.5; y1 = 45.25919444444
>>> p2 = pyproj.Proj(proj="utm",zone=10,datum='NAD27') # 投影坐标系统NAD27 / UTM zone 10N,EPSG Code为26710
>>> x2, y2 = pyproj.transform(p1, p2, x1, y1)
>>> "%s  %s" % (str(x2)[:9],str(y2)[:9])
'1402285.9  5076292.4'

2 其他

如果需要计算地球上两点的距离,可以使用大圆距离来计算,不能使用投影坐标系中的两点计算距离


  1. https://en.wikipedia.org/wiki/Geographic_coordinate_system ↩︎

  2. https://en.wikipedia.org/wiki/Geographic_coordinate_system#Map_projection ↩︎

  3. https://blog.csdn.net/sinat_28797501/article/details/75635439 ↩︎

  4. https://jswhit.github.io/pyproj/ ↩︎

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

Python3.8

Python3.8

Conda
Python

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值