8

Ich verwende Google Maps Android Marker Clustering Utility von und ich füge eine Menge von Elementen (etwa 700) aus einer Liste hinzu, die ich von meinem Server erhalte. Ich habe meine anfänglichen Fehler ausgebügelt, und ich kann die Cluster sehen, dann hineinzoomen und sehen, wie sie zu einzelnen Markern declustern. Es gibt jedoch ein paar Elemente, die von allen anderen entfernt sind, so dass sie selbst bei maximaler Verkleinerung niemals gruppiert werden würden. Aus irgendeinem Grund werden diese Objekte nicht auf meiner Karte angezeigt - nicht beim Einzoomen, nicht beim Zoomen.Android Maps ClusteredMarkers - nicht nicht gruppiert anzeigen?

Ich habe die Koordinaten überprüft, sie sind echt, und bevor ich anfing Clustering zu verwenden, konnte ich diese Elemente kein Problem sehen, also nehme ich an, dass ich in meinem Clustering-Code etwas falsch gemacht habe. Hier

ist ein Code:

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; 
    } 
} 

Dies zeigt die Elemente hinzugefügt zu werden - die Protokolle ich hinzugefügt haben, mir helfen sehen, dass meine 2 Remote-Elemente werden mit guten Koordinaten hinzugefügt, und sehen ähnlich aus (wenn auch weit entfernt von) meine ausgewählten gruppierten Artikel

hier (was gesehen wird) ist der Renderer Code:

/* 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; 
    } 
} 

Im allgemeinen gruppierten Elemente werden gezeigt, und auch declustered diejenigen, ob sel oder nicht. Ich habe eine andere Ansicht, die alle Standortdaten in einer Liste zeigt, und meine entfernten Standorte zeigen gerade Flossen dort.

Irgendwelche Ideen, was ich falsch mache?

Antwort

1

Dummheits.

Grundsätzlich habe ich map.clear() zu oft aufgerufen. Ich denke, es besteht keine Notwendigkeit, klar zu nennen, wenn alles, was auf der Karte gezeichnet ist, die Pins sind, die vom Clusterer gesteuert werden. Sobald die clear() -Aufrufe entfernt wurden, erscheinen meine Pins wieder.

0

public class ClusterIconProvider implementiert 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

Sie können für das Hinzufügen von Cluster auf Karte –

+0

Dank @Pratik verwenden, aber es gibt bereits einen Mechanismus für Cluster in der Quelle, die ich verwende. Es werden nur die NICHT-gruppierten Einzelelemente nicht gezeichnet, wenn sie nie gruppiert werden und ich kann nicht herausfinden warum. – Kibi