it-swarm.com.ru

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

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

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

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

16
Geek

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

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

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.

14
Geek

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

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

1
hunyadym

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

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.

0
Satheesh G

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

0
Tim Ebenezer