Получить координаты экрана по конкретному местоположению и долготе (Android) - PullRequest
8 голосов
/ 15 марта 2011

У меня есть приложение дополненной реальности, в котором я хранил информацию, такую ​​как метро, ​​бензоколонки, достопримечательности и т. Д. С соответствующей широтой и долготой.

Теперь, в соответствии с ориентацией устройства, я бы показывал маркер для каждого сайта на виде с камеры устройства. Похож на Layar и Wikitude.

Поиск занимает три дня без остановки, и никто не нашел объяснения, как решить эту проблему.

1 Ответ

7 голосов
/ 08 апреля 2011

Поскольку информация по этой теме очень скудна, и я недавно решил эту проблему на iPhone, я подумал, что поделюсь своим методом для всех, кто может заставить его работать с Android (в этом ответе нет ничего особенного для iPhone, кромематематические функции sin, cos и fmod, которые можно найти в java.lang.Math).Вот шаги, которые я предпринял:

  • Получите свой широту и долготу и свой текущий курс по компасу (широта, долгота и курс).На iPhone CLLocation возвращает их в градусах, но для этих вычислений они ДОЛЖНЫ выражаться в радианах (т. Е. Умножить на PI / 180)
  • Получить лат / лон точек интереса (POI)в радианах (lat2 и lon2).
  • Рассчитайте расстояние между lat1 / lon1 и lat2 / lon2, используя формулу, найденную здесь: http://www.movable -type.co.uk / scripts / latlong.html
  • Рассчитать угол наклона широты / долготы2 относительно севера.Это также описано в приведенной выше ссылке, но у меня возникли небольшие проблемы с тем, чтобы заставить это работать, вот код 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 yetdouble 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 radiansangleDeg = angle * 180/PI;

  • Используя стандартную тригонометрию, я вычисляю 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 относительно севера равен angleBeteweenPoints - currentHeading

(Дляпо какой-то причине я не могу правильно отформатировать код на этом компьютере, поэтому, если кто-то захочет отредактировать этот ответ, не стесняйтесь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...