关于在地图上定位图像的方法,谷歌地图'文件说明:
当在地图上绘制图像时,它将被旋转以适合边界。如果边界与原始高宽比不匹配,图像将会歪斜。
但在我的代码中我有这个:
GroundOverlayOptions goo2 = new GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(imgRes))
.positionFromBounds(new LatLngBounds(
new LatLng(44.415, 8.937),
new LatLng(44.42, 8.942)
));
mMap.addGroundOverlay(goo2);
图像没有旋转,但总是直指向北,并且倾斜。更改叠加角只会偏斜更多,它永远不会旋转一点。
如何设置GMaps旋转它,还是存在任何外部工具来旋转它?
答案 0 :(得分:3)
我自己解决了这个问题。 我认为谷歌的文档不是很清楚。它声明可以使用两种可能的方法定位GroundOverlay:
指定地面叠加层的位置有两种方法: 使用LatLng将叠加层居中,并使用以米为单位的尺寸来指定图像的大小。 使用LatLngBounds指定图像的东北角和西南角。 在将地面叠加层添加到地图之前,必须指定地面叠加层的位置。
我正在使用第二种方式,或者给它想要应用的图像的两个地理角。不清楚的是,使用第二种方法无法旋转,并且每个的比例差异将使用倾斜的图像进行渲染。实际上我的想法就是这样,在一个平原上给出两个点,我们只有一个图像可以适应这两个点而没有划痕,但只是旋转,我很失望,发现它不起作用。
但是,如果您有足够的耐心通过自己的尺寸(以米为单位)和旋转来计算图像,则可以确定一个角或图像的中心,并使用第一种方法,使用LatLng并显式指示一个锚点,例如左上角的(0,0)或中心的(0.5,0.5),图片的高度(以米为单位)(这是找到它的好方法:{{3} }),通过使用三角函数找到一个旋转,就是这样。
以像素为单位查找图像大小的方法显示为How to convert latitude or longitude to meters?。
这是我的最终代码,对于记忆:
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坐标自下而上,而在图像上自上而下,所以锚点为(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) );
}
答案 1 :(得分:0)
正如您已经提到的并基于documentation,如果边界与原始宽高比不匹配,则图像将会偏斜。
您应该尝试使用android:adjustViewBounds
来保留宽高比。
如果希望ImageView调整其边界以保持其drawable的宽高比,请将此项设置为true。
请尝试在XML中添加以下内容:
android:adjustViewBounds="true"
android:scaleType="fitCenter"
您也可以在此SO post中尝试建议的代码实现。希望有所帮助!