Skip to main content

Camera

Controls the perspective from which the user sees the map. The Camera component manages the map’s center coordinate, zoom level, bearing, and pitch.

Import

import { Camera } from '@rnmapbox/maps';

Basic Usage

import { MapView, Camera } from '@rnmapbox/maps';

function MyMap() {
  return (
    <MapView style={{ flex: 1 }}>
      <Camera
        centerCoordinate={[-74.006, 40.7128]}
        zoomLevel={14}
        pitch={45}
        heading={0}
      />
    </MapView>
  );
}

Imperative Methods

To use imperative methods, pass in a ref object:
import { useRef, useEffect } from 'react';
import { MapView, Camera } from '@rnmapbox/maps';

function MyMap() {
  const cameraRef = useRef<Camera>(null);

  useEffect(() => {
    cameraRef.current?.setCamera({
      centerCoordinate: [-74.006, 40.7128],
      zoomLevel: 14,
      animationDuration: 2000,
    });
  }, []);

  return (
    <MapView style={{ flex: 1 }}>
      <Camera ref={cameraRef} />
    </MapView>
  );
}

Props

centerCoordinate

centerCoordinate
[longitude: number, latitude: number]
The location on which the map should center.
<Camera centerCoordinate={[-122.4194, 37.7749]} />

bounds

bounds
{ ne: Position, sw: Position, paddingTop?: number, paddingRight?: number, paddingBottom?: number, paddingLeft?: number }
The corners of a box around which the map should bound. Contains padding props for backwards compatibility; the root padding prop should be used instead.
<Camera
  bounds={{
    ne: [-122.4, 37.8],
    sw: [-122.5, 37.7],
  }}
/>

heading

heading
number
The heading (orientation) of the map in degrees, where 0° is north.
<Camera heading={90} /> {/* East */}

pitch

pitch
number
The pitch (tilt) of the map in degrees, where 0° is looking straight down.
<Camera pitch={45} />

zoomLevel

zoomLevel
number
The zoom level of the map. Higher values zoom in closer.
<Camera zoomLevel={14} />

padding

padding
{ paddingLeft: number, paddingRight: number, paddingTop: number, paddingBottom: number }
The viewport padding in points.
<Camera
  padding={{
    paddingTop: 50,
    paddingBottom: 50,
    paddingLeft: 20,
    paddingRight: 20,
  }}
/>

animationDuration

animationDuration
number
The duration the map takes to animate to a new configuration, in milliseconds.
<Camera
  centerCoordinate={[-122.4194, 37.7749]}
  animationDuration={2000}
/>

animationMode

animationMode
'flyTo' | 'easeTo' | 'linearTo' | 'moveTo' | 'none'
The easing or path the camera uses to animate to a new configuration.
  • flyTo - Smooth, realistic “flying” animation
  • easeTo - Smooth easing animation
  • linearTo - Linear animation
  • moveTo - Instant movement
  • none - No animation
<Camera
  centerCoordinate={[-122.4194, 37.7749]}
  animationMode="flyTo"
  animationDuration={3000}
/>

followUserLocation

followUserLocation
boolean
Whether the map orientation follows the user location.
<Camera followUserLocation={true} followZoomLevel={16} />

followUserMode

followUserMode
UserTrackingMode
The mode used to track the user location on the map.
  • UserTrackingMode.Follow - Follow user location
  • UserTrackingMode.FollowWithHeading - Follow with compass heading
  • UserTrackingMode.FollowWithCourse - Follow with course direction
import { Camera, UserTrackingMode } from '@rnmapbox/maps';

<Camera
  followUserLocation={true}
  followUserMode={UserTrackingMode.FollowWithHeading}
/>

followZoomLevel

followZoomLevel
number
The zoom level used when following the user location.
<Camera followUserLocation={true} followZoomLevel={16} />

followPitch

followPitch
number
The pitch used when following the user location.
<Camera followUserLocation={true} followPitch={45} />

followHeading

followHeading
number
The heading used when following the user location.

followPadding

followPadding
Partial<{ paddingLeft: number, paddingRight: number, paddingTop: number, paddingBottom: number }>
The padding used to position the user location when following.
<Camera
  followUserLocation={true}
  followPadding={{ paddingBottom: 200 }}
/>

minZoomLevel

minZoomLevel
number
The lowest allowed zoom level.
<Camera minZoomLevel={5} maxZoomLevel={18} />

maxZoomLevel

maxZoomLevel
number
The highest allowed zoom level.
<Camera minZoomLevel={5} maxZoomLevel={18} />

maxBounds

maxBounds
{ ne: Position, sw: Position }
The corners of a box defining the limits of where the camera can pan or zoom.
<Camera
  maxBounds={{
    ne: [-122.0, 38.0],
    sw: [-123.0, 37.0],
  }}
/>

defaultSettings

defaultSettings
CameraStop
The configuration that the camera falls back on if no other values are specified.
<Camera
  defaultSettings={{
    centerCoordinate: [-122.4194, 37.7749],
    zoomLevel: 12,
  }}
/>

allowUpdates

allowUpdates
boolean
default:"true"
Whether the camera should send any configuration to the native module. Prevents unnecessary tile fetching and improves performance when the map is not visible.
<Camera allowUpdates={isMapVisible} />

triggerKey

triggerKey
string | number
Any arbitrary primitive value that, when changed, causes the camera to retry moving to its target configuration. (Not yet implemented.)

onUserTrackingModeChange

onUserTrackingModeChange
(event: MapboxGLEvent) => void
Deprecated: Use Viewport#onStatusChanged instead.
Executes when user tracking mode changes.

Methods

setCamera()

setCamera(config: CameraStop | CameraStops): void
Sets any camera properties, with default fallbacks if unspecified.
cameraRef.current?.setCamera({
  centerCoordinate: [-122.4194, 37.7749],
  zoomLevel: 14,
  pitch: 45,
  animationDuration: 2000,
  animationMode: 'flyTo',
});
CameraStop Properties:
  • centerCoordinate?: [number, number]
  • bounds?: { ne: Position, sw: Position }
  • heading?: number
  • pitch?: number
  • zoomLevel?: number
  • padding?: CameraPadding
  • animationDuration?: number
  • animationMode?: CameraAnimationMode

fitBounds()

fitBounds(
  ne: Position,
  sw: Position,
  paddingConfig?: number | number[],
  animationDuration?: number
): void
Set the camera position to enclose the provided bounds, with optional padding and duration.
// Simple bounds
cameraRef.current?.fitBounds(
  [-122.4, 37.8],  // northeast
  [-122.5, 37.7],  // southwest
);

// With padding and animation
cameraRef.current?.fitBounds(
  [-122.4, 37.8],
  [-122.5, 37.7],
  [20, 40],  // [vertical, horizontal] padding
  1000       // 1 second animation
);

// With all-side padding
cameraRef.current?.fitBounds(
  [-122.4, 37.8],
  [-122.5, 37.7],
  [20, 40, 20, 40],  // [top, right, bottom, left]
  1000
);

flyTo()

flyTo(
  centerCoordinate: Position,
  animationDuration?: number
): void
Sets the camera to center around the provided coordinate using a realistic “travel” animation.
cameraRef.current?.flyTo([-122.4194, 37.7749]);
cameraRef.current?.flyTo([-122.4194, 37.7749], 3000);

moveTo()

moveTo(
  centerCoordinate: Position,
  animationDuration?: number
): void
Sets the camera to center around the provided coordinate, with optional duration.
cameraRef.current?.moveTo([-122.4194, 37.7749]);
cameraRef.current?.moveTo([-122.4194, 37.7749], 500);

zoomTo()

zoomTo(
  zoomLevel: number,
  animationDuration?: number
): void
Zooms the camera to the provided level, with optional duration.
cameraRef.current?.zoomTo(16);
cameraRef.current?.zoomTo(16, 1000);

moveBy()

moveBy(props: {
  x: number;
  y: number;
  animationMode?: 'easeTo' | 'linearTo';
  animationDuration?: number;
}): void
Move the map by a given screen coordinate offset with optional animation. Useful for Android Auto or CarPlay pan gestures.
cameraRef.current?.moveBy({ x: 100, y: 50 });

cameraRef.current?.moveBy({
  x: 100,
  y: 50,
  animationMode: 'easeTo',
  animationDuration: 500,
});

scaleBy()

scaleBy(props: {
  x: number;
  y: number;
  scaleFactor: number;
  animationMode?: 'easeTo' | 'linearTo';
  animationDuration?: number;
}): void
Scale the map with optional animation. Useful for Android Auto pinch gestures or double tap.
cameraRef.current?.scaleBy({
  x: 200,
  y: 200,
  scaleFactor: 2.0,  // zoom in
});

cameraRef.current?.scaleBy({
  x: 200,
  y: 200,
  scaleFactor: 0.5,  // zoom out
  animationMode: 'easeTo',
  animationDuration: 300,
});

Examples

import { MapView, Camera } from '@rnmapbox/maps';

function BasicCamera() {
  return (
    <MapView style={{ flex: 1 }}>
      <Camera
        centerCoordinate={[-74.006, 40.7128]}
        zoomLevel={14}
        pitch={45}
        heading={90}
      />
    </MapView>
  );
}

Build docs developers (and LLMs) love