Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

348
Vistas
Cómo evitar que BringToBack invierta el orden de las capas de FeatureGroup en Leaflet

Tengo un Leaflet Map en una aplicación web Shiny. Tengo 3 grupos base que contienen diferentes círculos y 1 grupo superpuesto que contiene polilíneas que se cruzan entre sí. Las polilíneas se ordenan de modo que las líneas más importantes estén encima de las menos importantes. Los círculos se agregan después para estar encima de las líneas. El problema es: al desmarcar y luego marcar el grupo superpuesto, las líneas se colocan encima de los círculos. El círculo se puede colocar encima de las líneas cuando se cambia la capa base. Sin embargo, me gustaría evitar que la línea se superponga a los círculos. Para hacer eso, utilicé la función OnRender de htmltools:

 output$map <- renderLeaflet( leaflet() %>% addProviderTiles(providers$CartoDB.Positron) %>% setView( lng = 48.80, lat = 2.30, zoom = 10 ) %>% addControl("Title", position = "bottomleft", className = "map-title") %>% onRender( "function(el, x) { this.on('overlayadd', function(e) { e.layer.bringToBack(); }) }" )

Y bueno, sí, pone la línea detrás de los círculos, pero lo que también hace es invertir el orden de las líneas (de todo el FeatureGroup), por lo que ahora las líneas menos importantes están encima de las más importantes. Por lo que obtengo, traerToBack() toma la primera línea dibujada, la lleva hacia atrás, luego la segunda línea dibujada, la pone hacia atrás (debajo de la primera) y así sucesivamente, hasta que la primera línea dibujada (la menos importante) se colocará al frente mientras que el último dibujado (el más importante) se colocará al reverso.

Así que probé algunas modificaciones de la función:

 function(el, x) { this.on('overlayadd', function(e) { var layers = e.layer.getLayers(); e.layer.clearLayers(); layers.reverse(); layers.forEach(l => e.layer.addLayer(l)); e.layer.bringToBack(); })

Y no funcionó. Así que ahora no lo entiendo, porque técnicamente ahora el primer dibujado es el que quiero que sea el último dibujado, y por lo tanto, la inversión de traerToBack debería hacerlo. Pero no, el orden sigue siendo el mismo que la otra función. Y probé sin el reverso, sigue siendo el mismo resultado. También probé setZIndex, colocando la capa base en un índice Z alto, mientras que la superposición se devolvió a un índice Z bajo, pero no tuvo ningún efecto (líneas en la parte superior de los círculos).

Y traté de cambiar las opciones autoZIndex y sortLayers de layerControlOptions y no tuvo ningún efecto (líneas en la parte superior de los círculos).

Entonces, lo que me gustaría es: una explicación de la magia detrás de traerToBack, o una función js que hará el truco, o una solución R que mantendrá el orden como lo quiero.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

La función addMapPane en la library(leaflet) se puede usar para solucionar este problema sin un código JS personalizado.

De la descripción:

Se pueden crear paneles de mapas proporcionando un nombre y un zIndex para controlar el orden de las capas. Recomendamos un valor de zIndex entre 400 (el panel de superposición predeterminado) y 500 (el panel de sombra predeterminado). Luego puede usar este panel para representar superposiciones (puntos, líneas, polígonos) configurando el argumento del panel en leafletOptions. Esto le dará control sobre el orden de las capas, por ejemplo, los puntos siempre encima de los polígonos. Si se proporcionan dos capas al mismo panel, la superposición se determinará por orden de adición. Vea los ejemplos a continuación. Consulte https://leafletjs.com/reference-1.3.4.html#map-pane para obtener más información.

Ver el ejemplo en la ayuda. Escribe ?addMapPane en la consola

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda