1

我已将我的平面图的地面叠加层添加到 Google 地图中。它完美加载。代码如下所示。

override fun onMapReady(map: GoogleMap) {
    mMap = map;

    mMap.setOnGroundOverlayClickListener(this);
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(DEFAULT_LAT_LNG, 1F));
    mMap.setMapType(GoogleMap.MAP_TYPE_NONE);


    mGroundOverlay = mMap.addGroundOverlay(GroundOverlayOptions()
            .image(BitmapDescriptorFactory.fromBitmap(bitmap)).anchor(0F, 1F)
            .position(DEFAULT_LAT_LNG, floorPlanWidth.toFloat(), 
    floorPlanHeight.toFloat()));

    mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(mGroundOverlay.getBounds(), 0))
}

这将产生如下所附的 UI。

在此处输入图像描述

我在这里有两个问题:

  1. 如何将背景颜色更改为我选择的颜色?
  2. 如何以编程方式放大和缩小?假设我想在地图加载后立即放大 5F。
4

1 回答 1

1

对于 p.1,最简单的方法是使用附加GroundOverlay的纯色位图,由地面覆盖的背景颜色填充。正是您的示例图片可能是这样的(overlay_background.png):

背景叠加

您应该将那张图片用作GroundOverlay放置在“地板”下的“背景” GroundOverlay

为确保“背景”GroundOverlay覆盖整个可见区域,您应该在“地板”覆盖层上稍微缩放该图像。您可以通过.positionFromBounds(). 为了获得远离你的GroundOverlayOptions“背景”覆盖范围,你可以使用这样的方法:radiuscenter

public LatLngBounds createBounds(LatLng center, float radius) {
    LatLngBounds bounds = null;
    if (center != null) {
        bounds = new LatLngBounds.Builder()
                .include(SphericalUtil.computeOffset(center, radius * Math.sqrt(2), 45))
                .include(SphericalUtil.computeOffset(center, radius * Math.sqrt(2), 225))
                .build();
    }
    return bounds;
}

哪里SphericalUtilMaps SDK for Android Utility Library的一部分。如何为这里描述的项目添加它。

同样通过setLatLngBoundsForCameraTarget()方法,您可以将相机视图范围设置为略小于“背景”覆盖区域,以避免用户滚动地图超出“背景”覆盖范围时的情况。您还需要设置最小和最大缩放级别(通过setMinZoomPreference()setMaxZoomPreference())。

所以总体思路如下图所示:

想法描述

为了将“背景”放置GroundOverlay在“地板”下,GroundOverlay您可以使用or的.setZIndex()方法并将“背景”的Z-Index 设置为小于“地板”的 Z-Index,例如“背景”和地板覆盖(默认值 Z-索引是)。GroundOverlayOptionsGroundOverlayGroundOverlayGroundOverlayZ-Index = 1Z-Index = 20

所以使用这样的源代码:

@Override
public void onMapReady(GoogleMap googleMap) {
    mGoogleMap = googleMap;

    // calculate borders for "background" overlay
    LatLngBounds borders = createBounds(OVERLAY_CENTER, 1000);

    // constrain the camera target to slightly less bounds.
    LatLngBounds cameraBorders = createBounds(OVERLAY_CENTER, 500);
    mGoogleMap.setLatLngBoundsForCameraTarget(borders);
    mGoogleMap.setMinZoomPreference(18.0f);
    mGoogleMap.setMaxZoomPreference(21.0f);

    GroundOverlayOptions overlayBackground = new GroundOverlayOptions()
            .image(BitmapDescriptorFactory.fromResource(R.drawable.overlay_background))
            .transparency(0.0f)
            .bearing(0)
            .zIndex(1) // NB! set Z-Index for "background" overlay
            .positionFromBounds(borders);

    mGoogleMap.addGroundOverlay(overlayBackground);

    mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NONE);

    GroundOverlayOptions overlayOptions = new GroundOverlayOptions()
            .image(BitmapDescriptorFactory.fromResource(R.drawable.overlay))
            .transparency(0.0f)
            .bearing(0)
            .zIndex(2)  // NB! set Z-Index for "floor" overlay
            .position(OVERLAY_CENTER, 200f);

    GroundOverlay overlay = mGoogleMap.addGroundOverlay(overlayOptions);

    mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(OVERLAY_CENTER, 18.0f));
}

你可以得到这样的结果:

叠加背景结果

对于 p.2 问题恕我直言,最简单的方法是通过使用一组地板覆盖来“模拟”室内地图。在这种情况下,您可以通过在地图上添加相应的楼层叠加层来显示必要的楼层,并使用以下setTransparency()方法显示/隐藏它:use setTransparency(1)用于您要隐藏的所有楼层,以及setTransparency(0)需要显示的一层。例如,要显示楼层 #3 的叠加层:

GroundOverlay floor1Overlay = mGoogleMap.addGroundOverlay(floor1OverlayOptions);
GroundOverlay floor2Overlay = mGoogleMap.addGroundOverlay(floor2OverlayOptions);
GroundOverlay floor3Overlay = mGoogleMap.addGroundOverlay(floor2OverlayOptions);
...
floor1Overlay.setTransparency(1);
floor2Overlay.setTransparency(1);
floor3Overlay.setTransparency(0);

或者,您可以使用 on (不是!)对象上的remove()方法从地图中删除不必要的楼层覆盖,并在需要时重新创建它。为此,您需要在地图上添加地板覆盖对象时存储它:GroundOverlayGroundOverlayOptions

GroundOverlay floor1Overlay = mGoogleMap.addGroundOverlay(floor1OverlayOptions);
...
floor1Overlay.remove();
于 2020-06-03T10:52:58.453 回答