Ejemplo de código
import { useRef } from 'react';
import { createGeoPoint, createMapCameraPosition, type MapCameraPosition } from '@mapconductor/js-sdk-core';
import { MapLibreDesign, MapLibreMapView, useMapLibreViewState } from '@mapconductor/react-for-maplibre';
import { LeafletDesign, LeafletMapView, useLeafletMapViewState } from '@mapconductor/react-for-leaflet';
// (1) Crear el mapa
const initialCamera = createMapCameraPosition({
position: createGeoPoint({ latitude: 35.6812, longitude: 139.7671 }),
zoom: 12,
});
// (2) Preparar los datos y el estado de interacción
const leftMapState = useMapLibreViewState({
mapDesignType: MapLibreDesign.OsmBrightJa,
cameraPosition: initialCamera,
});
const rightMapState = useLeafletMapViewState({
mapDesignType: LeafletDesign.OpenStreetMap,
cameraPosition: initialCamera,
});
const leftProgrammatic = useRef(false);
const rightProgrammatic = useRef(false);
// (3) Renderizar el mapa y sus capas
const syncCamera = (
source: 'left' | 'right',
camera: MapCameraPosition,
) => {
const targetState = source === 'left' ? rightMapState : leftMapState;
const targetGuard = source === 'left' ? rightProgrammatic : leftProgrammatic;
if (targetGuard.current) return;
targetGuard.current = true;
targetState.moveCameraTo(camera, 0);
requestAnimationFrame(() => { targetGuard.current = false; });
};
<div className="camera-grid">
<MapLibreMapView
state={leftMapState}
onCameraMove={camera => syncCamera('left', camera)}
/>
<LeafletMapView
state={rightMapState}
onCameraMove={camera => syncCamera('right', camera)}
/>
</div>
Cómo funciona el código
Transfiere los cambios de cámara entre dos proveedores renderizados de forma independiente y evita ciclos de actualización.
Esta página usa dos proveedores a la vez a propósito: useMapLibreViewState y useLeafletMapViewState crean cada uno un estado de vista separado que parte de la misma initialCamera.
syncCamera copia la cámara de un mapa sobre el otro con moveCameraTo(camera, 0), y un guard con useRef liberado en el siguiente requestAnimationFrame impide que la actualización reflejada rebote.