我正在使用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的结果会给出扭曲的坐标。
我试图在位图上应用矩阵旋转变换
Matrix rotationMatrix = new Matrix();
rotationMatrix.postRotate(map.getCameraPosition().bearing, imageWidth / 2, imageHeight / 2);
我也尝试使用三角法来旋转点。这两种方法都没有成功。
所以我的问题是你如何获得独立于相机方向的LatLng的屏幕位置?
答案 0 :(得分:0)
我认为屏幕位置是正确的。但是你不要使用它们直接绘制到屏幕上,而是使用位图,默认情况下是朝北的。当您将此位图应用为GroundOverlay时,它会与地图一起旋转,因此位置不再适合。
另见文档:
轴承
图像应以顺时针方向旋转的量。旋转的中心将是图像的锚点。这是可选的,默认方位为0,即图像对齐,使得向上为北。
我不确定,但我认为你必须使用地图的当前旋转作为GroundOverlay的负面方位来补偿效果。而且我也不确定,地图的倾斜如何可以或必须得到补偿。我会尝试。锚点应该很可能是图像的中心。
但无论如何,我认为重要的是要意识到屏幕位置并没有真正错误。它们只有真正的屏幕作为参考系统,它与旋转后的位图系统不同。