2013-10-31 11 views
14

Uso Google Maps in un'app ed è probabile che più indicatori siano associati alla stessa posizione in cui ogni indicatore rappresenta una persona. In questa situazione l'utente non saprà che ci sono altri marcatori/persone dietro questo particolare indicatore.Come gestire più marker su Google Maps con la stessa posizione?

Mi sono guardato intorno per gestire questa situazione e una domanda su SO suggerisce che posso visualizzare un singolo marcatore e associare tutte le persone con quel singolo marcatore. Quando l'utente tocca quell'indicatore, dovrei visualizzare un elenco di tutti gli utenti associati a quel marcatore. Questa è una buona soluzione, ma vorrei evitare di visualizzare una vista che per lo più nasconde Google Maps.

Qualcuno ha utilizzato soluzioni alternative in situazioni simili?

+0

Non è quello che stai cercando se non vuoi visualizzare una listview, è davvero la tua unica opzione – tyczj

+0

@tyczj Stai cercando qualsiasi altra soluzione alternativa se altri ti stanno utilizzando come visualizzare le icone dei marker leggermente inclinate a sinistra/destra per illustrare i marker multipli sullo stesso punto. O qualsiasi altro lavoro intorno ad altri potrebbe avere però. – Geek

+0

Ciao Voglio mostrare listview o espandere i marker che si trovano nella stessa posizione sulla mappa. C'è un modo per raggiungere questo obiettivo? Voglio implementarlo in questo modo: http://jawj.github.io/OverlappingMarkerSpiderfier/demo.html – AndiM

risposta

13

soluzione alternativa che ho usato è quello di visualizzare marcatori con stessa posizione poco un po 'a parte sulla mappa in modo che l'utente abbia una leggera idea di più marcatori.

Tengo traccia dei marcatori sulla mappa e le loro posizioni sulla mappa, e ogni volta che voglio aggiungere un indicatore sulla mappa mi assicuro che nessun altro marcatore sia visualizzato sulla stessa posizione. Se sì, aggiungo un offset alla posizione del nuovo marcatore che voglio aggiungere.

static final float COORDINATE_OFFSET = 0.00002f; // You can change this value according to your need 

Sotto il metodo restituisce la posizione che deve essere utilizzata per il nuovo marcatore. Questo metodo prende come parametri l'attuale latitudine e longitudine del nuovo marcatore.

// Check if any marker is displayed on given coordinate. If yes then decide 
// another appropriate coordinate to display this marker. It returns an 
// array with latitude(at index 0) and longitude(at index 1). 
private String[] coordinateForMarker(float latitude, float longitude) { 

    String[] location = new String[2]; 

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

     if (mapAlreadyHasMarkerForLocation((latitude + i 
       * COORDINATE_OFFSET) 
       + "," + (longitude + i * COORDINATE_OFFSET))) { 

      // If i = 0 then below if condition is same as upper one. Hence, no need to execute below if condition. 
      if (i == 0) 
       continue; 

      if (mapAlreadyHasMarkerForLocation((latitude - i 
        * COORDINATE_OFFSET) 
        + "," + (longitude - i * COORDINATE_OFFSET))) { 

       continue; 

      } else { 
       location[0] = latitude - (i * COORDINATE_OFFSET) + ""; 
       location[1] = longitude - (i * COORDINATE_OFFSET) + ""; 
       break; 
      } 

     } else { 
      location[0] = latitude + (i * COORDINATE_OFFSET) + ""; 
      location[1] = longitude + (i * COORDINATE_OFFSET) + ""; 
      break; 
     } 
    } 

    return location; 
} 

// Return whether marker with same location is already on map 
private boolean mapAlreadyHasMarkerForLocation(String location) { 
    return (markerLocation.containsValue(location)); 
} 

Nel codice precedente, markerLocation è una HashMap.

HashMap<String, String> markerLocation; // HashMap of marker identifier and its location as a string 

Questa risposta ha il codice per Android ma vale la stessa logica in iOS.

+0

buona soluzione –

0

È possibile gestire l'evento click del marcatore (singolo) e utilizzarlo per aggiornare un elemento che si trova al di fuori della tela di Google Map con i dettagli sulle persone in quel marcatore.

+0

Buona idea. Ma l'intero schermo è coperto da Google Maps. – Geek

+0

In tal caso, utilizza già InfoWindow - https://developers.google.com/maps/documentation/javascript/examples/infowindow-simple –

+0

. Ma l'utente verrà a sapere di più marcatori solo se lui/lei tocca un marcatore più volte. – Geek

1

Forse dovresti dare un'occhiata al clustering dei marker. È una soluzione comune per mostrare molti indicatori sullo stesso posto. Google articolo su di esso: https://developers.google.com/maps/articles/toomanymarkers librerie

Ci sono anche esistenti per fare questo, per esempio:

+2

I collegamenti forniti sono utili ma non nel mio caso in cui avrò al massimo 12 indicatori sulla mappa. Il mio problema è cosa succede se hanno la stessa posizione esatta. – Geek

0

L'offset di assegnazione renderà i marker lontani quando l'utente ingrandisce fino a max. Quindi ho trovato un modo per farlo. questo potrebbe non essere un modo corretto ma ha funzionato molto bene.

for loop markers 
{ 
//create marker 
let mapMarker = GMSMarker() 
mapMarker.groundAnchor = CGPosition(0.5, 0.5) 
mapMarker.position = //set the CLLocation 
//instead of setting marker.icon set the iconView 
let image:UIIMage = UIIMage:init(named:"filename") 
let imageView:UIImageView = UIImageView.init(frame:rect(0,0, ((image.width/2 * markerIndex) + image.width), image.height)) 
imageView.contentMode = .Right 
imageView.image = image 
mapMarker.iconView = imageView 
mapMarker.map = mapView 
} 

impostare lo zIndex del marcatore in modo che si vedrà l'icona del marcatore che si desidera visualizzare sulla parte superiore, altrimenti si animerà i marcatori come lo scambio automatico. quando l'utente tocca l'indicatore, gestisce zIndex per portare l'indicatore in alto usando zIndex Swap.

Problemi correlati