2

Я пытаюсь реализовать маркер кластера на своей карте, и он ведет себя немного странно, во-первых, он показывает мне маркер кластера, но также показывает мне маркеры точек, t, и когда я увеличиваю маркер кластера, показывая, я добавлю несколько изображений, чтобы лучше объяснить это.Кластер Маркер не скрывается при масштабировании

enter image description here

enter image description here

public class MapaViagem extends FragmentActivity { 

    private GoogleMap googleMap; 
    private String rm_IdViagem; 
    private List<ClienteModel> mClienteModel = new ArrayList<ClienteModel>(); 
    private List<EnderecoModel> mEnderecoModel = new ArrayList<EnderecoModel>(); 
    private ViagemModel mViagemModel = new ViagemModel(); 
    private ClusterManager<MyItem> mClusterManager; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     setContentView(R.layout.maps); 
     ArrayList<LatLng> coordList = new ArrayList<LatLng>(); 

     try { 

      Bundle parametros = getIntent().getExtras(); 
      rm_IdViagem = parametros.getString("id_viagem"); 

      Repositorio ca = new Repositorio(this); 
      mViagemModel = ca.getViagemPorId(Integer.valueOf(rm_IdViagem)); 

      Repositorio cl = new Repositorio(this); 
      mClienteModel = cl.getClientesViagem(Integer.valueOf(rm_IdViagem)); 


      System.out.println("TEM CLIENTE " + mClienteModel.size()); 

      if(mClienteModel != null) { 

       for (int i = 0; i < mClienteModel.size(); i++) { 


        Repositorio mRepositorio = new Repositorio(this); 
        mEnderecoModel = mRepositorio.getListaEnderecosDoCliente(Integer.valueOf(mClienteModel.get(i).getClientes_id())); 


        for (int j = 0; j < mEnderecoModel.size(); j++) { 
         // Loading map 
         initilizeMap(); 
         // Changing map type 
         googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 

         // Showing/hiding your current location 
         googleMap.setMyLocationEnabled(true); 

         // Enable/Disable zooming controls 
         googleMap.getUiSettings().setZoomControlsEnabled(true); 

         // Enable/Disable my location button 
         googleMap.getUiSettings().setMyLocationButtonEnabled(true); 

         // Enable/Disable Compass icon 
         googleMap.getUiSettings().setCompassEnabled(true); 

         // Enable/Disable Rotate gesture 
         googleMap.getUiSettings().setRotateGesturesEnabled(true); 

         // Enable/Disable zooming functionality 
         googleMap.getUiSettings().setZoomGesturesEnabled(true); 


         final float latitude = Float.parseFloat(mEnderecoModel.get(j).getLatitude()); 
         final float longitude = Float.parseFloat(mEnderecoModel.get(j).getLongitude()); 


         coordList.add(new LatLng(latitude, longitude)); 


         googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 10)); 



         mClusterManager = new ClusterManager<MyItem>(MapaViagem.this, googleMap); 


         mClusterManager.setRenderer(new MyClusterRenderer(MapaViagem.this, googleMap, mClusterManager)); 

         googleMap.setOnCameraChangeListener(mClusterManager); 
         googleMap.setOnMarkerClickListener(mClusterManager); 


         addItems(coordList); 

        } 


       } 
      } 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 


    public class MyClusterRenderer extends DefaultClusterRenderer<MyItem> { 

     public MyClusterRenderer(Context context, GoogleMap map, 
           ClusterManager<MyItem> clusterManager) { 
      super(context, map, clusterManager); 
     } 

     @Override 
     protected void onBeforeClusterItemRendered(MyItem item, MarkerOptions markerOptions) { 
      super.onBeforeClusterItemRendered(item, markerOptions); 



//   item.setTitle(mClienteModel.get(i)); 
      markerOptions.title(item.getTitle()); 
     } 

     @Override 
     protected void onClusterItemRendered(MyItem clusterItem, Marker marker) { 
      super.onClusterItemRendered(clusterItem, marker); 

      //here you have access to the marker itself 
     } 

@Override 
     protected boolean shouldRenderAsCluster(Cluster<MyItem> cluster) { 
      return cluster.getSize() > 3; // when count of markers is more than 3, render as cluster 
     } 
    } 


    private void addItems(List<LatLng> markers) { 

     for (int i = 0; i < markers.size(); i++) { 
      MyItem offsetItem = new MyItem(markers.get(i)); 
      mClusterManager.addItem(offsetItem); 

     } 
     mClusterManager.cluster(); 
    } 



    private void initilizeMap() { 
     if (googleMap == null) { 
      googleMap = ((MapFragment) getFragmentManager().findFragmentById(
        R.id.map)).getMap(); 

      // check if map is created successfully or not 
      if (googleMap == null) { 
       Toast.makeText(getApplicationContext(), 
         "Não foi possível carregar o mapa", Toast.LENGTH_SHORT) 
         .show(); 
      } 
     } 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     initilizeMap(); 
    } 


} 

Модель:

public class MyItem implements ClusterItem { 

    private LatLng mPosition; 
    private String title; 

    public MyItem(LatLng position){ 
     mPosition = position; 
    } 

    @Override 
    public LatLng getPosition() { 
     return mPosition; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 
} 
+0

.. вы нашли способ сделать это, даже если я столкнулся с той же проблемой, когда маркеры находятся в одном месте. Хотелось бы узнать, как вы это сделали. –

+0

@AshwinNarayanan Я просто перестаю использовать кластерные маркеры, я не мог этого решить, извините –

ответ

1

Во-первых, вам нужно определить, когда ваш ClusterManager должен clusterize, так что есть метод в MyClusterRenderer вы должны переопределить:

@Override 
protected boolean shouldRenderAsCluster(Cluster<MyItem> cluster) { 
    return cluster.getSize() > 3; // when count of markers is more than 3, render as cluster 
} 

Во-вторых, когда вы делаете некоторые изменения с помощью своих маркеров, таких как добавление, удаление, изменение названия, значка, местоположения, вы должны вызвать метод cluster(). Таким образом, ваш метод addItems должен выглядеть следующим образом:

private void addItems(List<LatLng> markers) { 

    for (int i = 0; i < markers.size(); i++) { 
     MyItem offsetItem = new MyItem(markers.get(i)); 
     mClusterManager.addItem(offsetItem); 
    } 
    mClusterManager.cluster(); 
} 

EDIT:

Я просто смотрю на ваш код более один раз, и обнаружили, что вы забыли установить алгоритм clusterizing, он должен быть:

... 
    mClusterManager = new ClusterManager<MyItem>(MapaViagem.this, googleMap); 
    mClusterManager.setAlgorithm(new GridBasedAlgorithm<MyItem>()); 

    mClusterManager.setRenderer(new MyClusterRenderer(MapaViagem.this, googleMap, mClusterManager)); 
    ... 
+0

Я внес изменения, которые вы предлагаете, но все же получаете те же результаты –

+0

Проверьте мои правки. – rom4ek

+1

теперь еще хуже, я получаю кластерный маркер со счетом 5, и это не в моих параметрах LatLng –

0

Я знаю, что это старый пост, но сегодня у меня была такая же проблема.

После того как вы потратили час, пытаясь решить, я наконец получил то, что случилось с моим приложением: Дело в том, что менеджер кластера работает правильно, проблема в том, что мой метод, который заполняет карту, вызывается дважды.

Чтобы решить эту проблему, просто добавьте mMap.clear(); перед добавлением маркеров. Здесь работает как шарм!

До свидания.

0

У меня была эта проблема и она была решена, убедившись, что ClusterManager был только создан и назначен один раз на карту, попробуйте поместить и если оператор в вашем методе создания. Скорее всего, когда вы снова инициализируете карту в onResume, которая вызывает проблему.

Смежные вопросы