8

Sto utilizzando l'Utilità di cluster di Marker di Google Maps Android da here e sto aggiungendo un gruppo di elementi (circa 700) da un elenco che ricevo dal mio server. Ho appianato i miei bug iniziali e riesco a vedere i cluster, quindi a ingrandirli e vederli declinare in singoli marker. Tuttavia, ci sono un paio di elementi che sono distanti da tutti gli altri, in modo che anche alla massima riduzione, non sarebbero mai raggruppati. Per qualche motivo, questi elementi non vengono visualizzati sulla mia mappa - non quando eseguo lo zoom in avanti, non quando faccio lo zoom indietro.Mappe Android ClusteredMarkers - non mostrare non in elenco?

Ho controllato le coordinate, sono reali, e prima di iniziare a utilizzare il clustering ho potuto vedere questi elementi senza problemi, quindi presumo di aver fatto qualcosa di sbagliato nel mio codice di clustering.

Ecco il codice:

private void setUpClusterer() { 
    // Initialize the manager with the context and the map 
    mClusterManager = new ClusterManager<>(getActivity(), map); 
    vendorRenderer = new VendorRenderer(); 
    mClusterManager.setRenderer(vendorRenderer); 
    mClusterManager.setOnClusterClickListener(this); 
    mClusterManager.setOnClusterItemClickListener(this); 
    //point the maps listeners at the listeners implemented by the cluster manager 
    map.setOnCameraChangeListener(mClusterManager); 
    map.setOnMarkerClickListener(mClusterManager); 

    //add items to the cluster manager 
    addClusterItems(-1); 
    mClusterManager.cluster(); 
} 

private void addClusterItems(int positionToMark) { 
    if (null == list) { 
     return; 
    } 
    LatLng position; 
    int maxMarkers = Math.min(list.size(), getResources().getInteger(R.integer.number_of_results_on_map)); 

    mClusterManager.clearItems(); 

    for (int i = 0; i < maxMarkers; i++) { 

     vendorItem = list.get(i); 

     if (vendorItem.getAddress().contains("Remote 1")) { 
      Log.e("Kibi", "Adding Remote 1, pos = " + i); 
      Log.e("Kibi", "Coordinates =" + vendorItem.getPointCoordinates().toString()); 
     } 
     if (vendorItem.getAddress().contains("Clustered 1")) { 
      Log.e("Kibi", "Adding Clustered 1, pos = " + i); 
      Log.e("Kibi", "Coordinates =" + vendorItem.getPointCoordinates().toString()); 
     } 
     if (vendorItem.getAddress().contains("Remote 2")) { 
      Log.e("Kibi", "Adding Remote 2, pos = " + i); 
      Log.e("Kibi", "Coordinates =" + vendorItem.getPointCoordinates().toString()); 
     } 
     VendorMapItem item = new VendorMapItem(vendorItem.getPointCoordinates(), 
       "Some other text"); 
     if (i == positionToMark) { 
      selectedItem = item; 
     } 

     mClusterManager.addItem(item); 
    } 
    if (-1 == positionToMark) { 
     selectedItem = null; 
    } 
} 

Questo dimostra le voci sempre aggiunti - I registri ho aggiunto aiutarmi a vedere che i miei 2 oggetti remoti vengono aggiunti con buone coordinate, e sono simili (anche se lontano da) mio articolo cluster selezionato (che si vede)

Ecco il codice di rendering:

/* This draws the markers for us */ 
private class VendorRenderer extends DefaultClusterRenderer<VendorMapItem> { 
    Context context = getActivity().getApplicationContext(); 
    public final IconGenerator mIconGenerator = new IconGenerator(context); 
    public final IconGenerator mSelectedIconGenerator = new IconGenerator(context); 
    private final View mItemView; 
    private final View mSelectedItemView; 

    public VendorRenderer() { 
     super(getActivity().getApplicationContext(), map, mClusterManager); 

     // Create selected custom Marker 
     RelativeLayout selectedContainer = (RelativeLayout) view.findViewById(R.id.marker_map_selected_container); 
     mSelectedItemView = ((LayoutInflater) getActivity().getSystemService 
       (Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.map_marker_selected_layout, selectedContainer, false); 
     mSelectedIconGenerator.setContentView(mSelectedItemView); 
     mSelectedIconGenerator.setBackground(null); 

     // Create custom Marker 
     LinearLayout container = (LinearLayout) view.findViewById(R.id.text_marker_map_container); 
     mItemView = ((LayoutInflater) getActivity().getSystemService 
       (Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.map_marker_layout, container, true); 

     mIconGenerator.setContentView(mItemView); 
     mIconGenerator.setBackground(null); 
    } 

    @Override 
    protected void onBeforeClusterItemRendered(VendorMapItem vendor, MarkerOptions markerOptions) { 
     // Draw a single vendor. 
     Bitmap icon; 
     if (null == selectedItem || !vendor.getPosition().equals(selectedItem.getPosition())) 
     { 
      icon = mIconGenerator.makeIcon(); 
     } else { 
      icon = mSelectedIconGenerator.makeIcon(); 
     } 
     markerOptions.title(vendor.getTitle()); 
     markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)); 
    } 

    @Override 
    protected void onBeforeClusterRendered(Cluster<VendorMapItem> cluster, MarkerOptions markerOptions) { 
     // Draw multiple vendors clustered... 
     Bitmap icon = mIconGenerator.makeIcon(); 
     markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)); 
    } 

    @Override 
    protected boolean shouldRenderAsCluster(Cluster cluster) { 
     // Always render clusters. 
     return cluster.getSize() > 1; 
    } 
} 

In generale gli elementi cluster sono mostrati, e quelle anche declustered, se sel ect o non Ho un'altra vista che mostra tutti i dati di posizione in un elenco e le mie posizioni remote mostrano solo pinne lì.

Qualche idea su cosa sto facendo male?

risposta

1

stupidità.

Fondamentalmente stavo chiamando map.clear() troppe volte. Immagino che non sia necessario chiamare chiaro se tutto ciò che è disegnato sulla mappa sono i pin che sono controllati dal clusterer. Una volta rimosse le chiamate clear(), i miei pin vengono visualizzati di nuovo.

0

public class ClusterIconProvider implementa IconDataProvider {

private static final int[] res = {R.drawable.m1,R.drawable.m2,R.drawable.m3,R.drawable.m4,R.drawable.m5}; 
private static final int[] forCounts = { 10, 100, 1000, 10000, Integer.MAX_VALUE }; 
private Bitmap[] baseBitmaps; 
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
private Rect bounds = new Rect(); 
private MarkerOptions markerOptions = new MarkerOptions().anchor(0.5f, 0.5f); 


public ClusterIconProvider(Resources resources){ 
    baseBitmaps = new Bitmap[res.length]; 
    for (int i = 0; i < res.length; i++) { 
     baseBitmaps[i] = BitmapFactory.decodeResource(resources, res[i]); 
    } 
    paint.setColor(Color.WHITE); 
    paint.setTextAlign(Align.CENTER); 
    paint.setTextSize(resources.getDimension(R.dimen.Cluster)); 
} 
@Override 
public MarkerOptions getIconData(int markersCount) { 
    // TODO Auto-generated method stub 
    Bitmap base; 
    int i = 0; 
    do { 
     base = baseBitmaps[i]; 
    } while (markersCount >= forCounts[i++]); 
    Bitmap bitmap = base.copy(Config.ARGB_8888, true);  
    String text = String.valueOf(markersCount); 
    paint.getTextBounds(text, 0, text.length(), bounds); 
    float x = bitmap.getWidth()/2.0f; 
    float y = (bitmap.getHeight() - bounds.height())/2.0f - bounds.top; 
    Canvas canvas = new Canvas(bitmap); 
    canvas.drawText(text, x, y, paint); 
    BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(bitmap); 
    return markerOptions.icon(icon); 
} 

}

+0

È possibile utilizzare per aggiungere il cluster sulla mappa –

+0

Grazie a @Pratik, ma esiste già un meccanismo per i cluster nella sorgente che sto utilizzando. Semplicemente non disegna i singoli elementi NON in cluster quando non vengono mai raggruppati e non riesco a capire perché. – Kibi