Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google Maps Android API实用程序群集管理器在创建群集之前是否具有最少数量的标记?_Android_Google Maps Android Api 2 - Fatal编程技术网

Google Maps Android API实用程序群集管理器在创建群集之前是否具有最少数量的标记?

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/

我正在使用谷歌地图Android API实用程序库在我的应用程序中启用群集。当五个或更多标记位于同一位置时,将创建一个簇:

四个或四个以下类似位置的标记不会创建群集:

这是出于设计还是我做错了什么,因为我的地图上有2个、3个或4个明显重叠的标记,但不会形成一个簇

演示问题的代码如下:

地图布局:

<?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 Dudka
McClusterManager=new ClusterManager(这个,mMap)如果我注释掉
mClusterManger=new…
,地图会显示出来,你能帮忙吗?我的问题链接@PavelDudka是否有任何方法覆盖群集地图的默认标记?因为我想将数据库中的图像设置为marker@20Cents绝对地如果扩展DefaultClusterRenderer,则可以覆盖
onBeforeClusterItemRendered
(对于单个项目)和
onBeforeClusterRendered
(对于群集)。每个函数都将
标记选项
作为参数接收。您可以通过
MarkerOptions\icon()
将自定义图标设置为这些选项DefaultClusterRenderer提供了一个方法setMinClusterSize()。在
mClusterManager=newclustermanager(这是mMap)之后只需调用
mClusterManager.setMinClusterSize(2)
。这将做同样的工作,而不需要在类中添加函数