地图类型 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
放置在您的“地板”GroundOverlay
s 下。
为确保“背景”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()
)。
所以大致思路如下图所示:
要在“地板”GroundOverlay
s 下放置“背景”GroundOverlay
,您可以使用GroundOverlayOptions
或GroundOverlay
的.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 但未定义传递 - 谷歌地图
使用链接地图/传递映射/链式地图的 AutoMapper 地图