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

2024-01-03

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

The 等长方形坐标来自openflights.org http://openflights.org/data.html。我尝试了几种组合cos and sin,但结果却一点也不像我们心爱的小地球。


在下面,您可以看到应用转换的结果维基百科 http://en.wikipedia.org/wiki/Spherical_coordinate_system#Cartesian_coordinates建议。我想人们可以从上下文中猜出什么c4d.Vector is.

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)

Question: 如何正确转换经度和纬度?


Solution

感谢 TreyA,我发现this http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.htmlmathworks.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)

其实我换了y and z因为当时地球是旋转的,但是,它是有效的!这就是结果:


我已经重新格式化了前面提到的代码,但更重要的是,您遗漏了提供的链接中提到的一些方程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 公里

虽然在你的地球自转环境中你的函数会产生正确的地理区域为了显示,它将NOT给出正确的 ECEF 等效坐标。正如您所看到的,一些参数的变化幅度高达20 KM这是一个相当大的错误。

扁平化因子,f取决于您为转换假设的模型。典型的,型号是WGS 84 http://en.wikipedia.org/wiki/World_Geodetic_System;然而,还有其他模型。

就我个人而言,我喜欢使用这个链接 http://www.oc.nps.edu/oc2902w/coord/llhxyz.htm到海军研究生院对我的转换进行健全性检查。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将纬度和经度转换为 3D 空间中的点 的相关文章

随机推荐

  • 使用 Twilio 接收短信并将其存储在数据库中

    我正在使用 Twilio API 发送和接收来自客户的短信 每次我向客户发送短信时 我都会存储以下字段to body到我的数据库中 我已经实现了用于发送消息的 API 该 API 运行良好 并且只需将字段保存到我的数据库中即可 我的问题 当
  • Python:multiprocessing.map:如果一个进程引发异常,为什么不调用其他进程的finally 块?

    我的理解是finally子句must如果已输入尝试 总是 被执行 import random from multiprocessing import Pool from time import sleep def Process x try
  • 无法运行 jetifier React Native

    我尝试运行react native run android 但收到此错误 info Running jetifier to migrate libraries to AndroidX You can disable it using no
  • Oracle 和 SQL Server 中 NVARCHAR 的区别?

    我们正在将一些数据从sql server迁移到oracle 对于定义为的列NVARCHAR在 SQL Server 中我们开始创建NVARCHAROracle 中的列认为它们相似 但看起来它们并非如此 我读过 stackoverflow 上
  • Shopify(液体):查找两个日期之间的天数

    我是 Shopify 和 liquid 文件语法的新手 我目前可以获得两个日期 assign product created date product created at date a b d y assign current date
  • Flutter中如何设置Interval? [复制]

    这个问题在这里已经有答案了 最近我尝试在 flutter 中进行间隔 但没有看到类似的东西setInterval function 1000 在 JavaScript 中 Flutter 中存在吗 您可以为此使用计时器 Timer time
  • 在C中将进程置于后台

    我目前正在潜心创建一个后台工作C with 我需要实现一个非阻塞waitpid为了使其发挥作用 我知道 另外 我已经发现了这种情况 如果 在命令行末尾输入 我只是不确定如何准确地发送进程 最后将其作为后台作业 并在另一个提示提示下一个命令时
  • 想要通过 terraform 将多个 Google Cloud IAM 角色分配给服务帐户

    我想通过 terraform 将多个 IAM 角色分配给单个服务帐户 我准备了一个 TF 文件来执行此操作 但它有错误 对于单个角色 可以成功分配 但对于多个 IAM 角色 则会出现错误 data google iam policy aut
  • 使用 Microsoft Graph API C# 将聊天消息发送到 Microsoft Teams 频道

    我的目标很简单 我想使用图形 API 将自动聊天消息发送到 MS Teams 频道 这似乎是图形 API 的测试版功能 仅在 Microsoft Graph Beta 中可用 我已阅读文档并一直尝试遵循此示例 https learn mic
  • Git/gitolite:设置 gitolite 后移动存储库

    我正处于让 Git 和 Gitolite 工作的最后阶段 这是目前的情况 Gitolite 管理下的存储库没有工作副本 因此 您要做的就是创建另一个包含工作副本的存储库 提交数据并将它们推送到 gitolite 管理的存储库 最简单的方法是
  • 当我使用自定义入口点时,为什么 webpack 无法找到 React?

    我在 Webpack 中设置了一个自定义入口点 但在我的 React 代码行中收到错误 import React from react Webpack 能够构建它 但它不会拦截该路径 因为 Chrome 给了我这个控制台错误 未捕获的类型错
  • 服务人员强制更新新资产

    我一直在阅读html5rocks Service Worker 简介 http www html5rocks com en tutorials service worker introduction 文章并创建了一个基本的服务工作线程来缓存
  • 为什么 Firefox 中的背景过滤器不起作用?

    我使用背景过滤器 模糊 30px 但 Firefox 不支持此属性 moz 背景过滤器 模糊 60px 也不起作用 默认不支持https caniuse com css backdrop filter https caniuse com c
  • 如何在 vstest 控制台上获取自定义输出?

    我在 Visual Studio 2012 中编写了一些数据驱动的测试 当我通过在 Visual Studio 2012 命令提示符中运行以下命令从控制台运行测试时vstest console exe myTestSuite dll 我收到
  • 什么是 Querydsl 'Q'

    我看到了 Querydsl 的示例 但我不明白其中的 QEmployee 是什么 QEmployee employee QEmployee employee QEmployee e new QEmployee e query from em
  • 如何在 Intellij 中启用 CSS 编辑

    我刚刚切换到 IntelliJ IDEA 因为我认为它非常适合开发 JavaFX 应用程序 我一定做错了什么 因为当我编辑 CSS 文件时 没有代码完成 当我尝试创建新的 CSS 文件时 没有 CSS 文件选项 我正在使用 IntelliJ
  • 如何在 Rails 中将文本转换为 unicode?

    在我的数据库中 我有以下条目 id name info 1 John Smith 正如您所知 信息栏显示错误 但它实际上是韩语 在 Chrome 中 当我将浏览器编码从 UTF 8 切换为韩语 我认为是 euc kr 时 我实际上设法这样查
  • 如何安装jar库?

    我已经下载了 ANTLR Java 运行时库 这是一个 jar 文件 它包含 org antlr runtime 我应该把它放在哪里以便 Java 编译器可以找到它 我需要提取它吗 如果相关的话 我正在使用 NetBeans 目前 假设您可
  • msbuild xmlupdate 删除 web.config 中的节点

    如何使用 MSBuild 社区任务删除 web config 中的节点 我可以使用 XmlUpdate 任务更新节点 但无法删除节点 有任何想法吗 XmlUpdate 任务可以做到这一点 我正在使用 2010 年 11 月 30 日的夜间版
  • 将纬度和经度转换为 3D 空间中的点

    我需要将纬度和经度值转换为 3 维空间中的点 我已经尝试了大约 2 个小时 但没有得到正确的结果 The 等长方形坐标来自openflights org http openflights org data html 我尝试了几种组合cos