我自己解决了这个问题。
我认为谷歌的文档不是很清楚。它指出可以使用两种可能的方法来定位 GroundOverlay:
有两种方法可以指定地面叠加层的位置:
使用 LatLng 使叠加层居中,并使用以米为单位的尺寸来指定图像的大小。
使用 LatLngBounds 指定图像的东北角和西南角。
您必须先指定地面叠加层的位置,然后才能将其添加到地图中。
我使用的是第二种方式,或者给它我想要应用的图像的两个地理角。不清楚的是,使用第二种方法不可能进行旋转,并且每个比例差异都会用倾斜的图像呈现。实际上我的想法是,给定平原上的两个点,我们只有一个图像可以在不分层的情况下适合这两个点,但是只是旋转,我很失望地发现这不起作用。
但是,如果你有足够的耐心通过你自己的大小以米为单位和旋转来计算你的图像,你可以确定一个角,或者图像的中心,并使用第一种方法,使用 LatLng 并明确指出一个锚点,例如 (0, 0) 表示左上角或 (0.5, 0.5) 表示中心,图片的高度(以米为单位)(这是找到它的好方法:How to convert latitude or longitude to meters?) ,用三角法求一个旋转,就是这样。
here 指出了一种以像素为单位查找图像大小的方法。
这是我的最终代码,以供记忆:
BitmapFactory.Options dimensions = new BitmapFactory.Options();
dimensions.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), imgRes, dimensions);
int imgHeightPixels = dimensions.outHeight;
GroundOverlayOptions goo = new GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(imgRes))
.position(imgBottomLeftCorner, imgHeightInPixels)
.anchor(0, 1)
.bearing(imgRotation);
mMap.addGroundOverlay(goo);
注意地图上的 Y 坐标自下而上增长,而图像上的 Y 坐标自上而下增长,因此锚点为 (0,1)。
给定两个向量,这是我为找到它们的角度所做的,因此是图像旋转(使用由图像上的两点坐标组成的向量与由相同的两点地理坐标组成的向量):
private static double calcDistance(double x1, double y1, double x2, double y2) {
return (Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)));
}
private static double calcVectorRotation(double x1, double y1, double x2, double y2) {
return Math.asin( (y1-y2) / calcDistance(x1, y1, x2, y2) );
}