Documentación / Conceptos básicos / Polilínea

Polilínea

Simplemente cree un objeto de estado con una secuencia de coordenadas y un estilo de línea y colóquelo en la vista de mapa. La apariencia, la curvatura y la detección de toques de las líneas tienden a variar según el proveedor, pero MapConductor lo estandariza para obtener el mismo resultado en cualquier proveedor.

POINTS
GeoPoint[]
STROKE
color · width
GEODESIC
true / false
EVENT
onClick
Plataforma

01 · Estado de la polilínea

PolylineState representa una sola línea. Contiene una secuencia de coordenadas, un estilo y un controlador de toque. Si modifica las propiedades, la línea se actualiza inmediatamente y no es necesario reconstruirla, incluso en aplicaciones cuya forma de ruta cambia.

PolylinePageViewModel.kt · Jetpack Compose
val polylineState =
    PolylineState(
        points = routePoints,
        strokeColor = Color.Red,
        strokeWidth = 4.dp,
        geodesic = true,
        onClick = { event -> viewModel.onPolylineClick(event) },
    )

// Solo colócalo dentro del mapa
Polyline(polylineState)

// Cambiar la forma es solo reescribir points
polylineState.points = nextPoints
Propiedad
Descripción
points
La secuencia de coordenadas que compone la línea. Si la modifica, cambia la forma.
strokeColor
El color de la línea. Se puede especificar la transparencia.
strokeWidth
El grosor de la línea. Se especifica en unidades lógicas de la plataforma y se ve del mismo grosor independientemente de la resolución del dispositivo.
geodesic
Si se une mediante un curso de gran círculo (geodésica). El valor predeterminado es false.
zIndex
El orden Z. Determina la relación delantera/trasera con otras superposiciones.
extra
Datos adjuntos arbitrarios. Se pueden recibir al tocar.
onClick
El controlador de toque. Recibe el estado de la línea y la coordenada tocada.

02 · Líneas rectas y cursos de gran círculo

Si geodesic es true, dos puntos se unen mediante la ruta más corta en la Tierra (curso de gran círculo). Las rutas de vuelo de larga distancia, por ejemplo, no son rectas sino que describen un arco. Cuando es false, es una línea recta en la proyección del mapa. Puede dibujar ambos y compararlos uno al lado del otro con la misma secuencia de coordenadas.

geodesic = false
Una línea recta en la proyección. Apenas distinta en distancias cortas; visiblemente desviada del camino más corto real en las largas.
geodesic = true
El camino más corto sobre el globo, dibujado como un arco que se curva hacia los polos.
Dibujar dos líneas con las mismas coordenadas
Polyline(polylineState) // geodesic = true (curvo)
Polyline(
    polylineState.copy(
        id = "${polylineState.id}-straight",
        geodesic = false,
        strokeColor = Color.Blue,
    ),
)

03 · Verse igual en cualquier proveedor

Entre los motores de mapas, hay algunos que pueden dibujar cursos de gran círculo y otros que no, algunos con diferentes unidades de grosor de línea y diferentes formas de tratar las líneas que cruzan la línea de cambio de fecha. Con el SDK sin procesar, la apariencia cambia incluso con la misma secuencia de coordenadas.

MapConductor absorbe esta diferencia internamente. La aplicación simplemente pasa un PolylineState y, en cualquier proveedor, se obtiene el mismo arco, el mismo grosor y el mismo área de toque.

GEODESIC

el mismo arco incluso para motores que no pueden dibujar curvas

Para motores que no pueden dibujar directamente rutas de círculo máximo, las líneas se dividen en una secuencia de coordenadas de segmentos finos antes de pasarlas. Como resultado, el mismo arco se muestra en cualquier motor.

ANTIMERIDIAN

Líneas que cruzan la línea de fecha internacional

Para líneas que cruzan el meridiano 180°, algunos motores, si se pasan tal cual, cruzarían la Tierra en la dirección equivocada. Al dividir las líneas en el límite y pasarlas, todos los motores pasan por el lado más corto.

STROKE WIDTH

Igualar el criterio de grosor

El grosor de la línea se especifica en unidades lógicas de la plataforma. Como la densidad de píxeles del dispositivo y las diferencias de unidad entre motores se convierten internamente, el grosor visual en el dispositivo real coincide.

HIT TEST

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

La detección de toques no se deja al motor, sino que se realiza con una lógica común. Dado que el rango de tolerancia del tamaño del dedo se convierte a metros según el zoom, la facilidad de presionar no cambia aunque el nivel de zoom sea diferente. En el caso de curvas, la detección se realiza a lo largo del arco.

Figura · al cruzar la línea de cambio de fecha
180°
Pasado tal cual: algunas engines dibujan la línea dando la vuelta larga al globo.
180°
A través de MapConductor: se divide en el meridiano 180 y cada engine toma el lado corto.
Video de muestra · el mismo código escrito en SwiftUI en Google Maps y MapLibre

04 · Toque

onClick recibe el estado de la línea y la posición tocada en la línea. La posición tocada es una coordenada corregida al punto más cercano de la línea, por lo que puede colocar un marcador en ese lugar o calcular distancias.

event.state

El estado mismo de la línea tocada. Puede extraer datos de color y extra.

event.clicked

Coordenadas en la línea. No es la posición del dedo, sino el punto más cercano a la línea.

Rango de tolerancia

La detección se realiza con un margen para el tamaño del dedo. Se convierte a metros según el zoom.

PolylineClickPageViewModel.kt
// Coloca un marcador en el punto tocado
fun onPolylineClick(event: PolylineEvent) {
    markers = markers + MarkerState(
        position = event.clicked,
        animation = MarkerAnimation.Drop,
        icon = DefaultMarkerIcon(fillColor = event.state.strokeColor),
    )
}

Los segmentos de línea fuera del rango visible se excluyen de la detección, por lo que la respuesta no se ralentiza incluso si coloca muchas rutas largas. Si varias líneas se superponen, se selecciona la más cercana.

Páginas relacionadas