Как обрабатывать несколько маркеров на Картах Google с одинаковым местоположением?

Я использую Карты Google в приложении, и, вероятно, несколько маркеров прикреплены к тому же местоположению, где каждый маркер представляет человека. В этой ситуации пользователь не будет знать, что за этим конкретным маркером есть другие маркеры/лица.

Я осмотрелся, чтобы справиться с этой ситуацией, и один вопрос на SO предполагает, что я могу отобразить один маркер и связать всех лиц с этим единственным маркером. Когда пользователь удаляет этот маркер, я должен отобразить список всех пользователей, связанных с этим маркером. Это хороший способ обхода, но я бы хотел избежать отображения представления, которое в основном скрывает Карты Google.

Кто-нибудь использовал какое-либо обходное решение в подобной ситуации?

Ответы

Ответ 1

Временное решение, которое я использовал, - это отображать маркеры с одинаковым расположением, немного разбросанными по карте, так что пользователь получает небольшое представление о нескольких маркерах.

Я отслеживаю маркеры на карте и их местоположения на карте, и всякий раз, когда я хочу добавить маркер на карту, я удостоверяюсь, что никакой другой маркер не отображается в том же месте. Если да, то я добавляю смещение к местоположению нового маркера, который я хочу добавить.

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

Ниже метод возвращает местоположение, которое должно использоваться для нового маркера. Этот метод принимает в качестве параметров новый маркер текущей широты и долготы.

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

В приведенном выше коде markerLocation - это HashMap.

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

В этом ответе есть код для Android, но такая же логика применяется в iOS.

Ответ 2

Возможно, вам стоит взглянуть на кластеризацию маркеров. Это общее решение для показа большого количества маркеров на одном и том же месте. Статья Google об этом: https://developers.google.com/maps/articles/toomanymarkers

Для этого существуют также существующие библиотеки, например:

Ответ 3

Вы можете обработать событие click (одиночного) маркера и использовать его для обновления элемента, который находится за пределами холста Google Map, с информацией о людях на этом маркере.

Ответ 4

Давление смещения сделает маркеры далекими, когда пользователь увеличит масштаб до макс. Поэтому я нашел способ добиться этого. это может быть не совсем правильно, но это сработало очень хорошо.

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
}

установите zIndex маркера так, чтобы вы увидели значок маркера, который вы хотите увидеть сверху, иначе он будет анимировать маркеры, такие как автоматическая замена. когда пользователь нажимает маркерную маркеру zIndex, чтобы принести маркер сверху, используя zIndex Swap.