Google Maps Android API实用程序群集管理器在创建群集之前是否具有最少数量的标记?
我正在使用谷歌地图Android API实用程序库在我的应用程序中启用群集。当五个或更多标记位于同一位置时,将创建一个簇: 四个或四个以下类似位置的标记不会创建群集: 这是出于设计还是我做错了什么,因为我的地图上有2个、3个或4个明显重叠的标记,但不会形成一个簇 演示问题的代码如下: 地图布局:Google Maps Android API实用程序群集管理器在创建群集之前是否具有最少数量的标记?,android,google-maps-android-api-2,Android,Google Maps Android Api 2,我正在使用谷歌地图Android API实用程序库在我的应用程序中启用群集。当五个或更多标记位于同一位置时,将创建一个簇: 四个或四个以下类似位置的标记不会创建群集: 这是出于设计还是我做错了什么,因为我的地图上有2个、3个或4个明显重叠的标记,但不会形成一个簇 演示问题的代码如下: 地图布局: <?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment"/>
活动:
package com.example.android.clusteringminima;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.maps.android.clustering.ClusterItem;
import com.google.maps.android.clustering.ClusterManager;
public class ClusteringMinimaTest extends FragmentActivity {
private GoogleMap mMap;
private ClusterManager<Place> mClusterManager;
public class Place implements ClusterItem {
private final LatLng mPosition;
public Place(double lat, double lng) {
mPosition = new LatLng(lat, lng);
}
@Override
public LatLng getPosition() {
return mPosition;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map);
setUpMapIfNeeded();
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
if (mMap != null) {
return;
}
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
if (mMap != null) {
mClusterManager = new ClusterManager<Place>(this, mMap);
mMap.setOnCameraChangeListener(mClusterManager);
// Cluster of 4 or 5
mClusterManager.addItem(new Place(51.471524, -0.454280));
mClusterManager.addItem(new Place(51.471311, -0.452257));
mClusterManager.addItem(new Place(51.471510, -0.453514));
mClusterManager.addItem(new Place(51.471710, -0.453714));
// Remove this item to create a group of four
mClusterManager.addItem(new Place(51.471810, -0.453714));
// Cluster of 9 (depending on zoom level)
mClusterManager.addItem(new Place(51.517399, -0.177480));
mClusterManager.addItem(new Place(51.509899, -0.134180));
mClusterManager.addItem(new Place(51.495708, -0.144370));
mClusterManager.addItem(new Place(51.496112, -0.144162));
mClusterManager.addItem(new Place(51.512458, -0.118644));
mClusterManager.addItem(new Place(51.518600, -0.081300));
mClusterManager.addItem(new Place(51.530449, -0.125480));
mClusterManager.addItem(new Place(51.513008, -0.088430));
mClusterManager.addItem(new Place(51.505001, -0.086000));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.5, -0.35), 9));
}
}
}
package com.example.android.clusteringminima;
导入android.os.Bundle;
导入android.support.v4.app.FragmentActivity;
导入com.google.android.gms.maps.CameraUpdateFactory;
导入com.google.android.gms.maps.GoogleMap;
导入com.google.android.gms.maps.SupportMapFragment;
导入com.google.android.gms.maps.model.LatLng;
导入com.google.maps.android.clustering.ClusterItem;
导入com.google.maps.android.clustering.ClusterManager;
公共类clusteringMinimateTest扩展了碎片活动{
私有谷歌地图;
私人群集管理器McClusterManager;
公共课堂场所实行集群制{
私人最终分配;
公共场所(双lat、双lng){
mPosition=新板条箱(板条箱,lng);
}
@凌驾
公共位置(){
回输;
}
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.map);
setupmapifneed();
}
@凌驾
受保护的void onResume(){
super.onResume();
setupmapifneed();
}
私有void setUpMapIfNeeded(){
如果(mMap!=null){
返回;
}
mMap=((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
如果(mMap!=null){
mClusterManager=newclustermanager(这个,mMap);
mMap.SetonCamerachenglistener(McClusterManager);
//4或5组
mClusterManager.addItem(新地址(51.471524,-0.454280));
mClusterManager.addItem(新位置(51.471311,-0.452257));
mClusterManager.addItem(新位置(51.471510,-0.453514));
mClusterManager.addItem(新地址(51.471710,-0.453714));
//删除此项以创建一个四人组
mClusterManager.addItem(新地址(51.471810,-0.453714));
//9组(取决于缩放级别)
mClusterManager.addItem(新地址(51.517399,-0.177480));
mClusterManager.addItem(新地址(51.509899,-0.134180));
mClusterManager.addItem(新地址(51.495708,-0.144370));
mClusterManager.addItem(新地址(51.496112,-0.144162));
mClusterManager.addItem(新地址(51.512458,-0.118644));
mClusterManager.addItem(新地址(51.518600,-0.081300));
mClusterManager.addItem(新地址(51.530449,-0.125480));
mClusterManager.addItem(新地址(51.513008,-0.088430));
mClusterManager.addItem(新地址(51.505001,-0.086000));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(新LatLng(51.5,-0.35),9));
}
}
}
更新(原始答案发布3年后:D)
正如@schaenk所指出的,现在有了setMinClusterSize(int)
方法,它做同样的事情
原始答案
负责对项目进行聚类/不聚类决策的类是。若你们看一下这个方法,你们会发现它只在集群的大小为>MIN\u cluster\u size
时才开始集群。在我们的例子中,MIN\u CLUSTER\u SIZE=4
不幸的是,您无法动态更改此常量,因此需要扩展DefaultClusterRenderer
类并重写shoulderrenderascluster()
方法以提供您自己的逻辑:
class CustomRenderer<T extends ClusterItem> extends DefaultClusterRenderer<T>
{
public CustomRenderer(Context context, GoogleMap map, ClusterManager<T> clusterManager) {
super(context, map, clusterManager);
}
@Override
protected boolean shouldRenderAsCluster(Cluster<T> cluster) {
//start clustering if at least 2 items overlap
return cluster.getSize() > 1;
}
}
private void setUpMapIfNeeded() {
if (mMap != null) {
return;
}
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
if (mMap != null) {
mClusterManager = new ClusterManager<Place>(this, mMap);
mClusterManager.setRenderer(new CustomRenderer<Place>(this, mMap, mClusterManager));
........
}
}
class CustomRenderer扩展了DefaultClusterRenderer
{
公共CustomRenderer(上下文上下文、Google地图、ClusterManager ClusterManager){
超级(上下文、地图、群集管理器);
}
@凌驾
受保护的布尔值shouldRenderAsCluster(群集){
//如果至少有两个项目重叠,则启动群集
返回cluster.getSize()>1;
}
}
私有void setUpMapIfNeeded(){
如果(mMap!=null){
返回;
}
mMap=((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
如果(mMap!=null){
mClusterManager=newclustermanager(这个,mMap);
setRenderer(新的CustomRenderer(this,mMap,mClusterManager));
........
}
}
谢谢,帮了我很大的忙:)这是一个奇怪的默认设置,使同一点上的2-3个标记不会聚集…奇怪的选择。@Pavel DudkaMcClusterManager=new ClusterManager(这个,mMap)代码>如果我注释掉mClusterManger=new…
,地图会显示出来,你能帮忙吗?我的问题链接@PavelDudka是否有任何方法覆盖群集地图的默认标记?因为我想将数据库中的图像设置为marker@20Cents绝对地如果扩展DefaultClusterRenderer,则可以覆盖onBeforeClusterItemRendered
(对于单个项目)和onBeforeClusterRendered
(对于群集)。每个函数都将标记选项
作为参数接收。您可以通过MarkerOptions\icon()
将自定义图标设置为这些选项DefaultClusterRenderer提供了一个方法setMinClusterSize()。在mClusterManager=newclustermanager(这是mMap)之后代码>只需调用mClusterManager.setMinClusterSize(2)
。这将做同样的工作,而不需要在类中添加函数