【问题标题】:GroundOverlay image not rotatedGroundOverlay 图像未旋转
【发布时间】:2017-02-24 16:34:58
【问题描述】:

关于在地图上定位图像并给出其界限,谷歌地图的文档指出:

当图像在地图上绘制时,它将被旋转以适应边界。如果边界与原始纵横比不匹配,则图像将倾斜。

但在我的代码中我有这个:

    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 来旋转它,或者是否存在任何外部工具来旋转它?

【问题讨论】:

    标签: android google-maps


    【解决方案1】:

    我自己解决了这个问题。 我认为谷歌的文档不是很清楚。它指出可以使用两种可能的方法来定位 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) );
    }
    

    【讨论】:

      【解决方案2】:

      正如您已经提到并基于documentation,如果边界与原始纵横比不匹配,则图像将倾斜。

      您应该尝试使用android:adjustViewBounds 来保持纵横比。

      如果您希望 ImageView 调整其边界以保持其可绘制对象的纵横比,请将其设置为 true。

      请尝试将以下内容添加到您的 XML 中:

      android:adjustViewBounds="true"
      android:scaleType="fitCenter"
      

      您也可以尝试SO post 中建议的代码实现。希望对您有所帮助!

      【讨论】:

      • 真正的问题是使用该方法时不包括旋转,无论如何谢谢。
      猜你喜欢
      • 2016-12-23
      • 2019-03-27
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多