对于 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;
}
哪里SphericalUtil是Maps 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();