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

我有一个应用增强现实,我已经存储了信息,例如我们的地铁,加油站,感兴趣的地方等相应的经度和纬度。

现在,根据设备的方向,我会在设备的相机视图中为每个站点显示一个标记。 类似于Layar和Wikitude。

需要三天的时间不停地search,没有find任何人解释如何解决这个问题。

Related of "通过特定的位置和经度获取屏幕坐标(android)"

由于关于这个主题的信息非常稀less,而且我最近在iPhone上解决了这个问题,所以我想我会分享我的方法给任何能够使它与Android一起工作的人(除了math函数之外,在这个答案中没有任何特定的iPhone sin,cos和fmod,可以在java.lang.Math中find)。 这些是我采取的步骤:

  • 获得你自己的纬度/经度和你当前的指南针标题(lat1,lon1和heading)。 在iPhone上,CLLocation以度为单位返回这些值,但对于这些计算,它们必须是弧度(即乘以PI / 180)
  • 以弧度(lat2和lon2)获得兴趣点(POI)的纬度/经度。
  • 使用以下公式计算lat1 / lon1和lat2 / lon2之间的距离: http : //www.movable-type.co.uk/scripts/latlong.html
  • 计算相对于北纬lat2 / lon2的angular度。 这也是在上面的链接描述,但我有一点点麻烦得到这个工作,这里是C代码:

    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;

  • 使用标准三angular函数,我计算x和y。 请记住,这些坐标是在三维空间,所以我们还没有在这里完成,因为你仍然必须将它们映射到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因为我的项目没有必要,但是需要获取加速器数据并确定设备是否垂直于地面)。 投影公式在这里(滚动到最底部): http : //membres.multimania.fr/amycoders/tutorials/3dbasics.html

    double screenX = (x * 256) / z

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

  • 一切都必须以弧度表示
  • POI相对于您的angular度是angleBeteweenPoints – currentHeading

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