我在谷歌地图上有10个标记。我想要尽可能放大,并保持所有标记都在视野中?在早期版本中,这可以从zoomToSpan()实现,但在v2中,我不知道如何做到这一点。此外,我知道需要可见的圆的半径。
当前回答
我有另一种方法来做同样的事情,效果很好。为了在屏幕上显示所有标记,我们需要一个中长和缩放级别。这里是一个函数,它会给你两个,需要所有标记的Latlng对象作为输入。
public Pair<LatLng, Integer> getCenterWithZoomLevel(LatLng... l) {
float max = 0;
if (l == null || l.length == 0) {
return null;
}
LatLngBounds.Builder b = new LatLngBounds.Builder();
for (int count = 0; count < l.length; count++) {
if (l[count] == null) {
continue;
}
b.include(l[count]);
}
LatLng center = b.build().getCenter();
float distance = 0;
for (int count = 0; count < l.length; count++) {
if (l[count] == null) {
continue;
}
distance = distance(center, l[count]);
if (distance > max) {
max = distance;
}
}
double scale = max / 1000;
int zoom = ((int) (16 - Math.log(scale) / Math.log(2)));
return new Pair<LatLng, Integer>(center, zoom);
}
这个函数返回Pair对象,你可以像这样使用它
getCenterWithZoomLevel(l1,l2,l3..); mGoogleMap.moveCamera (CameraUpdateFactory.newLatLngZoom(一对。首先,pair.second));
你可以不用填充来让标记远离屏幕边界,你可以通过-1来调整缩放。
其他回答
我用一个片段在Kotlin中显示多个标记,解决了同样的问题
首先声明一个标记列表
private lateinit var markers: MutableList<Marker>
在分支的oncreate方法中初始化它
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
//initialize markers list
markers = mutableListOf()
return inflater.inflate(R.layout.fragment_driver_map, container, false)
}
在OnMapReadyCallback中将标记添加到标记列表中
private val callback = OnMapReadyCallback { googleMap ->
map = googleMap
markers.add(
map.addMarker(
MarkerOptions().position(riderLatLng)
.title("Driver")
.snippet("Driver")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))))
markers.add(
map.addMarker(
MarkerOptions().position(driverLatLng)
.title("Driver")
.snippet("Driver")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))))
仍然是回调
//create builder
val builder = LatLngBounds.builder()
//loop through the markers list
for (marker in markers) {
builder.include(marker.position)
}
//create a bound
val bounds = builder.build()
//set a 200 pixels padding from the edge of the screen
val cu = CameraUpdateFactory.newLatLngBounds(bounds,200)
//move and animate the camera
map.moveCamera(cu)
//animate camera by providing zoom and duration args, callBack set to null
map.animateCamera(CameraUpdateFactory.zoomTo(10f), 2000, null)
快乐的程序员们
对我来说很好。
从这段代码中,我在地图屏幕上显示特定缩放的多个标记。
//声明变量
private LatLngBounds bounds;
private LatLngBounds.Builder builder;
//添加多个标记点的方法
private void drawMarker(LatLng point, String text) {
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(point).title(text).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon));
mMap.addMarker(markerOptions);
builder.include(markerOptions.getPosition());
}
//用于在地图上添加多个可见标记
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
builder = new LatLngBounds.Builder();
for (int i = 0; i < locationList.size(); i++) {
drawMarker(new LatLng(Double.parseDouble(locationList.get(i).getLatitude()), Double.parseDouble(locationList.get(i).getLongitude())), locationList.get(i).getNo());
}
bounds = builder.build();
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, 0);
mMap.animateCamera(cu);
注意-这不是原始问题的解决方案。这是上面讨论的子问题之一的解决方案。
解决方案@andr澄清2 -
当边界中只有一个标记时,缩放级别被设置为非常高的级别(级别21),这真的很有问题。谷歌不提供任何设置最大缩放级别的方法。当有多个标记但它们彼此非常接近时,也会发生这种情况。同样的问题也会出现。
解决方案-假设你想让你的地图永远不超过16缩放级别。然后在做了
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
mMap.moveCamera(cu);
检查你的缩放级别是否超过了16级(或任何你想要的)
float currentZoom = mMap.getCameraPosition().zoom;
如果这个级别大于16,只有当标记非常少或所有标记彼此非常接近时才会出现这种情况,那么只需将缩放级别设置为16,就可以在特定位置缩小地图。
mMap.moveCamera(CameraUpdateFactory.zoomTo(16));
这样你就永远不会有“奇怪的”缩放级别的问题,@andr解释得很好。
我有另一种方法来做同样的事情,效果很好。为了在屏幕上显示所有标记,我们需要一个中长和缩放级别。这里是一个函数,它会给你两个,需要所有标记的Latlng对象作为输入。
public Pair<LatLng, Integer> getCenterWithZoomLevel(LatLng... l) {
float max = 0;
if (l == null || l.length == 0) {
return null;
}
LatLngBounds.Builder b = new LatLngBounds.Builder();
for (int count = 0; count < l.length; count++) {
if (l[count] == null) {
continue;
}
b.include(l[count]);
}
LatLng center = b.build().getCenter();
float distance = 0;
for (int count = 0; count < l.length; count++) {
if (l[count] == null) {
continue;
}
distance = distance(center, l[count]);
if (distance > max) {
max = distance;
}
}
double scale = max / 1000;
int zoom = ((int) (16 - Math.log(scale) / Math.log(2)));
return new Pair<LatLng, Integer>(center, zoom);
}
这个函数返回Pair对象,你可以像这样使用它
getCenterWithZoomLevel(l1,l2,l3..); mGoogleMap.moveCamera (CameraUpdateFactory.newLatLngZoom(一对。首先,pair.second));
你可以不用填充来让标记远离屏幕边界,你可以通过-1来调整缩放。
用谷歌地图显示所有标记
在这些方法中存储所有标记,并自动缩放显示谷歌地图中的所有标记。
// Declare the Markers List.
List<MarkerOptions> markerList;
private BitmapDescriptor vnrPoint,banPoint;
public void storeAllMarkers()
{
markerList=new ArrayList<>();
markerList.removeAll(markerList);
// latitude and longitude of Virudhunagar
double latitude1=9.587209;
double longitude1=77.951431;
vnrPoint=BitmapDescriptorFactory.fromResource(R.drawable.location_icon_1);
LatLng vnr = new LatLng(latitude1, longitude1);
MarkerOptions vnrMarker = new MarkerOptions();
vnrMarker.position(vnr);
vnrMarker.icon(vnrPoint);
markerList.add(vnrMarker);
// latitude and longitude of Bengaluru
double latitude2=12.972442;
double longitude2=77.580643;
banPoint=BitmapDescriptorFactory.fromResource(R.drawable.location_icon_2);
LatLng ban = new LatLng(latitude2, longitude2);
MarkerOptions bengalureMarker = new MarkerOptions();
bengalureMarker.position(ban);
bengalureMarker.icon(banPoint);
markerList.add(bengalureMarker);
// You can add any numbers of MarkerOptions like this.
showAllMarkers();
}
public void showAllMarkers()
{
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (MarkerOptions m : markerList) {
builder.include(m.getPosition());
}
LatLngBounds bounds = builder.build();
int width = getResources().getDisplayMetrics().widthPixels;
int height = getResources().getDisplayMetrics().heightPixels;
int padding = (int) (width * 0.30);
// Zoom and animate the google map to show all markers
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, width, height, padding);
googleMap.animateCamera(cu);
}
推荐文章
- 如何使梯度背景在android
- 列出一个Intent的所有附加项
- 我如何链接到谷歌地图与特定的经度和纬度?
- Android中使用的SQLite版本?
- 如何获得转轮价值?
- 在Wireshark上捕获手机流量
- 为开发设置设备(????????????)没有权限)
- 如何使用XML更改ActionBarActivity的ActionBar的背景颜色?
- 从Android模拟器访问localhost:端口
- Android应用程序中的“包”是什么
- 如何从代码中动态设置layout_weight属性?
- 更新列表后,滚动到列表的末尾
- Android Toast可以比Toast. length_long长吗?
- 如何从资源设置位图
- 是否有可能在线性布局的宽度上均匀分布按钮