Поскольку информация по этой теме очень скудна, и я недавно решил эту проблему на 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 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.Помните, что эти координаты находятся в трехмерном пространстве, поэтому мы еще не закончили с этим, потому что вам все еще нужно сопоставить их с 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
(Дляпо какой-то причине я не могу правильно отформатировать код на этом компьютере, поэтому, если кто-то захочет отредактировать этот ответ, не стесняйтесь).