【发布时间】:2012-05-06 20:07:34
【问题描述】:
我需要将纬度和经度值转换为 3 维空间中的一个点。我已经尝试了大约 2 个小时,但我没有得到正确的结果。
Equirectangular 坐标来自openflights.org。我尝试了几种 cos 和 sin 的组合,但结果看起来并不像我们心爱的小地球。
在下面,您可以看到应用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
红色: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
这是没有转换值的结果。
def llarToWorld(latit, longit, altid, rad):
return c4d.Vector(math.degrees(latit), math.degrees(longit), altid)
问题:如何正确转换经纬度?
解决方案
感谢 TreyA,我在 mathworks.com 上找到了 this 页面。执行它的代码如下:
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)
实际上,我切换了y 和z,因为那时地球是旋转的,但是,它起作用了!结果是这样的:
【问题讨论】:
-
altid是海拔高度,但rad是什么?那是地球的半径吗?altid和rad是否使用相同的单位(英尺)?如果您只使用半径(即仅v = v * rad)怎么办? -
还可以查看谷歌搜索“lla to ecef” - 以地球为中心的纬度/经度/高度,固定地球。
-
@TreyA 完美,谢谢!发现这个:mathworks.de/help/toolbox/aeroblks/llatoecefposition.html 这是正确的公式。 :) 如果您想要代表,您可以将您的评论作为答案,这样我也可以将我的问题标记为已回答。
标签: python math 3d latitude-longitude data-conversion