我有一个增强现实的应用程序,其中我存储了具有相应经度和纬度的信息,如地铁、加油站、名胜古迹等。
现在,根据设备的方向,我将在设备的相机视图中为每个站点显示一个标记。类似于Layar和维基。
它花了三天时间不停地寻找,也没有找到任何人来解释如何解决这个问题。
发布于 2011-04-08 23:28:16
由于关于这个话题的信息非常稀少,而且我最近在iPhone上解决了这个问题,我想我会把我的方法分享给任何可以让它在安卓上工作的人(除了可以在java.lang.Math中找到的数学函数sin、cos和fmod之外,在这个答案中并没有真正特定于iPhone的东西)。以下是我采取的步骤:
double latDelta = (lat2 - lat1);
double lonDelta = (lon2 - lon1);
double y = sin(lonDelta) * cos(lat2);
double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2)* cos(lonDelta);
double angle = atan2(y, x); //not finished here yet
double headingDeg = compass.currentHeading;
double angleDeg = angle * 180/PI;
double heading = headingDeg*PI/180;
angle = fmod(angleDeg + 360, 360) * PI/180; //normalize to 0 to 360 (instead of -180 to 180), then convert back to radians
angleDeg = angle * 180/PI;
使用标准三角函数,我计算x和y,记住,这些坐标是在3D空间中的,所以我们还没有完成,因为你仍然需要将它们映射到2D:
x = sin(angle-heading) * distance;
z = cos(angle-heading) * distance; //typically, z faces into the screen, but in our 2D map, it is a y-coordinate, as if you are looking from the bottom down on the world, like Google Maps
最后,使用投影公式,你可以计算屏幕x(我没有计算y,因为它对我的项目不是必需的,但你需要获得加速器数据,并计算出设备是否垂直于地面)。
double screenX = (x * 256) / z
现在,您可以使用此x坐标在屏幕上移动图像或标记。请记住以下几点:
所有的东西都必须以弧度为单位,从你到currentHeading的角度是angleBeteweenPoints -
(由于某些原因,我无法在这台计算机上正确格式化代码,所以如果有人想编辑这个答案,请随意)。
https://stackoverflow.com/questions/5314724
复制相似问题