我正在开发一个Android应用程序,我在Google map中有两个GeoPoints。一个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);
等待你的帮助,并提前致谢。
阿尔塔夫
答案 0 :(得分:1)
使用投影点进行角度计算而不是地理定位点,因为您的箭头将显示投影点的方向。
替换
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);
我彻底测试了这段代码,它适用于我的应用程序中的所有情况。
答案 1 :(得分:0)
你从哪里得到那个公式?简单的角度计算似乎非常复杂。通常我只使用atan2和y,x:
double angle = Math.atan2(dlat, dlon); // in radians
这是假设您的箭头默认指向水平轴(正东方向)。您可能需要根据箭头绘制指向的任何方向进行调整。例如,如果它指向一个恒定的90度关闭,只需旋转一个额外的0.5 * PI rad来对齐它。