Направление между двумя GeoPoints на карте Google в Android - PullRequest
1 голос
/ 25 июня 2011

Я разрабатываю приложение для Android, у меня есть две GeoPoints на карте Google. Один GeoPoint является исправлением, а другой GeoPoint - мое текущее местоположение.На моем текущем местоположении я размещаю точку стрелки в направлении фиксированной GeoPoint, так как мое текущее местоположение меняется, и стрелка меняет свое направление. Это работает нормально, но в большинстве случаев показывает неправильное направление.

Вот мойкод.

            Paint paint = new Paint();
        GeoPoint gp1;
        GeoPoint gp2;
        Point point1,point2;
        Projection projection = mapView.getProjection();
        projection.toPixels(gp1, point1);
        projection.toPixels(gp2, point2);
        Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.arrow);
        double dlon = gp2.getLongitudeE6() - gp1.getLongitudeE6();
        double dlat = gp2.getLatitudeE6() - gp1.getLatitudeE6();
        double a = (Math.sin(dlat / 2) * Math.sin(dlat / 2)) + Math.cos(gp1.getLatitudeE6()) * Math.cos(gp2.getLatitudeE6()) * (Math.sin(dlon / 2) * Math.sin(dlon / 2));
        double angle = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        Matrix matrix = new Matrix();
        matrix.postTranslate(-25, -25);
        matrix.postRotate(convertToRadians(angle));
        matrix.postTranslate(point1.x, point1.y);       
        paint.setAntiAlias(true);
        paint.setFilterBitmap(true);
        canvas.drawBitmap(bmp, matrix, paint);

Жду вашей помощи и заранее спасибо.

Альтаф

Ответы [ 2 ]

1 голос
/ 17 октября 2011

Используйте точки проекции для расчета угла вместо точек геолокации, потому что ваша стрелка будет показывать направление проецируемых точек.

Заменить

double dlon = gp2.getLongitudeE6() - gp1.getLongitudeE6();
double dlat = gp2.getLatitudeE6() - gp1.getLatitudeE6();

с

double dlon = point2.x - point1.x;
double dlat = point2.y - point1.y;

Для расчета угла формула, предложенная Geobits, проще и лучше.

double angle = Math.atan2(dlat, dlon);

Я тщательно протестировал этот код, и он работает для всех случаев в моем приложении.

0 голосов
/ 25 июня 2011

Где вы взяли эту формулу? Это кажется невероятно сложным для простого вычисления угла. Обычно я просто использую atan2 с y, x:

double angle = Math.atan2(dlat, dlon); // in radians

Предполагается, что ваша стрелка по умолчанию указывает вдоль горизонтальной оси (на восток). Возможно, вам придется настроить его в любом направлении, на которое указывает нарисованная стрелка. Например, если он направлен на 90 градусов, просто поверните его на дополнительные 0.5 * PI rads, чтобы выровнять его.

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