Mapbox GL in ReactNative

Sanjana Human In Tech
5 min readDec 31, 2023
Mapbox GL JS in React native

Mapbox GL is a powerful mapping library that allows you to integrate interactive and customizable maps into your React Native applications.

To implement Mapbox GL in a React Native project, you can use the @react-native-mapbox-gl/maps library, which is an official wrapper for Mapbox GL in React Native.

Here are the general steps to implement Mapbox GL in a React Native project:

Install the Mapbox GL Library

You can install the Mapbox GL library using npm or yarn. Run one of the following commands:

# Using npm
npm install @react-native-mapbox-gl/maps

# Using yarn
yarn add @react-native-mapbox-gl/maps

Set Up Mapbox

Create a Mapbox account if you don’t have one already. Obtain your Mapbox access token from the Mapbox website.

Add MapView to Your Component

Now, you can use the MapView component provided by the @react-native-mapbox-gl/maps library in your React Native component.

Here's an example:

import React from 'react';
import MapboxGL from '@react-native-mapbox-gl/maps';

MapboxGL.setAccessToken('YOUR_MAPBOX_ACCESS_TOKEN');

const App = () => {
return (
<MapboxGL.MapView
style={{ flex: 1 }}
zoomLevel={15}
centerCoordinate={[longitude, latitude]}
>
<MapboxGL.Camera
zoomLevel={15}
centerCoordinate={[longitude, latitude]}
/>
<MapboxGL.PointAnnotation
id="markerId"
coordinate={[longitude, latitude]}
/>
</MapboxGL.MapView>
);
};

export default App;

Replace YOUR_MAPBOX_ACCESS_TOKEN with the access token you obtained from Mapbox. Also, replace longitude and latitude with the initial coordinates you want to display.

Display MapView

import React from 'react';
import MapboxGL from '@react-native-mapbox-gl/maps';

MapboxGL.setAccessToken('YOUR_MAPBOX_ACCESS_TOKEN');

const App = () => {

const region = () => {
lattitude: "36.998",
longitude: "-122.990";
lattitudeDelta: "0.5:";
longtideDelta : "0.5;
};

return (
<MapboxGL.MapView
style={{ flex: 1 }}
zoomLevel={15}
centerCoordinate={[longitude, latitude]}
>
<MapboxGL.Camera
{...region}
zoomLevel={15}
/>
</MapboxGL.MapView>
);
};

export default App;

Add Markers:

To add markers to the Mapbox GL map in React Native, you can use the MapboxGL.PointAnnotation component. Here's an updated example that adds markers to the map:

import React from 'react';
import MapboxGL from '@react-native-mapbox-gl/maps';

MapboxGL.setAccessToken('YOUR_MAPBOX_ACCESS_TOKEN');

const App = () => {
const markers = [
{ id: 'marker1', title: 'Marker 1', coordinates: [-74.006, 40.7128] },
{ id: 'marker2', title: 'Marker 2', coordinates: [-73.975, 40.7298] },
// Add more markers as needed
];

return (
<MapboxGL.MapView
style={{ flex: 1 }}
zoomLevel={10}
centerCoordinate={markers[0].coordinates}
>
<MapboxGL.Camera
zoomLevel={10}
centerCoordinate={markers[0].coordinates}
/>

{markers.map((marker) => (
<MapboxGL.PointAnnotation
key={marker.id}
id={marker.id}
coordinate={marker.coordinates}
>
<MapboxGL.Callout title={marker.title} />
</MapboxGL.PointAnnotation>
))}
</MapboxGL.MapView>
);
};

export default App;

To add markers to the Mapbox GL map in React Native, you can use the MapboxGL.PointAnnotation component. Here's an updated example that adds markers to the map

import React from 'react';
import MapboxGL from '@react-native-mapbox-gl/maps';

MapboxGL.setAccessToken('YOUR_MAPBOX_ACCESS_TOKEN');

const App = () => {
const markers = [
{ id: 'marker1', title: 'Marker 1', coordinates: [-74.006, 40.7128] },
{ id: 'marker2', title: 'Marker 2', coordinates: [-73.975, 40.7298] },
// Add more markers as needed
];

return (
<MapboxGL.MapView
style={{ flex: 1 }}
zoomLevel={10}
centerCoordinate={markers[0].coordinates}
>
<MapboxGL.Camera
zoomLevel={10}
centerCoordinate={markers[0].coordinates}
/>

{markers.map((marker) => (
<MapboxGL.PointAnnotation
key={marker.id}
id={marker.id}
coordinate={marker.coordinates}
>
<MapboxGL.Callout title={marker.title} />
</MapboxGL.PointAnnotation>
))}
</MapboxGL.MapView>
);
};

export default App;

In this example, the markers array contains information about each marker, including an id, title, and coordinates. The MapboxGL.PointAnnotation component is used to place each marker on the map, and a MapboxGL.Callout is added to display additional information when a marker is tapped.

Feel free to customize the markers array with your own marker data. This example assumes a simple static list of markers, but you can dynamically generate markers based on your application's requirements.

Customize Map Styling:

import React from 'react';
import MapboxGL from '@react-native-mapbox-gl/maps';

MapboxGL.setAccessToken('YOUR_MAPBOX_ACCESS_TOKEN');

const App = () => {
const customMapStyle = {
version: 8,
sources: {
'raster-tiles': {
type: 'raster',
tiles: ['https://a.tile.openstreetmap.org/{z}/{x}/{y}.png'],
tileSize: 256,
},
},
layers: [
{
id: 'simple-tiles',
type: 'raster',
source: 'raster-tiles',
minzoom: 0,
maxzoom: 22,
},
],
};

return (
<MapboxGL.MapView
style={{ flex: 1 }}
zoomLevel={10}
centerCoordinate={[-74.006, 40.7128]}
styleURL={customMapStyle} // Provide your custom map style here
>
<MapboxGL.Camera
zoomLevel={10}
centerCoordinate={[-74.006, 40.7128]}
/>
</MapboxGL.MapView>
);
};

export default App;

In this example, the customMapStyle variable contains a simple custom map style represented as a JSON object. This example uses a raster tile source from OpenStreetMap.

You can customize the customMapStyle object based on your preferences or use a style URL provided by Mapbox. Style URLs typically start with "mapbox://styles/mapbox/" followed by the style name (e.g., "streets-v11", "outdoors-v11", etc.).

Draw Map Layering:

import React from 'react';
import MapboxGL from '@react-native-mapbox-gl/maps';

MapboxGL.setAccessToken('YOUR_MAPBOX_ACCESS_TOKEN');

const App = () => {
const customMapStyle = {
version: 8,
sources: {
'raster-tiles': {
type: 'raster',
tiles: ['https://a.tile.openstreetmap.org/{z}/{x}/{y}.png'],
tileSize: 256,
},
},
layers: [
{
id: 'simple-tiles',
type: 'raster',
source: 'raster-tiles',
minzoom: 0,
maxzoom: 22,
},
{
id: 'custom-line-layer',
type: 'line',
source: 'raster-tiles', // Use the same source as the raster layer
layout: {},
paint: {
'line-color': '#FF0000', // Line color (red in this example)
'line-width': 2, // Line width in pixels
},
},
],
};

return (
<MapboxGL.MapView
style={{ flex: 1 }}
zoomLevel={10}
centerCoordinate={[-74.006, 40.7128]}
styleURL={customMapStyle}
>
<MapboxGL.Camera
zoomLevel={10}
centerCoordinate={[-74.006, 40.7128]}
/>
</MapboxGL.MapView>
);
};

export default App;

In this example, a custom line layer is added to the map with the ID 'custom-line-layer'. The layer uses the same source ('raster-tiles') as the raster layer, but you can define additional sources if needed.

Adjust the paint and layout properties in the layer to customize the appearance of the line. You can explore the Mapbox Style Specification for more details on available properties: Mapbox Style Specification - Line Layer.

Congratulations on mastering the essentials of implementing custom map layers, enhancing user interactions, visualizing dynamic data, and enabling offline maps with Mapbox in your React Native applications!

These examples serve as a robust foundation for unlocking the advanced capabilities and endless possibilities that Mapbox offers. As you continue your exploration, you’ll find that Mapbox empowers you to create truly engaging and personalized map experiences tailored to the unique needs of your application. Keep innovating and building amazing location-based features!

Thank you for reading this article! Don’t forget to clap.

If you have any queries related to ReactNative, I’m always happy to help you. You can reach me on LinkedIn and Gmail.

--

--

Sanjana Human In Tech

A React Native front-end enthusiast and dedicated development engineer, eager to expand knowledge on development techniques and collaborate with others.