Android 地图类型的谷歌地图背景色GoogleMap.map\u type\u无
我使用了添加到谷歌地图的我的平面图的地面覆盖图。它装得很好。代码如下所示Android 地图类型的谷歌地图背景色GoogleMap.map\u type\u无,android,google-maps,android-mapview,android-maps-utils,Android,Google Maps,Android Mapview,Android Maps Utils,我使用了添加到谷歌地图的我的平面图的地面覆盖图。它装得很好。代码如下所示 override fun onMapReady(map: GoogleMap) { mMap = map; mMap.setOnGroundOverlayClickListener(this); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(DEFAULT_LAT_LNG, 1F)); mMap.setMapType(GoogleMap
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))
}
这将产生如下所附的用户界面
我这里有两个问题:
对于p.1,最简单的方法是使用附加的
GroundOverlay
,它是由地面覆盖的背景色填充的纯色位图。您的示例图片可以是这样的(overlay\u background.png
):
您应该将该图片用作“背景”GroundOverlay
放置在您的“地板”GroundOverlay
s下方
为确保“背景”GroundOverlay
覆盖整个可见区域,应在“地板”覆盖层上稍微缩放该图像。您可以通过地面覆盖选项的方法执行此操作。要获取“背景”覆盖边界半径
距离中心的距离
,可以使用如下方法:
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
是的一部分。如何为描述的项目添加它
另外,通过该方法,您可以将相机视图边界设置为略小于“背景”覆盖区域,以避免用户将地图滚动出“背景”覆盖边界时出现的情况。您还需要设置最小和最大缩放级别(通过和)
因此,总体思路如下图所示:
要将“背景”GroundOverlay
放置在“地板”GroundOverlay
下,您可以使用or的.setZIndex()
方法,并将“背景”GroundOverlay
的Z索引设置为小于“地板”GroundOverlay
的Z索引,例如,“背景”的Z索引=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));
}
您可以得到这样的结果:
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;
}
对于p.2问题IMHO,最简单的方法是通过使用地板覆盖集“模拟”室内地图。在这种情况下,您可以通过向地图添加相应的地板覆盖来显示必要的地板,并使用以下方法显示/隐藏它:对所有要隐藏的地板使用使用setTransparency(1)
,对一个需要显示的地板使用设置透明度(0)
。例如,对于显示楼板#3的覆盖:
或者,您可以使用GroundOverlay
(而不是GroundOverlayOptions
!)对象上的方法从地图中删除不必要的楼层覆盖,并在需要时重新创建它。为此,您需要在地图上添加地板覆盖对象时存储该对象:
GroundOverlay floor1Overlay = mGoogleMap.addGroundOverlay(floor1OverlayOptions);
...
floor1Overlay.remove();
谢谢你这么详细的解释。我还有一个问题,我正在苦苦思索。如果可能的话,请你看一下好吗。