我已经使用我的平面图的地面覆盖添加到谷歌地图。它完美地加载了。代码如下图所示。
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))
}
这将产生如下附件的用户界面。
我有2个问题。
对于第1页,最简单的方法是使用附加的 "地图"。GroundOverlay
是由你的地面覆盖的背景色填充的纯色位图。确切地说,您的示例图片可以是这样的(overlay_background.png
):
你应该用那张照片作为 "背景" GroundOverlay
放在你的 "地板 "下面 GroundOverlay
s.
为确保 "背景" 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()
)也。
所以总体思路如下图所示。
为了放置 "背景" GroundOverlay
在你的 "地板 "下面 GroundOverlay
您可以使用 .setZIndex()
方式 GroundOverlayOptions
或 GroundOverlay
并将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));
}
你可以得到这样的结果
对于第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();