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

Posted

技术标签:

【中文标题】地图类型 GoogleMap.MAP_TYPE_NONE 的 Google 地图背景颜色【英文标题】:Google map Background color for Map type GoogleMap.MAP_TYPE_NONE 【发布时间】:2020-09-15 05:57:01 【问题描述】:

我已将我的平面图的地面叠加层添加到 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。

我有两个问题:

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

【问题讨论】:

【参考方案1】:

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

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

为确保“背景”GroundOverlay 覆盖整个可见区域,您应该在“地板”叠加层上稍微缩放该图像。您可以通过GroundOverlayOptions.positionFromBounds() 方法来完成。要获得远离center 的“背景”覆盖边界radius,您可以使用这样的方法:

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 的一部分。如何为here描述的项目添加它。

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

所以大致思路如下图所示:

要在“地板”GroundOverlays 下放置“背景”GroundOverlay,您可以使用GroundOverlayOptionsGroundOverlay.setZIndex() 方法,并将“背景”GroundOverlay 的 Z-Index 设置为小于 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));

你可以得到这样的结果:

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

【讨论】:

感谢这么详细的解释 我还有一个我正在努力解决的问题。可以的话请你看一下。 ***.com/questions/62255292/…

以上是关于地图类型 GoogleMap.MAP_TYPE_NONE 的 Google 地图背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

地图:预期元素类型的 mapDiv 但未定义传递 - 谷歌地图

如何使用地形地图类型设置基于云的谷歌地图样式?

百度地图API详解之自定义地图类型

使用链接地图/传递映射/链式地图的 AutoMapper 地图

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

红色警戒2怎样自建地图?