Накладки на землю

Выберите платформу: Android iOS JavaScript

Наземные наложения — это наложения изображений, привязанные к координатам широты/долготы, поэтому они перемещаются при перетаскивании или масштабировании карты.

Примеры кода

Репозиторий ApiDemos на GitHub включает образец, демонстрирующий наложение на землю:

Введение

Наземное наложение — это изображение, прикрепленное к карте. В отличие от маркеров , наземные наложения ориентированы на поверхность Земли, а не на экран, поэтому вращение, наклон или масштабирование карты меняют ориентацию изображения. Наложения земли полезны, когда вы хотите зафиксировать одно изображение в одной области на карте. Если вы хотите добавить обширные изображения, покрывающие большую часть карты, вам следует подумать о наложении Tile .

Добавить наложение

Чтобы добавить GroundOverlay , создайте объект GroundOverlayOptions , который определяет как изображение, так и положение. При желании можно указать дополнительные настройки, которые повлияют на позиционирование изображения на карте. После того как вы определили необходимые параметры, передайте объект методу GoogleMap.addGroundOverlay() , чтобы добавить изображение на карту. Метод addGroundOverlay() возвращает объект GroundOverlay ; вам следует сохранить ссылку на этот объект, если вы хотите изменить его позже.

Шаг за шагом:

  1. Создайте новый объект GroundOverlayOptions
  2. Укажите изображение как BitmapDescriptor .
  3. Задайте положение изображения одним из доступных способов:
    • position(LatLng location, float width, float height)
    • position(LatLng location, float width)
    • positionFromBounds(LatLngBounds bounds)
  4. Установите любые необязательные свойства, такие как transparency , по желанию.
  5. Вызовите GoogleMap.addGroundOverlay() , чтобы добавить изображение на карту.

В приведенном ниже примере показано, как добавить наложение на землю к существующему объекту GoogleMap .

Джава


LatLng newarkLatLng = new LatLng(40.714086, -74.228697);

GroundOverlayOptions newarkMap = new GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
    .position(newarkLatLng, 8600f, 6500f);
map.addGroundOverlay(newarkMap);

      

Котлин


val newarkLatLng = LatLng(40.714086, -74.228697)
val newarkMap = GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
    .position(newarkLatLng, 8600f, 6500f)
map.addGroundOverlay(newarkMap)

      

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

Джава


// Add an overlay to the map, retaining a handle to the GroundOverlay object.
GroundOverlay imageOverlay = map.addGroundOverlay(newarkMap);

      

Котлин


// Add an overlay to the map, retaining a handle to the GroundOverlay object.
val imageOverlay = map.addGroundOverlay(newarkMap)

      

Удалить наложение

Вы можете удалить наложение на землю с помощью метода GroundOverlay.remove() .

Джава


imageOverlay.remove();

      

Котлин


imageOverlay?.remove()

      

Изменить наложение

Вы можете изменить изображение наложения земли после его добавления на карту с помощью метода GroundOverlay.setImage(BitmapDescriptor) .

Джава


// Update the GroundOverlay with a new image of the same dimension
imageOverlay.setImage(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922));

      

Котлин


// Update the GroundOverlay with a new image of the same dimension

// Update the GroundOverlay with a new image of the same dimension
imageOverlay?.setImage(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))

      

Метод setImage() заменит существующее изображение другим изображением того же размера.

Размещение наложения на землю

Есть два способа указать положение наложения на землю:

  • Использование LatLng для центрирования наложения и размеров в метрах для указания размера изображения.
  • Использование LatLngBounds для указания северо-восточного и юго-западного углов изображения.

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

Использовать местоположение для позиционирования изображения

Когда вы добавляете изображение, вы указываете LatLng, к которому будет привязан якорь, и ширину наложения (в метрах). anchor по умолчанию находится в центре изображения. При желании можно указать высоту наложения (в метрах). Если вы не укажете высоту наложения, она будет автоматически рассчитана для сохранения пропорций изображения.

Код ниже размещает изображение в позиции 40.714086, -74.228697 шириной 8,6 км и высотой 6,5 км. Изображение закреплено внизу слева.

Джава


GroundOverlayOptions newarkMap = new GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
    .anchor(0, 1)
    .position(new LatLng(40.714086, -74.228697), 8600f, 6500f);

      

Котлин


val newarkMap = GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
    .anchor(0f, 1f)
    .position(LatLng(40.714086, -74.228697), 8600f, 6500f)

      

Используйте LatLngBounds для позиционирования изображения

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

Приведенный ниже код размещает изображение на карте, юго-западный угол которого привязан к 40.712216,-74.22655 , а его северо-восточный угол привязан к 40.773941, -74.12544 .

Джава


LatLngBounds newarkBounds = new LatLngBounds(
    new LatLng(40.712216, -74.22655),       // South west corner
    new LatLng(40.773941, -74.12544));      // North east corner
GroundOverlayOptions newarkMap = new GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
    .positionFromBounds(newarkBounds);

      

Котлин


val newarkBounds = LatLngBounds(
    LatLng(40.712216, -74.22655),  // South west corner
    LatLng(40.773941, -74.12544)   // North east corner
)
val newarkMap = GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.newark_nj_1922))
    .positionFromBounds(newarkBounds)

      

Свяжите данные с наложением на землю

Вы можете вызвать GroundOverlay.setTag() , чтобы сохранить произвольный объект данных с наложением на землю, и получить объект данных, используя GroundOverlay.getTag() .

В следующем примере кода хранится строковое описание с наложением на землю:

Джава


GroundOverlay sydneyGroundOverlay = map.addGroundOverlay(new GroundOverlayOptions()
    .image(BitmapDescriptorFactory.fromResource(R.drawable.harbour_bridge))
    .position(new LatLng(-33.873, 151.206), 100)
    .clickable(true));

sydneyGroundOverlay.setTag("Sydney");

      

Котлин


val sydneyGroundOverlay = map.addGroundOverlay(
    GroundOverlayOptions()
        .image(BitmapDescriptorFactory.fromResource(R.drawable.harbour_bridge))
        .position(LatLng(-33.873, 151.206), 100f)
        .clickable(true)
)
sydneyGroundOverlay?.tag = "Sydney"

      

Вот несколько примеров сценариев, когда полезно хранить и извлекать данные с наземными наложениями:

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

Обработка событий наложения на землю

По умолчанию наземные наложения не кликабельны. Вы можете включать и отключать кликабельность, вызывая GroundOverlay.setClickable(boolean) .

Используйте OnGroundOverlayClickListener для прослушивания событий щелчка на интерактивном наложении на землю. Чтобы установить этот прослушиватель на карту, вызовите GoogleMap.setOnGroundOverlayClickListener(OnGroundOverlayClickListener) . Когда пользователь нажимает на наложение земли, вы получаете обратный вызов onGroundOverlayClick(GroundOverlay) .