Documentación / Conceptos básicos / GroundImage

GroundImage — Colocar una imagen en el mapa

Defina un rango con dos puntos (suroeste y noreste) y coloque ahí una sola imagen. Planos de planta de instalaciones, mapas antiguos, fotografías aéreas, mapas de coropletas personalizados, etc.: las imágenes que no están en mosaico se pueden superponer directamente en el mapa. El rango y la transparencia se pueden modificar más tarde; la imagen permanece pegada al suelo siguiendo las operaciones de la cámara y se muestra accordingly.

BOUNDS
SW / NE
IMAGE
image / url
OPACITY
0.0 – 1.0
TILE SIZE
512 · Solo al renderizar mosaicos
Plataforma

01 · Estado de GroundImage

GroundImageState representa una sola imagen. Tiene un rango, una imagen, una opacidad y un controlador de toque. Puede pasar la imagen de la forma natural para cada plataforma (Android usa Drawable, iOS usa UIImage, Web usa una URL).

GroundImageMapPageViewModel.kt · Jetpack Compose
val groundImageState =
    GroundImageState(
        id = "groundImage",
        bounds =
            GeoRectBounds(
                southWest = southWestPosition,
                northEast = northEastPosition,
            ),
        image = drawable,       // Pasa el Drawable tal cual
        opacity = 0.5f,
        onClick = this::onGroundImageClick,
    )

GroundImage(groundImageState)
Propiedad
Descripción
bounds
El rango rectangular donde se coloca la imagen. Se define con dos puntos: suroeste y noreste.
image / imageUrl
La imagen que se mostrará. En Android se pasa como Drawable, en iOS como UIImage y en Web como una URL de imagen.
opacity
Opacidad. 0.0 es completamente transparente, 1.0 es opaco. Redúzcalo cuando quiera superponerlo con el mapa base.
tileSize
La longitud del lado de un mosaico al renderizarlo como mosaico ráster. No se usa en proveedores que renderizan superposiciones de imagen nativas. Puede dejar el valor predeterminado de 512.
extra
Datos adjuntos arbitrarios. Se pueden recibir al tocar.
onClick
Controlador de toque. Recibe el estado de la imagen y las coordenadas tocadas.

02 · Rango y opacidad

El rango es un rectángulo. Si la relación de aspecto de la imagen y la del rango son diferentes, la imagen se estirará para ajustarse al rango, así que especifique un rango que coincida con la relación de aspecto del dibujo que desea colocar. El rango, la opacidad y la imagen se pueden cambiar más tarde y los cambios se reflejarán en el renderizado en ese momento.

SW
NE
Los puntos suroeste (SW) y noreste (NE) definen el rectángulo. El contorno y los marcadores que se ven aquí son código de la app de ejemplo.
BOUNDS

Recrear el rango arrastrando

Si reemplaza bounds mientras arrastra dos marcadores, la imagen seguirá. Sin embargo, la capacidad de seguimiento de actualizaciones continuas varía según el proveedor.

OPACITY

Superponer con el mapa base

Si reduce la opacidad, se verán las carreteras y los nombres de lugares del mapa inferior. Dependiendo del motor, puede haber limitaciones en el momento y la forma en que se aplican los cambios.

Ejemplo · Mapa antiguo superpuesto ajustado al rango
Cambiar el rango y la opacidad
// Arrastra los marcadores de las esquinas para rehacer los límites
override fun onMarkerDrag(dragged: MarkerState) {
    when (dragged.id) {
        "south_west" -> southWestPosition = GeoPoint.from(dragged.position)
        "north_east" -> northEastPosition = GeoPoint.from(dragged.position)
    }
    bounds = GeoRectBounds(southWest = southWestPosition, northEast = northEastPosition)
}

// La opacidad es una simple asignación
groundImageState.opacity = sliderOpacity

03 · Verse igual en todos los proveedores

GroundImage es la función con la mayor diferencia de implementación entre los controladores de los SDK de mapas. El mecanismo de superposición de imágenes varía mucho según el motor y algunos no tienen una funcionalidad equivalente. MapConductor absorbe esta diferencia en la medida de lo posible, pero algunos proveedores pueden tener restricciones en los cambios dinámicos.

PLACEMENT

Mismo rango, mismo estiramiento

La imagen se ubica de acuerdo con el rango especificado. Sin importar las diferencias en el sistema de coordenadas de superposición de imágenes del motor, se muestra en la misma posición y con el mismo tamaño.

NATIVE FIRST

Dibujar primero con funciones nativas

Cada controlador dibuja de manera óptima utilizando, siempre que sea posible, las funciones de superposición de imágenes específicas de ese SDK de mapas (por ejemplo, MediaLayer + ImageElement para ArcGIS, material de imagen de Rectangle para Cesium, etc.). Solo para motores que inevitablemente no tienen una función equivalente, se recortan las imágenes y se suministran como mosaicos, superponiéndolas como una capa ráster. El código de la aplicación no cambia en ninguna de las dos rutas.

LIMITATIONS

Limitaciones según el proveedor

La recreación del rango (actualización continua mientras se arrastra) o el cambio de opacidad pueden ser limitados debido a restricciones del motor. La colocación estática es la misma en todos los proveedores, pero para usos que cambian dinámicamente, se recomienda verificarlo en el proveedor objetivo.

HIT TEST

La detección de toques también es común

Dado que la detección de toques se realiza con una lógica común, se llamará a onClick independientemente de si el motor es compatible con toques en superposiciones de imágenes.

04 · Toque

onClick recibe el estado de la imagen y las coordenadas tocadas. En el ejemplo, se reemplaza la imagen misma al tocar para cambiar la visualización.

Reemplazar la imagen al tocar
// Cambia la imagen al tocar
override fun onGroundImageClick(clicked: GroundImageEvent) {
    val isBase = clicked.state.image == imageResources.image
    image = if (isBase) imageResources.clickedImage else imageResources.image
}
event.state

El estado de la imagen tocada. Se puede hacer referencia a la imagen actual y extra.

event.clicked

Las coordenadas geográficas tocadas. Puede saber qué parte dentro del rango se presionó.

Las partes transparentes de la imagen también se incluyen en el área táctil. Si no quiere que las partes transparentes reaccionen, ajuste el área al cuerpo real de la imagen o use un polígono además.

Páginas relacionadas