it-swarm.com.de

Wie gehe ich mit mehreren Markierungen in Google Maps mit demselben Standort um?

Ich verwende Google Maps in einer App und es ist wahrscheinlich, dass mehrere Markierungen an derselben Stelle angebracht sind, an der jede Markierung eine Person darstellt. In dieser Situation wird der Benutzer nicht wissen, dass sich andere Marker/Personen hinter diesem speziellen Marker befinden.

Ich habe mich umgesehen, um mit dieser Situation umzugehen, und eine Frage zu SO deutet an, dass ich einen einzelnen Marker anzeigen und alle Personen diesem einzelnen Marker zuordnen kann. Wenn der Benutzer auf diesen Marker tippt, sollte ich eine Liste aller Benutzer anzeigen, die diesem Marker zugeordnet sind. Dies ist eine gute Lösung, aber ich möchte vermeiden, dass eine Ansicht angezeigt wird, in der Google Maps größtenteils ausgeblendet ist.

Hat jemand eine Problemumgehung in einer ähnlichen Situation verwendet?

16
Geek

Die von mir verwendete Problemumgehung besteht darin, Marker mit der gleichen Position auf der Karte etwas auseinander zu zeigen, so dass der Benutzer eine leichte Vorstellung von mehreren Markierungen erhält.

Ich verfolge Markierungen auf der Karte und ihre Positionen auf der Karte. Immer wenn ich eine Markierung auf der Karte hinzufügen möchte, vergewissere ich mich, dass keine anderen Markierungen an derselben Position angezeigt werden. Wenn ja, füge ich der Position der neuen Markierung, die ich hinzufügen möchte, einen Versatz hinzu.

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

Die untenstehende Methode gibt den Ort zurück, der für die neue Markierung verwendet werden muss. Diese Methode verwendet den aktuellen Breiten- und Längengrad des neuen Markers.

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

Im obigen Code ist markerLocation eine HashMap. 

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

Diese Antwort enthält Code für Android, aber die gleiche Logik gilt für iOS.

14
Geek

Vielleicht sollten Sie sich das Marker-Clustering ansehen. Es ist eine gängige Lösung, um viele Marker an derselben Stelle anzuzeigen. Google-Artikel dazu: https://developers.google.com/maps/articles/toomanymarkers

Dazu gibt es auch vorhandene Bibliotheken, z.

1
hunyadym

Inspiriert von den Geeks Antwort , habe ich eine Funktion erstellt. Diese Funktion gibt ein neues Längen- und Breitengradpaar in der Nähe des ursprünglichen Werts fast kreisförmig zurück. COORINDATE_OFFSET kann je nach Bedarf angepasst werden.

private static final float COORDINATE_OFFSET = 0.000085f;
private ArrayList<LatLng> markerCoordinates = new ArrayList<>();
private int offsetType = 0;

private LatLng getLatLng(LatLng latLng) {

    LatLng updatedLatLng;

    if (markerCoordinates.contains(latLng)) {
        double latitude = 0;
        double longitude = 0;
        if (offsetType == 0) {
            latitude = latLng.latitude + COORDINATE_OFFSET;
            longitude = latLng.longitude;
        } else if (offsetType == 1) {
            latitude = latLng.latitude - COORDINATE_OFFSET;
            longitude = latLng.longitude;
        } else if (offsetType == 2) {
            latitude = latLng.latitude;
            longitude = latLng.longitude + COORDINATE_OFFSET;
        } else if (offsetType == 3) {
            latitude = latLng.latitude;
            longitude = latLng.longitude - COORDINATE_OFFSET;
        } else if (offsetType == 4) {
            latitude = latLng.latitude + COORDINATE_OFFSET;
            longitude = latLng.longitude + COORDINATE_OFFSET;
        }
        offsetType++;
        if (offsetType == 5) {
            offsetType = 0;
        }


        updatedLatLng = getLatLng(new LatLng(latitude, longitude));

    } else {
        markerCoordinates.add(latLng);
        updatedLatLng = latLng;
    }
    return updatedLatLng;
}

Durch das Versetzen werden die Markierungen weit entfernt, wenn der Benutzer auf max. Also habe ich einen Weg gefunden, das zu erreichen. Dies ist vielleicht kein richtiger Weg, aber es hat sehr gut funktioniert.

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
}

stellen Sie den zIndex des Markers so ein, dass Sie das Markersymbol sehen, das Sie oben sehen möchten. Andernfalls werden die Marker wie automatisches Wechseln animiert. , wenn der Benutzer auf den Marker tippt, um den Marker zu holen oben mit zIndex Swap.

0
Satheesh G

Sie könnten mit dem Klickereignis der (einzelnen) Markierung umgehen und ein Element außerhalb der Google Map-Zeichenfläche mit den Details zu den Personen an dieser Marke aktualisieren.

0
Tim Ebenezer