- Удалить маркер из GoogleMap
- 12 ответов
- Удалить маркер из GoogleMap
- Работа с интерфейсом в Google Maps SDK для Android
- Маркеры
- Примеры кода
- Введение
- Начало работы с маркерами
- Добавление маркера
- Kotlin
- Отображение дополнительной информации о маркере
- Связь данных с маркером
- Kotlin
- Как сделать маркер перетаскиваемым
- Kotlin
- Персонализация маркера
- Kotlin
- Изменение цвета маркера
- Kotlin
- Изменение прозрачности маркера
- Kotlin
- Персонализация значка маркера
- Kotlin
- Создание плоского маркера
- Kotlin
- Вращение маркера
- Kotlin
- Z-индекс для маркера
- Kotlin
- Обработка событий маркера
- События кликов по маркеру
- События перетаскивания маркера
Удалить маркер из GoogleMap
В новом API Карт Google для Android мы можем добавить маркер, но нет способа (легко) удалить его.
Мое решение — оставить маркеры на карте и перерисовать карту, когда я хочу удалить маркер, но это не очень эффективно.
Есть ли у кого-нибудь идеи получше?
12 ответов
Сигнатура метода для addMarker :
Поэтому, когда вы добавляете маркер в GoogleMap , указывая параметры для маркера, вы должны сохранить возвращаемый объект Marker (вместо объекта MarkerOptions , который вы использовали для его создания). Этот объект позволяет вам позже изменить состояние маркера. Когда вы закончите с маркером, вы можете вызвать Marker.remove() , чтобы удалить его с карты.
Кстати, если вы хотите только временно скрыть его, вы можете переключить видимость маркера, вызвав Marker.setVisible(boolean) .
Чтобы убрать все каракули на карте, используйте
Добавьте маркер на карту вот так
Затем вы сможете использовать метод удаления, он удалит только этот маркер.
Попробуйте это, он обновляет текущее местоположение, и он отлично работает.
Создать массив со всеми маркерами при добавлении на карту.
1. Если вы хотите удалить маркер, вы можете сделать это как marker.remove(); в качестве альтернативы вы также можете скрыть маркер вместо того, чтобы удалять его как
И сделать его видимым позже, когда понадобится.
2. Однако, если вы хотите удалить все маркеры с карты, Используйте map.clear();
Примечание. map.clear(); также удалит Polylines, Circles и т. д.
3. Если вы не хотите удалять Polylines, Circles и т. д., используйте цикл до длины маркера (если у вас несколько маркеров), чтобы удалить их Посмотрите здесь пример ИЛИ установите для них значение Visible false И не используйте map.clear(); в таком случае.
Используйте следующий код:
Как только вы нажмете «маркер» , вы можете удалить его.
Сделайте глобальную переменную для отслеживания маркера
// Удаляем старый маркер
// Добавляем обновленный маркер и перемещаем камеру
Просто ЗАПИСКА, то, на что я потратил часы, отслеживая сегодня вечером .
Если по какой-то причине вы решили удерживать маркер после УДАЛЕНИЯ его с карты . getTag вернет NULL, даже если оставшиеся значения get вернутся со значениями, которые вы установили для них при создании маркера. .
Значение TAG устанавливается в NULL, если вы когда-либо удаляете маркер, а затем пытаетесь ссылаться на него.
Мне кажется, что это ошибка .
Если вы используете язык Kotlin, вы просто добавляете этот код:
Создайте глобальные переменные типов GoogleMap и Marker .
Я использую маркер переменной, чтобы значение маркера переменной могло изменяться напрямую
И я использую эту функцию / метод, чтобы добавить маркер на свою карту:
После создания функции я помещаю этот код на onMapReady() , чтобы удалить маркер и создать новый:
Это бонус, если вы хотите отображать местоположение адреса при нажатии на маркер, добавьте этот код, чтобы скрыть и показать адрес маркера, но вам нужен метод для получения местоположения адреса. Я получил код из этого сообщения: Как получить полный адрес из широта и долгота?
Если маркер существует, удалите последний маркер. если маркер не существует, создать текущий маркер
Источник
Удалить маркер из GoogleMap
В новом API Карт Google для Android мы можем добавить маркер , но нет способа (легко) его удалить.
Мое решение состоит в том, чтобы сохранить маркеры на карте и перерисовать карту, когда я хочу удалить маркер, но он не очень эффективен.
Кто-нибудь имеет лучшую идею?
Подпись метода для addMarker :
Поэтому, когда вы добавляете маркер в GoogleMap , указав параметры маркера, вы должны сохранить возвращаемый объект Marker (вместо объекта MarkerOptions который вы использовали для его создания). Этот объект позволяет впоследствии изменить состояние маркера. Когда вы закончите с маркером, вы можете вызвать Marker.remove() чтобы удалить его с карты.
В стороне, если вы хотите временно скрыть его, вы можете переключить видимость маркера, вызывая Marker.setVisible(boolean) .
Очистить все каракули на карте
Добавьте маркер на карту следующим образом:
Тогда вы сможете использовать метод remove, он удалит только этот маркер
1. Если вы хотите удалить маркер, вы можете сделать это как marker.remove(); В качестве альтернативы вы также можете скрыть маркер, а не удалять его как
И сделать его видимым позже, когда это необходимо.
2. Однако если вы хотите удалить все маркеры с карты Используйте map.clear();
Примечание: map.clear(); Также удалит Polylines, Circles и т. Д.
3. Если вы не хотите удалять Polylines, Circles и т. Д., Чем использовать цикл для длины маркера (если у вас есть несколько маркеров), чтобы удалить их. Проверьте здесь пример или установите их. Visible false И не используйте map.clear(); в таком случае.
Если маркер существует, удалите последний маркер. Если маркер не существует, создайте текущий маркер
Сделать глобальную переменную для отслеживания маркера
// Удаление старого маркера
// Добавить обновленный маркер и переместить камеру
Создайте массив со всеми маркерами для добавления в карту.
Источник
Работа с интерфейсом в Google Maps SDK для Android
Данная статья будет полезна тем, кто ранее не использовал в своей работе Google Maps SDK.
Под катом описаны основные приемы работы с картой, такие как добавление и управление маркерами, способы перемещения камеры над картой, управление зумом, построение маршрута и геокодинг. А так же ограничения и способы их обхода.
Источник
На написание статьи меня сподвиг собственный опыт, который я извлек при написании приложения для курьеров использующего в своей работе гугл карты. Так что все скриншоты и возможное упоминание бизнес логики будут происходить в контексте построения интерфейса курьера.
К сожалению Google Maps SDK for Android не позволяет изменять положение кнопок управления, т.н. UI controls, к ним относятся: IndoorLevelPicker — показ поэтажного плана строений, Compass — компас, My Location button — перейти на карте к текущему местоположению, Map toolbar — кнопи построения маршрута и открытия карты, а так же ZoomControls — увеличения и уменьшения маштаба карты.
На примере Map toolbar и ZoomControls посмотрим какие сложности могут возникнуть из-за невозможности сменить положение контролов и как это обойти.
Проблемы с отображением UI controls из SDK (выделено оранжевым) и их кастомные аналоги (выделено зеленым)
В данном случае у нас в правом нижнем углу расположена кнопка (floating action button) перехода к списку адресов заказов на доставку, на картинке слева видно, что ZoomControls оказались под ней и практически недоступны для нажатия. На картинке справа, при нажатии на маркер, появляются кнопки из Map toolbar, они так же оказались под кнопкой перехода к списку заказов.
Первое что нам необходимо сделать — это скрыть отображение оригинальных кнопок. Сделать это можно переопределив метод onMapReady, он вызывается в тот момент, когда карта готова к использованию.
Добавляем в верстку фрагмента нужные кнопки, там где они должны быть в соответствии с нашим дизайном:
Расположение кастомных кнопок управления картой
Затем в методе onCreateView указываем действия, которые должны произойти при нажатии на наши кнопки:
Особенность метода animateCamera в том, что маштаб изменяется плавно, а не мгновенно и если нужно, например, отключить анимацию конкретной кнопки зума, по достижению максимального или минимального маштаба, то для этого нужно переопределить метод onCameraIdle, который вызывается в момент прекращения изменения маштаба карты.
Что бы выполнить какое либо действие с маркером(кроме перетаскивания), например, создать новый заказ, удалить случайно поставленный маркер, перейти в уже существующий заказ или позвонить по телефону казанному в заказе добавляем в верстку соответствующие кнопки управления и прописываем их обработчики.
Кнопки управления маркером
Еще одна особенность, это то что в SDK нет кнопки для удаления поставленного на карту маркера. Для этого тоже делаем свою кнопку:
При нажатии на маркер открывается его заголовок, нажатие на который так же можно использовать для совершения какого либо действия, я при нажатии на заголовок нового маркера создаю новый заказ на доставку курьеру, а на маркер уже существующего заказа — открываю подробную информацию о доставке, включающюю перечень товаров.
Процесс вывода нескольких маркеров (считай списка заказов) на карту ничем принципиально не отличается от вывода одного маркера. Маркер состоит из координат (position), заголовка (title), мелкого текста под заголовком (snippet) и тэга (setTag) — его можно использовать для идентификации множества маркеров на карте.
Несколько маркеров на карте
Пара слов о геокодере
Геокодер используется для получения адреса, на основании координат. Поставив маркер на карте и нажав кнопку добавить заказ, мы получаем географические координаты нужной точки, т.е. широту и долготу. Но для удобства пользователя неплохо будет показать адрес в человекочитаемом виде, т.е., например, страна, город, улица, дом.
Google Maps SDK содержит класс Geocoder, вызвав его метод getFromLocation можно получить массив адресов по указанным координатам.
Для того, что бы не блокировать UI thread долгими, особенно если медленный или недоступный интернет, вызовами — будем использовать RxJava:
Полученный адрес точки на карте на основании географических координат
Источник
Маркеры
Маркеры обозначают отдельные местоположения на карте. Маркеры можно настраивать, например менять их цвета или значки. Информационные окна могут содержать дополнительную информацию об отмеченных точках.
Примеры кода
Хранилище ApiDemos на сайте GitHub содержит пример, где демонстрируются различные свойства маркера:
Java
- MapWithMarker: простая карта с маркером. О том, как ее добавить, читайте в руководстве.
- MarkerDemoActivity: использование маркеров на карте, включая параметры и прослушиватели.
Kotlin
- MapWithMarker: простая карта с маркером. О том, как ее добавить, читайте в руководстве.
- MarkerDemoActivity: использование маркеров на карте, включая параметры и прослушиватели.
Введение
Маркеры указывают местоположения на карте. По умолчанию используется стандартный значок, знакомый вам по работе с Google Картами. С помощью API можно изменить цвет значка, его изображение или точку привязки. Маркеры (объекты Marker ) добавляются на карту с помощью метода GoogleMap.addMarker(markerOptions) .
Маркеры – это интерактивные элементы. По умолчанию они принимают события click и часто используются с прослушивателями событий для вывода информационных окон. Установка для свойства маркера draggable значения true позволяет пользователю изменять положение маркера на карте. Возможность перемещения маркера активируется долгим нажатием.
По умолчанию когда пользователь касается маркера, в правом нижнем углу карты отображается панель инструментов, которая предоставляет быстрый доступ к мобильному приложению «Google Карты». Ее можно отключить. Дополнительные сведения вы можете найти в руководстве по элементам управления.
Начало работы с маркерами
В этом эпизоде Maps Live рассказывается об основах добавления маркеров на карту с использованием Maps SDK for Android.
Добавление маркера
В следующем примере демонстрируется добавление маркера на карту. Маркер создается в точке с координатами -33.852,151.211 (Сидней, Австралия), а при нажатии на него появляется строка «Marker in Sydney» в информационном окне.
Kotlin
Отображение дополнительной информации о маркере
Когда пользователь касается маркера на карте, должна выводиться дополнительная информация о месте или местоположении. Дополнительные сведения вы можете найти в руководстве по информационным окнам.
Связь данных с маркером
В маркере можно сохранить объект произвольных данных, используя метод Marker.setTag() , и извлечь этот объект данных с помощью метода Marker.getTag() . В приведенном ниже примере кода показано, как с помощью тегов подсчитать количество кликов, которые получил маркер.
Kotlin
Примеры случаев, когда вам может понадобиться сохранение или получение данных через маркеры:
- Ваше приложение может обрабатывать различные типы маркеров, и вам нужно, чтобы они обрабатывались по-разному, когда пользователь нажимает на них. Для этого сохраните в маркере объект String с указанием типа.
- Вы работаете с интерфейсом к системе, в которой имеются уникальные идентификаторы записей и каждый маркер соответствует одной записи в этой системе.
- В данных маркера записан приоритет, который определяет значение параметра z-index для этого маркера.
Как сделать маркер перетаскиваемым
Чтобы маркер можно было перемещать после его добавления на карту, задайте для свойства draggable значение true . Перетаскивание маркера активируется долгим нажатием. Когда пользователь уберет палец с экрана, маркер останется в этом месте.
По умолчанию возможность перетаскивания маркеров отключена. Вы должны явно включить эту возможность с помощью метода MarkerOptions.draggable(boolean) до добавления маркера на карту или же с помощью метода Marker.setDraggable(boolean) , когда маркер уже добавлен. Вы можете прослушивать события перетаскивания для маркера.
В приведенном ниже фрагменте кода перетаскиваемый маркер устанавливается для города Перт, Австралия.
Kotlin
Персонализация маркера
В этом видеоролике рассказывается, как использовать маркеры для визуального представления различных мест на карте.
Для маркера можно задать собственное изображение, которое будет показываться вместо стандартного значка. При определении значка устанавливается ряд значений, определяющих, как он будет выглядеть.
Маркеры поддерживают настройку с использованием следующих свойств:
Position (Положение; обязательно) Значение параметра LatLng для положения маркера на карте. Это единственное обязательное свойство объекта Marker . Anchor (Привязка) Точка на изображении, которое будет размещено в месте, указанном параметром маркера LatLng (широта и долгота). По умолчанию устанавливается по центру в нижней части изображения. Alpha (Альфа-канал) Свойство, определяющее прозрачность маркера. Значение по умолчанию – 1.0. Title (Заголовок) Строка, которая отображается в информационном окне, когда пользователь касается маркера. Snippet (Фрагмент) Дополнительный текст, отображаемый под названием. Icon (Значок) Картинка в битовом формате, которая отображается вместо значка по умолчанию. Draggable (Перетаскиваемость) Задайте значение true , если хотите, чтобы пользователи могли перетаскивать значок. Значение по умолчанию – false . Visible (Видимость) Измените значение этого свойства на false , чтобы сделать маркер невидимым. Значение по умолчанию – true . Flat или Billboard (свойства ориентации) По умолчанию ориентация маркеров рассчитывается относительно экрана. Они не вращаются и не наклоняются при изменении ракурса. Плоские маркеры ориентированы по земной поверхности и вращаются или наклоняются вместе с камерой. Маркеры обоих типов не меняют размер при масштабировании. Если вам необходим этот эффект, используйте наложения (GroundOverlay). Rotation (Вращение) Поворот маркера по часовой стрелке в градусах. Для плоских маркеров направление по умолчанию может изменяться. По умолчанию плоский маркер направлен на север. Остальные маркеры по умолчанию расположены перпендикулярно земной поверхности и при вращении обращены в сторону камеры.
Ниже представлен код, который позволяет создать простой маркер со стандартным значком.
Kotlin
Изменение цвета маркера
Чтобы изменить цвет стандартного изображения маркера, необходимо передать объект BitmapDescriptor в метод icon(). Вы можете использовать набор предварительно установленных цветов в объекте BitmapDescriptorFactory или задать конкретный цвет маркера с помощью метода BitmapDescriptorFactory.defaultMarker(float hue) . Параметр hue (тон) должен содержать значение от 0 до 360, представляющее собой точку на цветовом круге.
Kotlin
Изменение прозрачности маркера
Для изменения прозрачности маркера можно использовать метод MarkerOptions.alpha(). Непрозрачность следует указывать как число с плавающей запятой от 0,0 до 1,0, где 0 – полная прозрачность, а 1 – полная непрозрачность.
Kotlin
Персонализация значка маркера
Значок маркера по умолчанию можно заменить любым другим изображением. Собственные значки всегда устанавливаются в виде объекта BitmapDescriptor и определяются с использованием одного из методов в классе BitmapDescriptorFactory .
fromAsset(String assetName) Создает собственный маркер, используя название битового изображения в каталоге ресурсов. fromBitmap(Bitmap image) Создает собственный маркер из битового изображения. fromFile(String fileName) Создает собственный значок, используя название битового файла, который хранится во внутренней памяти устройства. fromPath(String absolutePath) Создает собственный маркер, используя абсолютный путь к битовому файлу. fromResource(int resourceId) Создает собственный маркер, используя идентификатор ресурса битового изображения.
В приведенном ниже фрагменте показано создание маркера с пользовательским значком.
Kotlin
Создание плоского маркера
Положение значка маркера обычно рассчитывается относительно экрана. Масштабирование, повороты и наклоны камеры не влияют на его ориентацию. Однако можно сделать так, чтобы значок лежал на земной поверхности, вращался и наклонялся вместе с картой. Размер плоского маркера не меняется при приближении и отдалении.
Чтобы изменить ориентацию маркера, установите для свойства flat значение true .
Kotlin
Вращение маркера
Маркер можно вращать вокруг точки привязки с помощью метода Marker . setRotation() . Значение измеряется относительно исходного положения в градусах по часовой стрелке. Если маркер плоский, он по умолчанию ориентирован на север. Остальные маркеры по умолчанию расположены перпендикулярно земной поверхности и при вращении обращены в сторону камеры.
В приведенном ниже примере маркер поворачивается на 90°. При установке для точки привязки значения 0.5,0.5 маркер будет вращаться вокруг своего центра, а не вокруг основания.
Kotlin
Z-индекс для маркера
Параметр Z-index указывает порядок расположения маркера относительно других маркеров на карте. Маркер с высоким Z-индексом отображается поверх маркеров с меньшими значениями этого параметра. По умолчанию Z-индекс равен 0 .
Установите Z-индекс для объекта параметров маркера, вызвав метод MarkerOptions.zIndex() , как показано в следующем примере кода:
Kotlin
Получить Z-индекс можно с помощью метода Marker.getZIndex() , а изменить его – с помощью метода Marker.setZIndex() .
Маркеры всегда отображаются поверх фрагментов карты и прочих не поддерживающих маркеры наложений (наземных наложений, ломаных линий, многоугольников и других фигур). Это не зависит от Z-индекса других наложений. Фактически у маркеров свое пространство Z-индексов, отдельное от Z-индексов других наложений.
Обработка событий маркера
Maps API позволяет прослушивать события маркера и реагировать на них. Для этого необходимо назначить объекту GoogleMap , к которому относятся маркеры, соответствующий прослушиватель. Если для одного из маркеров карты возникает событие, соответствующий объект Marker , передаваемый в виде параметра, выполняет обратный вызов прослушивателя. Чтобы сопоставить этот объект Marker с вашей собственной ссылкой на Marker , используйте метод equals() , а не оператор == .
Можно прослушивать следующие события:
События кликов по маркеру
Чтобы отслеживать события кликов по маркеру, используйте прослушиватель OnMarkerClickListener . Чтобы добавить его на карту, вызовите GoogleMap.setOnMarkerClickListener(OnMarkerClickListener) . Когда пользователь нажимает на маркер, выполняется вызов onMarkerClick(Marker) , а маркер передается в виде аргумента. Этот метод возвращает логическое значение, указывающее, было ли событие принято (т. е. нужно ли подавлять поведение по умолчанию). Если возвращается значение false , поведение по умолчанию выполняется параллельно с персонализированным. Поведение по умолчанию для события клика по маркеру – отображение его информационного окна (если оно доступно) и перемещение камеры таким образом, чтобы маркер находился в центре карты.
Влияние Z-индекса на события кликов:
- Когда пользователь нажимает на кластер маркеров, событие клика назначается маркеру с наивысшим Z-индексом.
- В большинстве случаев каждый клик запускает одно событие. Другими словами, клик не передается маркерам или иным наложениям с более низкими значениями Z-индекса.
- Нажатие на кластер маркеров вызывает последующий цикл кликов внутри кластера. Каждый маркер выбирается по очереди. Порядок в цикле имеет приоритет прежде всего по Z-индексу, и только затем – по расстоянию до точки нажатия.
- Если пользователь нажимает на карту за пределами кластера, API пересчитывает кластер и переопределяет состояние цикла кликов, запуская его с начала.
- Событие клика переходит от кластера маркеров на другие фигуры и наложения, прежде чем цикл начнется снова.
- Фактически маркеры располагаются в группе значений Z-индекса, которая отделена от других наложений и фигур (ломаных линий, многоугольников, кругов, наземных наложений), какими бы ни были значения Z-индекса этих объектов. Если несколько маркеров, наложений или фигур перекрывают друг друга, то клики сначала циклически распределяются по кластеру маркеров, а затем применяются для других доступных для нажатия наложений или фигур в зависимости от значений их Z-индекса.
События перетаскивания маркера
Чтобы отслеживать события перетаскивания маркера, используйте прослушиватель OnMarkerDragListener . Чтобы добавить его на карту, вызовите GoogleMap.setOnMarkerDragListener . Функция перетаскивания активируется долгим нажатием на маркер. Когда пользователь уберет палец с экрана, маркер останется в этом месте. В начале перетаскивания вызывается метод onMarkerDragStart(Marker) , во время перетаскивания – onMarkerDrag(Marker) (он вызывается непрерывно), а по окончании – onMarkerDragEnd(Marker) . Положение маркера можно в любое время запросить с помощью метода Marker.getPosition() .
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Источник