大地坐标转笛卡尔坐标代码无报错但无法输出x值问题排查
问题分析与修复方案
嘿,我帮你梳理下代码里的几个问题,这就是为啥print不出x的核心原因:
1. 变量作用域问题(最关键)
你在函数earthConverter里计算的x是局部变量,函数外部根本访问不到它。而且你调用函数后,没把返回的结果赋值给任何外部变量,直接print(x)肯定找不到这个变量呀!
2. 变量定义顺序搞反了
你在计算N的时候用到了e,但e是在N之后才定义的——这会直接抛出NameError,你说运行无报错可能是之前测试有残留?不管怎样,必须先算e再算N。
3. 公式逻辑错误
计算卯酉圈半径N的公式里,应该用纬度的正弦值math.sin(latitude),你写成了math.sin(longitude),这会导致所有坐标计算完全错误。
4. 白做了用户输入
你费了劲获取用户输入的经纬度和高度,但调用函数的时候用了硬编码的数值123.0256, 56.45648, 21322.4545,等于用户输入完全没用上,这可不太行。
修正后的完整代码
import math a = 6378137 f = 0.00335281068 # 获取用户输入并转成弧度/数值 latitude = math.radians(float(input('Enter Latitude:'))) longitude = math.radians(float(input('Enter Longitude:'))) height = float(input('Enter Height:')) def earthConverter(latitude, longitude, height): # 先计算偏心率e,再计算卯酉圈半径N e = math.sqrt((2 * f) - (f**2)) N = a / math.sqrt(1 - e**2 * math.sin(latitude)**2) # 修正公式里的经纬度顺序,确保计算正确 x = (N + height) * math.cos(latitude) * math.cos(longitude) y = (N + height) * math.cos(latitude) * math.sin(longitude) z = (N * (1 - e**2) + height) * math.sin(latitude) return x, y, z # 用用户输入的参数调用函数,并接收返回值 x, y, z = earthConverter(latitude, longitude, height) # 现在可以正常打印x了 print('x is %f' % x) print('y is %f' % y) print('z is %f' % z)
关键修改点说明
- 调整了
e和N的定义顺序,避免未定义错误 - 修正了
N和坐标计算里的经纬度正弦/余弦调用,符合大地坐标转笛卡尔坐标的标准公式 - 将函数返回值赋值给外部的
x,y,z变量,让print能正常访问 - 使用用户输入的参数调用函数,而不是硬编码数值
内容的提问来源于stack exchange,提问作者A Banitaba
相关产品推荐
相关产品推荐

