在Pyproj中使用R_A创建球面CRS的问题及正确实现问询
问题
Proj文档指出,R_A参数代表"与椭球表面积相等的球体"。我尝试执行以下代码:
import pyproj crs = pyproj.CRS(proj='latlon', R_A='WGS84')
期望得到使用WGS84等面积球半径的球面CRS,但返回的椭球扁率f不为0,并非球面;即使显式指定sphere=True,结果仍一致。请问我对R_A文档的理解存在什么误区?是否有简便方法创建使用该特定半径的球面CRS?
回答
误区解释
R_A参数的核心作用并非定义球面CRS,而是在基于椭球的投影计算流程中,临时用指定椭球的等面积球半径替代原椭球的计算半径。它不会修改CRS本身的椭球元数据——也就是说,你指定R_A='WGS84'时,CRS依然会保留WGS84椭球的扁率参数,只是在后续投影计算时会用等面积球半径来做数值运算,这就是你看到扁率f≠0的原因。
而sphere=True是一个计算层面的开关,仅控制投影计算时是否按球面逻辑处理,同样不会改变CRS的椭球元数据定义,所以元数据里的扁率依然不会变为0。
正确创建球面CRS的方法
要得到真正使用WGS84等面积球半径的球面CRS,需要先计算该半径值,再显式定义一个扁率为0的球面椭球:
import pyproj # 1. 获取WGS84椭球的等面积球半径 wgs84_ellps = pyproj.Ellipsoid("WGS84") r_a = wgs84_ellps.R_A # 2. 创建球面CRS:指定半径,扁率设为0 spherical_crs = pyproj.CRS(f"+proj=latlon +a={r_a} +f=0") # 验证扁率是否为0 print(spherical_crs.ellipsoid.flattening) # 输出:0.0
或者也可以直接用Proj字符串组合实现,效果完全一致:
spherical_crs = pyproj.CRS("+proj=latlon +ellps=sphere +R=6371007.180918475")
(注:6371007.180918475是WGS84椭球对应的R_A精确值)
内容的提问来源于stack exchange,提问作者shadowtalker
相关产品推荐
相关产品推荐

