谷歌地图地图类型的背景颜色 GoogleMap.MAP_TYPE_NONE

问题描述 投票:1回答:1

我已经使用我的平面图的地面覆盖添加到谷歌地图。它完美地加载了。代码如下图所示。

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))
}

这将产生如下附件的用户界面。

enter image description here

我有2个问题。

  1. 我如何将背景颜色改为我选择的颜色?
  2. 我如何以编程方式放大和缩小?假设我想在地图加载后立即放大5F。
android google-maps android-mapview android-maps-utils
1个回答
1
投票

对于第1页,最简单的方法是使用附加的 "地图"。GroundOverlay 是由你的地面覆盖的背景色填充的纯色位图。确切地说,您的示例图片可以是这样的(overlay_background.png):

Background overlay

你应该用那张照片作为 "背景" GroundOverlay 放在你的 "地板 "下面 GroundOverlays.

为确保 "背景" GroundOverlay 覆盖整个可见区域,你应该在 "地板 "叠加上稍稍缩放该图像。您可以通过 .positionFromBounds() 方式 GroundOverlayOptions. 对于获取 "背景 "覆盖范围 radius 遥遥无期 center 你可以使用这样的方法。

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;
}

哪儿 SphericalUtil 属于 Maps SDK for Android Utility Library. 如何为所述项目添加它 此处.

还通过 setLatLngBoundsForCameraTarget() 方法,您可以设置相机视图边界略小于 "背景 "覆盖区域,以避免用户滚动地图超出 "背景 "覆盖边界的情况。您需要设置最小和最大的缩放级别(通过以下方法)。setMinZoomPreference()setMaxZoomPreference())也。

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

Idea description

为了放置 "背景" GroundOverlay 在你的 "地板 "下面 GroundOverlay您可以使用 .setZIndex() 方式 GroundOverlayOptionsGroundOverlay 并将Z-Index设置为 "背景"。GroundOverlay 小于 "楼层 "的Z指数 GroundOverlay 例如 Z-Index = 1 对于 "背景 "和 Z-Index = 2 楼层叠加(Z-Index的默认值是 0).

所以像这样的源码。

@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));
}

你可以得到这样的结果

Overlay background result

对于第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);

或者你也可以用以下方法从地图上删除不需要的楼层覆盖 remove() 办法 GroundOverlay (不在 GroundOverlayOptions!)对象,并在需要时重新创建它。为此,您需要在地图上添加楼层覆盖对象时存储它。

GroundOverlay floor1Overlay = mGoogleMap.addGroundOverlay(floor1OverlayOptions);
...
floor1Overlay.remove();
© www.soinside.com 2019 - 2024. All rights reserved.