gpt4 book ai didi

python - 将纬度和经度转换为 3D 空间中的点

转载 作者:IT老高 更新时间:2023-10-28 21:01:14 26 4
gpt4 key购买 nike

我需要将纬度和经度值转换为 3 维空间中的一个点。我已经尝试了大约 2 个小时,但我没有得到正确的结果。

Equirectangular坐标来自openflights.org .我尝试了几种 cossin 的组合,但结果看起来并不像我们心爱的小地球。


在下面,您可以看到应用转换 Wikipedia 的结果建议。我认为可以从上下文中猜出 c4d.Vector 是什么。

def llarToWorld(latit, longit, altid, rad):
x = math.sin(longit) * math.cos(latit)
z = math.sin(longit) * math.sin(latit)
y = math.cos(longit)
v = c4d.Vector(x, y, z)
v = v * altid + v * rad
return v

enter image description here

红色:X,绿色:Y,蓝色:Z

确实可以识别北美和南美,尤其是墨西哥湾周围的土地。但是,它看起来有点压扁,有点放错地方了..


由于结果看起来有些旋转,我想,我尝试交换纬度和经度。但是这个结果有点尴尬。

def llarToWorld(latit, longit, altid, rad):
temp = latit
latit = longit
longit = temp
x = math.sin(longit) * math.cos(latit)
z = math.sin(longit) * math.sin(latit)
y = math.cos(longit)
v = c4d.Vector(x, y, z)
v = v * altid + v * rad
return v

enter image description here


这是没有转换值的结果。

def llarToWorld(latit, longit, altid, rad):
return c4d.Vector(math.degrees(latit), math.degrees(longit), altid)

enter image description here


问题:如何正确转换经纬度?


解决方案

感谢 TreyA,我找到了 this mathworks.com 上的页面。执行它的代码如下:

def llarToWorld(lat, lon, alt, rad):
# see: http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.html
f = 0 # flattening
ls = atan((1 - f)**2 * tan(lat)) # lambda

x = rad * cos(ls) * cos(lon) + alt * cos(lat) * cos(lon)
y = rad * cos(ls) * sin(lon) + alt * cos(lat) * sin(lon)
z = rad * sin(ls) + alt * sin(lat)

return c4d.Vector(x, y, z)

实际上,我切换了 yz 因为那时地球是旋转的,但是,它起作用了!结果是这样的:

enter image description here

最佳答案

我已经重新格式化了之前在这里提到的代码,但更重要的是,您遗漏了 Niklas R 提供的链接中提到的一些方程式

def LLHtoECEF(lat, lon, alt):
# see http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.html

rad = np.float64(6378137.0) # Radius of the Earth (in meters)
f = np.float64(1.0/298.257223563) # Flattening factor WGS84 Model
cosLat = np.cos(lat)
sinLat = np.sin(lat)
FF = (1.0-f)**2
C = 1/np.sqrt(cosLat**2 + FF * sinLat**2)
S = C * FF

x = (rad * C + alt)*cosLat * np.cos(lon)
y = (rad * C + alt)*cosLat * np.sin(lon)
z = (rad * S + alt)*sinLat

return (x, y, z)

比较输出:查找加利福尼亚州洛杉矶的 ECEF(34.0522,-118.40806,0 海拔)
我的代码:
X = -2516715.36114 米或 -2516.715 公里
Y = -4653003.08089 米或 -4653.003 公里
Z = 3551245.35929 米或 3551.245 公里

您的代码:
X = -2514072.72181 米或-2514.072 公里
Y = -4648117.26458 米或-4648.117 公里
Z = 3571424.90261 米或3571.424 公里

虽然在您的地球自转环境中,您的函数会生成正确的地理区域以供显示,但它不会给出正确的 ECEF 等效坐标。如您所见,一些参数的差异高达 20 KM,这是一个相当大的错误。

扁平化因子,f 取决于您为转换假设的模型。典型,型号为 WGS 84 ;但是,还有其他型号。

我个人喜欢用this link到海军研究生院对我的转换进行全面检查。

关于python - 将纬度和经度转换为 3D 空间中的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10473852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com