32 votos

OpenLayers - redibujando el mapa después de redimensionar el contenedor

En mi aplicación web, quiero permitir a los usuarios establecer el tamaño del contenedor del mapa.

Todo funcionó bien cuando el contenedor se expandió ligeramente (aparentemente esto se debe a que las baldosas que estaban justo detrás del borde ya estaban cargadas). Sin embargo, cuando el contenedor se expande significativamente (en el siguiente ejemplo, de 300 a 1000px de ancho), queda un espacio en blanco.

¿Cómo hacer que el mapa se redibuje y se adapte al nuevo tamaño?

Llamando a redraw() en todas las capas no ayudó. Tampoco lo hizo el acercamiento y alejamiento.

Lo probé con los resultados descritos en Opera, Chrome y Firefox. En IE8, sorprendentemente, el problema no ocurrió y el mapa se adaptó automáticamente.

Una página web simplificada para las pruebas:

<html>
  <head>
    <style>
      #mapbox { 
        width: 300px;
        height: 500px;
        border: 1px solid black;
      }
    </style>

    <script src="http://openlayers.org/api/OpenLayers.js"></script>
  </head>

  <body>
    <div id="mapbox"></div>
    <input type="button" id="test" value="resize">

    <script>    
      var map = new OpenLayers.Map('mapbox');
      map.addLayer(new OpenLayers.Layer.OSM());      

      map.setCenter(
        new OpenLayers.LonLat(1000000, 7000000), 5);

      document.getElementById('test').onclick = function() {
        document.getElementById('mapbox').style.width = '1000px';
      }
    </script>
  </body>
</html>

44voto

Yaakov Ellis Puntos 15470

Es necesario llamar a la API para actualizar el tamaño del mapa.

http://dev.openlayers.org/docs/files/OpenLayers/Map-js.html#OpenLayers.Map.updateSize

Así es como lo hacemos

window.onresize = function()
{
  setTimeout( function() { map.updateSize();}, 200);
}

Puedes ver que hicimos un ligero retraso, y honestamente no recuerdo la razón exacta, pero tuvimos que darle una ligera espera antes de llamar a la API para redimensionarse.

2 votos

Bueno, creo que el retraso es específico de su aplicación. ;) De todas formas, gracias, una vez más me he perdido algo en los docs.

1 votos

Tampoco veo ninguna razón para el retraso, así que lo dejé fuera. Gracias

1 votos

@Vadim Gran respuesta, pero no funciona para mí. Mi código es como body onload=init() y init inicializa el mapa. ¿Es por eso? Además, ¿sería esta una buena solución para el diseño responsivo? window.onload=window.onresize=function(){//resize here . Gracias

9voto

James Sulak Puntos 9959

Sí, utiliza map.updateSize() como dice Vadim (¡tampoco sé por qué el retraso!) documentación

Yo suelo poner un botón de alternancia de pantalla completa en los mapas, que funciona simplemente cambiando la clase css del contenedor del mapa y luego llamando a updateSize()

function toggleFullScreen(mapContainer) {
    if ($(mapContainer).hasClass("normal")) {
        $(mapContainer).addClass("fullscreen").removeClass("normal");
    } else {
        $(mapContainer).addClass("normal").removeClass("fullscreen");
    }
    map.updateSize();
}

3voto

Brent Chapman Puntos 935

Otro comentario a la primera respuesta (correcta):

El evento timeout es necesario si se espera el evento window.resize. De lo contrario, el mapa será redimensionado cada milisegundo si un usuario comienza a redimensionar la ventana (lo necesitaba para Firefox). Por lo tanto, si quieres comprobar el tamaño de la ventana, entonces el tiempo de espera es muy útil o necesario. Ver: https://stackoverflow.com/questions/5489946/jquery-how-to-wait-for-the-end-or-resize-event-and-only-then-perform-an-ac o Evento jQuery resize end

(lo siento, no puedo añadir un comentario, por lo tanto otra respuesta)

2voto

Jim Crandall Puntos 111

No es elegante, pero me ha funcionado bien

window.onresize = function(event)
{
   map.zoomOut(); map.zoomIn();
}

0 votos

esta fue la única respuesta que me funcionó

1voto

Danny Beckett Puntos 217

He probado todas las cosas descritas aquí pero nada me ha funcionado. Entonces, me di cuenta de que cuando estaba poniendo una clase de 'pantalla completa' al mapa el evento de cambio de tamaño no se disparó. Esto lo arreglé con:

$(window).trigger('resize');

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X