7
votes

Utilitaire Google Maps: Comment obtenir tous les marqueurs de ClusterManager ?

désolé pour mon anglais em>

J'ai essayé le ClusterManager > getMarkerCollection (). GetAmbers () Code> Méloply, mais il renvoie la collection vide. P>

J'utilise dans mon application bibliothèque de Google Maps Utility code>. Chaque fois qu'après une rotation de l'écran em> i crée asynktask code> et dans le fil d'arrière-plan lecture de données de db et ajoutez des éléments à ClusterManager Code>: P>

clusterManager.cluster();
// cluster manager returns empty collection  \|/
markers = clusterManager.getMarkerCollection().getMarkers(); 


3 commentaires

Avez-vous trouvé une solution à votre problème?


clustermanager.getClusterMarkerCollection (). Getobers (); renvoie des marqueurs uniquement si les marqueurs sont à un niveau de zoom afin que nous puissions les voir sur la carte


Étant donné que ClusterManager Méthode Cluster () crée et appelle clustermanager.clustertask () AsynccTask, votre essai d'obtenir les marqueurs juste après l'appel du cluster () est faux. Il semble que lorsque ClusterManager.CrusterTask ait terminé la méthode des appels IT CLUSTERSCHANGED () sur l'objet CLUSTERRENDERER.


6 Réponses :


1
votes

J'ai eu le même problème à obtenir tous les marqueurs ou au moins pour obtenir le nombre de marqueurs. Je pense que j'ai trouvé la solution pour obtenir les marqueurs.

J'ai essayé comme vous xxx

essayez plutôt xxx

Cette ligne m'a renvoyé des marqueurs mais je ne suis pas sûr que si c'est le résultat que vous / nous voulons. J'ai besoin de vérifier cela.

note J'écrirais ma réponse comme un commentaire mais je n'ai pas assez de point ..


2 commentaires

clustermanager.getClusterMarkerCollection (). Getobers (); renvoie des marqueurs uniquement si les marqueurs sont à un niveau de zoom afin que nous puissions les voir sur la carte


Oui, vous avez raison, je découvre que cela ne renvoie que les marqueurs qui apparaissent et non les marqueurs des clusters



4
votes

remplacer l'un d'entre eux:

OnBeforecLusterItemgrender

OnBeforecLusterRendue

OnClusterRenderedd

OnClusterItemRendered

Tout comme < Pré> xxx

cluster.getitems () retourne les marqueurs d'un cluster


0 commentaires

14
votes

Je vais vous donner une bonne solution. Tout d'abord, je vais donner des antécédents. Ensuite, je vous dirai la méthode très simple de modification de votre code.

Contexte: regardons d'abord la mise en œuvre de ClusterManager.Additem à partir du code de la bibliothèque: P>

Collection<ClusterItemImpl> items = clusterManagerAlgorithm.getItems();


2 commentaires

Grande solution! Vous avez une faute de frappe: devrait être 'clustermanagalgorithm = nouveau nonhierarchicaldistanceDistanceAngorithm' (vous manquez la première "N" en non hiérarchiqueDistanceAngorithme)


En disant simplement - la méthode de la setalgorithme d'origine enveloppe inévitablement votre algorithme avec une algorithme de mise en cache, ce qui peut être dans certains cas de difficulté car cet algorithme d'emballage obtient automatiquement des clusters également pour un niveau de zoom inférieur et supérieur, ce qui signifie une getClusters (zoom) appel = 3 appels. Ils sont enfilés, je sais, mais juste dire dans les mêmes cas, cela peut ne pas être recherché.



2
votes

@éthan solution fonctionne. Un autre hack doit utiliser l'API afin d'accéder au malgorithme (comme mention par eThan Malgorithm est l'endroit où votre élément est stocké) champ de ClusterManager Classe. XXX

REMARQUE: - À l'avenir S'il y a des modifications de nom de champ (c.-à-d. Algorithme privé Malgorithme ), Changement doit être effectué dans la logique d'entreprise .


1 commentaires

Cette solution était super pour moi



1
votes

La réponse de l'Ethan est belle mais vous ne pouvez toujours pas obtenir de marqueur avec elle. Vous devez créer ClusterRenderer personnalisé et l'utiliser pour obtenir marqueur ou clusteritem.

clusterRenderer.getMarker(clusterItem) // returns Marker object for selected cluster item 
clusterRenderer.getClusterItem(marker) // returns ClusterItem object for selected marker


1 commentaires

C'est de loin la seule chose qui fonctionne pour moi, mais cela ne renvoie pas tous les marqueurs. Néanmoins, une boucle simple ferait ce que OP veut. Acclamations



0
votes

Vous devriez essayer quelque chose comme ceci:

private MyItem mitemfilter;
renderer = new MyClusterManagerRender(this, googleMap, clusterManager);
clusterManager.setRenderer(renderer);

addItems();

    private void addItems() {
       clusterManager.addItem(mitemfilter=new  MyItem (19.641936, -99.132669, "food", "Villa Esmeralda, 54910 Fuentes del Valle, Méx.",R.drawable.ic_camaron));
        }

    private void foodfilter(){
    renderer.getMarker(mitemfilter).setVisible(false);
    
    }


0 commentaires