es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tamaño del mapa al representar mapbox en React.

Estoy tratando de usar mapbox GL para renderizar un mapa en React.
He dividido mi pantalla en 4 (2 col/crow) con Grid con el siguiente css:

.container {
    font-family: sans-serif;
    margin: 0;
    display: grid;
    grid-template-rows: 1fr 7fr;
    grid-template-columns: auto;
    gap: 5px;
    grid-template-areas: "cr1 cr2"
                         "cr1 cr4";
    height: 100vh;
    width: 200vh;
    background-color: chartreuse;
}

.table {
    grid-area: cr1 ;
    background-color: aqua;
    display: flex;
    justify-content: center;
    align-items: center;
}

.tank-select {
    grid-area: cr2;
    background-color: grey;
}

.map {
    grid-area: cr4;
    display: flex;
    justify-content:space-around;
    align-items:stretch;
    background-color: blueviolet;
}

Me gustaría tener el mapa en el cuadro cr4 con el siguiente código:

  <div classname="container">
      <div classname="table">test</div>
      <div classname="tank-select">test2</div>
      <div classname="map">
        <map></map>
      </div>
    </div>

El mapa se calcula de la siguiente manera:

const mapContainerRef = useRef(null)

  const [lng, setLng] = useState(5)
  const [lat, setLat] = useState(34)
  const [zoom, setZoom] = useState(1.5)

  // Initialize map when component mounts
  useEffect(() => {
    const map = new mapboxgl.Map({
      container: mapContainerRef.current,
      style: 'mapbox://styles/mapbox/streets-v11',
      center: [lng, lat],
      zoom: zoom,
    })

    // Add navigation control (the +/- zoom buttons)
    map.addControl(new mapboxgl.NavigationControl(), 'top-right')

    map.on('move', () => {
      setLng(map.getCenter().lng.toFixed(4))
      setLat(map.getCenter().lat.toFixed(4))
      setZoom(map.getZoom().toFixed(2))
    })

    // const marker = new mapboxgl.Marker().setLngLat(TankLocationArray).addTo(map)
    //
    map.on('load', function () {
      map.addSource('route', {
        type: 'geojson',
        data: '../../assets/data/test.geoJSON',
      })

      map.addLayer({
        id: 'route',
        type: 'symbol',
        source: 'route',
        paint: {
          'circle-radius': 10,
          'circle-color': '#ff0000',
        },
      })
    })
    //

    // Clean up on unmount
    return () => map.remove()
  }, []) // eslint-disable-line react-hooks/exhaustive-deps

  return (
    <div>
      <div classname="sidebarStyle">
        <div>
          Longitude: {lng} | Latitude: {lat} | Zoom: {zoom}
        </div>
      </div>
      <div classname="map-container" ref="{mapContainerRef}"></div>
    </div>

Con el css:

.map-container {
    position:relative;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
  }

  .sidebarStyle {
    display: inline-block;
    position: absolute;
    top: 0;
    left: 0;
    margin: 12px;
    background-color: #404040;
    color: #ffffff;
    z-index: 1 !important;
    padding: 6px;
    font-weight: bold;
  }

Cuando cambio la posición de map-container de relative a absolute, el mapa tomará toda la pantalla, de lo contrario, no será visible.

No sé cómo hacer un estilo para que el mapa aparezca solo en el cuadro map (cr4).
Gracias por la ayuda.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para que el mapa aparezca solo en la caja con la clase “map” (cr4), puedes añadir un poco de CSS para asegurarte de que el contenedor del mapa (ref={mapContainerRef}) tiene la misma altura y ancho que su contenedor padre (el div con la clase “map”).

    Aquí está el CSS que puedes añadir:

    .map {
      position: relative;
    }
    
    .map .map-container {
      position: absolute;
      top: 0;
      left: 0;
      bottom: 0;
      right: 0;
    }
    

    Este CSS asegura que el div “.map” está posicionado como relativo (lo cual ya lo está) y el div “.map-container” (que es el que contiene el mapa en sí) está posicionado como absoluto con las dimensiones establecidas al tamaño completo de su contenedor padre.

    Con este CSS en su lugar, el mapa debe aparecer correctamente en la caja con la clase “map” y no ocupar toda la pantalla.

Comments are closed.