pyproj中datum与ellps的区别及ECEF转LLA参数疑问
关于pyproj中
datum和ellps参数的区别 我来给你理清楚这俩参数的核心差异,尤其是结合ECEF转LLA的场景来说:
ellps(椭球体):这就是描述地球形状的“几何模板”,只关心椭球的长半轴、短半轴/扁率这些纯几何数值。比如WGS84、GRS80都是标准椭球,你指定ellps=WGS84,本质是告诉pyproj用这个椭球的尺寸来做坐标计算——它完全不管这个椭球在空间里和真实地球的位置关系。datum(基准面):基准面是椭球体的“空间定位版”,它在椭球的几何参数基础上,额外定义了这个椭球相对于地球质心(或某个区域参考点)的偏移(平移、甚至旋转)参数。举个例子,NAD83基准面基于GRS80椭球,但它定义了这个椭球如何与北美大陆的实际地表对齐;而WGS84基准面和它的同名椭球几乎完全重合(现代版本偏移可忽略),所以很多时候用ellps=WGS84和datum=WGS84效果一致,但本质上datum包含了更多定位信息。
结合ECEF转LLA的场景看差异
ECEF是基于地球质心的坐标系,而LLA是基于某个基准面的地理坐标系:
- 如果你的目标是转成WGS84的LLA,只指定
ellps=WGS84是没问题的,因为WGS84的基准面就是质心对齐的,pyproj会默认用对应的质心基准面来做转换。 - 但如果要转成其他基准面(比如早期版本的NAD83),只指定
ellps=GRS80就不够了——因为早期NAD83的椭球和地球质心有偏移,这时候必须指定datum=NAD83,pyproj才会应用那些偏移参数,得到符合该基准面的正确LLA坐标。
举个实际的小例子:同样的ECEF坐标,用ellps=GRS80转换出来的LLA,和用datum=NAD83转换的结果会有几米的差异,就是因为后者应用了基准面的偏移参数。
另外提个小细节:当你同时指定datum和ellps时,proj4(pyproj的底层)会优先使用datum对应的椭球参数,除非你明确要自定义椭球才单独用ellps——一般不建议混合指定,容易造成混淆。
内容的提问来源于stack exchange,提问作者nickponline




