gpt4 book ai didi

android - 通过特定位置和经度获取屏幕坐标(android)

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:51:30 24 4
gpt4 key购买 nike

我有一个增强现实应用程序,我在其中存储了地铁、加油站、名胜古迹等信息以及相应的经纬度。

现在,根据设备的方向,我会在设备的摄像头 View 中为每个站点显示一个标记。类似于 Layar 和 Wikitude。

马不停蹄的找了三天,也没有找到任何人解释如何解决这个问题。

最佳答案

由于关于这个主题的信息非常少,而且我最近在 iPhone 上解决了这个问题,我想我会把我的方法分享给任何可以让它在 Android 上运行的人(这个答案中没有什么是针对 iPhone 的,除了数学函数 sin、cos 和 fmod,可以在 java.lang.Math 中找到)。这些是我采取的步骤:

  • 获取您自己的纬度/经度和您当前的罗盘航向(lat1、lon1 和航向)。在 iPhone 上,CLLocation 以度数返回这些值,但对于这些计算,它们必须以弧度为单位(即乘以 PI/180)
  • 以弧度(lat2 和 lon2)获取兴趣点 (POI) 的纬度/经度。
  • 使用此处找到的公式计算 lat1/lon1 和 lat2/lon2 之间的距离:http://www.movable-type.co.uk/scripts/latlong.html
  • 计算相对于北方的 lat2/lon2 角度。这也在上面的链接中进行了描述,但我在让它工作时遇到了一些麻烦,这里是 C 代码:

    double latDelta = (lat2 - lat1);
    双 lonDelta = (lon2 - lon1);
    double y = sin(lonDelta) * cos(lat2);
    double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2)* cos(lonDelta);
    双角 = atan2(y, x);//这里还没有结束
    double headingDeg = compass.currentHeading;
    double angleDeg = angle * 180/PI;
    双航向 = headingDeg*PI/180;
    angle = fmod(angleDeg + 360, 360) * PI/180;//标准化为 0 到 360(而不是 -180 到 180),然后转换回弧度
    angleDeg = 角度 * 180/PI;

  • 使用标准三角函数,我计算了 x 和 y。请记住,这些坐标是在 3D 空间中,所以我们还没有在这里完成,因为您仍然需要将它们映射到 2D:

    x = sin(角度航向) * 距离;
    z = cos(角度航向)* 距离;//通常情况下,z 面向屏幕,但在我们的 2D map 中,它是一个 y 坐标,就像您从下往下看世界一样,就像 Google map 一样

  • 最后,使用投影公式,您可以计算屏幕 x(我没有计算 y,因为它对我的项目没有必要,但您需要获取加速器数据并确定设备是否垂直到地面)。投影公式可在此处找到(滚动到最底部):http://membres.multimania.fr/amycoders/tutorials/3dbasics.html

    双屏X = (x * 256)/z

现在您可以使用此 x 坐标在屏幕上移动图像或标记。记住几点:

  • 一切都必须以弧度为单位
  • 从您到 POI 的相对于北方的角度是 angleBeteweenPoints - currentHeading

(出于某种原因我无法在这台计算机上正确格式化代码,所以如果有人想编辑这个答案,请随意)。

关于android - 通过特定位置和经度获取屏幕坐标(android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5314724/

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