旋转摄像机时的屏幕位置

时间:2014-07-28 08:00:44

标签: android google-maps-android-api-2

我正在使用Google地图的Projection类来获取多边形中点的屏幕位置,目的是创建GroundOverlay并将自定义线条样式绘制为路径。问题是当相机旋转时,toScreenLocation方法返回不正确的结果。

GroundOverlayOptions overlayOptions = new GroundOverlay();
Projection projection = map.getProjection();
LatLngBounds screenBounds = projection.getVisibleRegion().latLngBounds;
imageWidth = projection.toScreenLocation(screenBounds.northeast).x;
imageHeight = projection.toScreenLocation(screenBounds.southwest).y; 
_overlayOptions.positionFromBounds(screenBounds);

Bitmap bmp = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
Paint paint = new Paint();
Path path = new Path();     

List<LatLng> points = polygon.getPoints();

Point startPos = projection.toScreenLocation(points.get(0));
path.moveTo(startPos.x, startPos.y);

for (int i = 1; i < points.size(); i++) {

    Point nextPos = projection.toScreenLocation(points.get(i));         
    path.lineTo(nextPos.x, nextPos.y);

}

path.lineTo(startX, startY);        
canvas.drawPath(path, paint);

BitmapDescriptor bmpDesc = BitmapDescriptorFactory.fromBitmap(bmp); 
overlayOptions.image(bmpDesc);
map.addGroundOverlay(overlayOptions);

下图说明了问题。当地图朝北时,蓝色虚线会显示它应该到达的位置,但是当轴承更改时,toScreenLocation的结果会给出扭曲的坐标。

enter image description here enter image description here

我试图在位图上应用矩阵旋转变换

Matrix rotationMatrix = new Matrix();
rotationMatrix.postRotate(map.getCameraPosition().bearing, imageWidth / 2, imageHeight / 2);

我也尝试使用三角法来旋转点。这两种方法都没有成功。

所以我的问题是你如何获得独立于相机方向的LatLng的屏幕位置?

1 个答案:

答案 0 :(得分:0)

我认为屏幕位置是正确的。但是你不要使用它们直接绘制到屏幕上,而是使用位图,默认情况下是朝北的。当您将此位图应用为GroundOverlay时,它会与地图一起旋转,因此位置不再适合。

另见文档:

  

轴承

     

图像应以顺时针方向旋转的量。旋转的中心将是图像的锚点。这是可选的,默认方位为0,即图像对齐,使得向上为北。

我不确定,但我认为你必须使用地图的当前旋转作为GroundOverlay的负面方位来补偿效果。而且我也不确定,地图的倾斜如何可以或必须得到补偿。我会尝试。锚点应该很可能是图像的中心。

但无论如何,我认为重要的是要意识到屏幕位置并没有真正错误。它们只有真正的屏幕作为参考系统,它与旋转后的位图系统不同。