![Oracle Drags Its Feet in the JavaScript Trademark Dispute](https://cdn.sanity.io/images/cgdhsj6q/production/919c3b22c24f93884c548d60cbb338e819ff2435-1024x1024.webp?w=400&fit=max&auto=format)
Security News
Oracle Drags Its Feet in the JavaScript Trademark Dispute
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
react-leaflet
Advanced tools
The react-leaflet package is a React wrapper for the Leaflet library, which is a popular open-source JavaScript library for interactive maps. It allows developers to easily integrate and manipulate maps within React applications.
Displaying a Map
This code sample demonstrates how to display a basic map using react-leaflet. The MapContainer component is used to create the map, and the TileLayer component is used to add a tile layer from OpenStreetMap.
import { MapContainer, TileLayer } from 'react-leaflet';
function MyMap() {
return (
<MapContainer center={[51.505, -0.09]} zoom={13} style={{ height: '100vh', width: '100%' }}>
<TileLayer
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
attribution="© <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors"
/>
</MapContainer>
);
}
Adding Markers
This code sample shows how to add a marker to the map. The Marker component is used to place a marker at a specific position, and the Popup component is used to display a popup when the marker is clicked.
import { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet';
function MyMap() {
return (
<MapContainer center={[51.505, -0.09]} zoom={13} style={{ height: '100vh', width: '100%' }}>
<TileLayer
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
attribution="© <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors"
/>
<Marker position={[51.505, -0.09]}>
<Popup>
A pretty CSS3 popup. <br /> Easily customizable.
</Popup>
</Marker>
</MapContainer>
);
}
Drawing Shapes
This code sample demonstrates how to draw a polygon on the map. The Polygon component is used to create a polygon shape by specifying an array of latitude and longitude coordinates.
import { MapContainer, TileLayer, Polygon } from 'react-leaflet';
function MyMap() {
const polygon = [
[51.505, -0.09],
[51.51, -0.1],
[51.51, -0.12]
];
return (
<MapContainer center={[51.505, -0.09]} zoom={13} style={{ height: '100vh', width: '100%' }}>
<TileLayer
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
attribution="© <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors"
/>
<Polygon positions={polygon} />
</MapContainer>
);
}
react-map-gl is a React wrapper for Mapbox GL JS, which is a powerful library for interactive maps. It offers more advanced features and customization options compared to react-leaflet, but it requires a Mapbox access token.
google-maps-react is a library for integrating Google Maps into React applications. It provides a simple API for adding maps and markers, but it is dependent on the Google Maps API, which may have usage limits and requires an API key.
react-google-maps is another library for using Google Maps in React applications. It offers a more declarative approach compared to google-maps-react and includes additional features like drawing tools and heatmaps.
React components for Leaflet maps.
npm install react-leaflet
React, ReactDOM and Leaflet are peer dependencies, if you haven't already installed them use:
npm install leaflet react react-dom react-leaflet
An UMD build is also available on npmcdn:
<script src="https://npmcdn.com/react-leaflet/dist/react-leaflet.min.js"></script>
The library is injected as window.ReactLeaflet
.
If you are not familiar with Leaflet, make sure you read its quick start guide first. You will need to add its CSS to your page to render the components properly.
All components are React wrappers for Leaflet elements and layers, they need a map instance and therefore must be included in a top-level <Map>
component.
Leaflet example
import L from 'leaflet';
const position = [51.505, -0.09];
const map = L.map('map').setView(position, 13);
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
L.marker(position).addTo(map)
.bindPopup('A pretty CSS3 popup. <br> Easily customizable.');
React-Leaflet
import React from 'react';
import { render } from 'react-dom';
import { Map, Marker, Popup, TileLayer } from 'react-leaflet';
const position = [51.505, -0.09];
const map = (
<Map center={position} zoom={13}>
<TileLayer
url='http://{s}.tile.osm.org/{z}/{x}/{y}.png'
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
/>
<Marker position={position}>
<Popup>
<span>A pretty CSS3 popup.<br/>Easily customizable.</span>
</Popup>
</Marker>
</Map>
);
render(map, document.getElementById('map-container'));
Note that the <Map>
component creates its own <div>
container for the map, it does not get attached to an existing node.
This library uses React components as an interface, but not the virtual DOM, as all the DOM manipulations are managed by Leaflet, so there are a few things to keep in mind when using it:
key
property so that they are properly handled by React's algorithm.setIconDefaultImagePath(path: string): Setter for Leaflet.Icon.Default.imagePath
, set to //cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images
by default.
children: One PropTypes.node
or an Array of PropTypes.node
.
latLng: One of [number, number]
, {lat: number, lng: number}
or {lat: number, lon: number}
.
latLngList: An Array of LatLng.
bounds: An instance of Leaflet.LatLngBounds or a LatLngList.
controlPosition: One of topleft
, topright
, bottomleft
or bottomright
.
layerContainer: An object containing addLayer()
and removeLayer()
functions.
Leaflet exposes its own events, different from React. You can listen to them using React-Leaflet by adding a callback to a property prefixed by on
. Ex: <Map onMoveend={this.handleMoveend}>...</Map>
.
Check Leaflet documentation for the events associated to each component.
The properties documented as dynamic properties are updated using the relevant Leaflet setter, other properties will not update the component when they are changed after the component is mounted.
All other properties are passed as the options
argument to their corresponding Leaflet element and should work fine for static maps, it is however unlikely that they would updated if you change them afterwards.
You can directly access the Leaflet element created by a component using the getLeafletElement()
method on this component. This leaflet element is usually created in componentWillMount()
, except for the Map
component where it can only be created after the <div>
container is rendered.
These components are base classes used by other components. They can be extended to create custom components but should not be used directly.
Base class extending React.Component
and handling events binding and unbind.
It exposes a getLeafletElement()
method to access the Leaflet
object created for the component.
Base class extending React.Component
for controls.
It exposes a getLeafletElement()
method to access the Leaflet
object created for the control.
Base class extending MapComponent
using the provided map
prop to add its element and passing it down to its children.
It exposes the following methods:
getClonedChildrenWithMap(object extra): object
: returns the cloned children of the component, adding the map
and the extra
props provided to them.renderChildrenWithProps(object props): object
: returns the cloned children of the component using getClonedChildrenWithMap()
, wrapped in a <div>
with display: none
style.Base class extending MapLayer
with a render()
method and handling a TitleLayer opacity
and zIndex
props.
Base class extending MapLayer
with the following methods:
getPathOptions(object props): object
: filters the input props
and return a new object of Path options properties.setStyle(object options = {}): void
: alias to the Leaflet element setStyle()
.setStyleIfChanged(object fromProps, object toProps): void
: extracts the Path options of the two arguments, and calls setStyle()
with the new options if different from the previous ones.This is the top-level component that must be mounted for children ones to be rendered. Refer to Leaflet documentation for more information about the properties.
Dynamic properties
animate: boolean
(optional): If true
, panning will always be animated if possible. Defaults to false
.bounds: bounds
(optional): A rectangle for the map to contain. It will be centered, and the map will zoom in as close as it can while still showing the full bounds. This property is dynamic, if you change it it will be reflected on the map.boundsOptions: object
(optional): Options passed to the fitBounds()
method.center: latLng
(optional): Center of the map. This property is dynamic, if you change it it will be reflected in the map.className: string
(optional): className property of the <div>
container for the map.maxBounds: bounds
(optional)style: object
(optional): style property of the <div>
container for the map.zoom: number
(optional)Other properties
id: string
(optional): The ID of the <div>
container for the map. If you don't provide it, a unique one will be created.Dynamic properties
position: latLng
(required)draggable: boolean
(optional)icon: Leaflet.Icon
(optional)zIndexOffset: number
(optional)opacity: number
(optional)The Popup children will be rendered using ReactDOM.render()
, they must be valid React elements.
Dynamic properties
position: latLng
(optional)Dynamic properties
url: string
(required)opacity: number
(optional)zIndex: number
(optional)Dynamic properties
url: string
(required)opacity: number
(optional)All vector layers extend the Path component and therefore accept dynamic Path options properties.
Dynamic properties
center: latLng
(required)radius: number
(required)Dynamic properties
center: latLng
(required)radius: number
(optional)Dynamic properties
positions: latLngList
(required)Dynamic properties
polylines: array<latLngList>
(required)Dynamic properties
positions: latLngList | Array<latLngList>
(required)Dynamic properties
polygons: array<latLngList>
(required)Dynamic properties
bounds: bounds
(required, dynamic)Use the LayerGroup
wrapper component to group children layers together.
Extended LayerGroup
supporting a Popup
child.
Properties
data: GeoJSON
(required). This property will not be updated if it is changed after the component is mounted.Dynamic properties
position: controlPosition
(optional)Dynamic properties
position: controlPosition
(optional)This component exposes two children container components, LayersControl.BaseLayer
and LayersControl.Overlay
documented below.
See the layers-control
example for a more advanced usage.
Example usage:
<LayersControl position='topright'>
<LayersControl.BaseLayer name='OpenStreetMap.BlackAndWhite'>
<TileLayer
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url='http://{s}.tiles.wmflabs.org/bw-mapnik/{z}/{x}/{y}.png'
/>
</LayersControl.BaseLayer>
<LayersControl.BaseLayer name='OpenStreetMap.Mapnik'>
<TileLayer
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url='http://{s}.tile.osm.org/{z}/{x}/{y}.png'
/>
</LayersControl.BaseLayer>
<LayersControl.Overlay name='Marker with popup'>
<Marker position={[51.51, -0.06]}>
<Popup>
<span>A pretty CSS3 popup. <br/> Easily customizable.</span>
</Popup>
</Marker>
</LayersControl.Overlay>
<LayersControl.Overlay name='Feature group'>
<FeatureGroup color='purple'>
<Popup>
<span>Popup in FeatureGroup</span>
</Popup>
<Circle center={[51.51, -0.06]} radius={200} />
</FeatureGroup>
</LayersControl.Overlay>
</LayersControl>
Properties
name: string
(required). The name of the layer as appearing in the LayersControl
.Dynamic properties
checked: boolean
(optional, defaults to false
). Whether the radio button associated to the layer should be checked or not. The layer will be displayed in the map accordingly.Properties
name: string
(required). The name of the layer as appearing in the LayersControl
.Dynamic properties
checked: boolean
(optional, defaults to false
). Whether the checkbox associated to the layer should be checked or not. The layer will be displayed in the map accordingly.Dynamic properties
position: controlPosition
(optional)Dynamic properties
position: controlPosition
(optional)If you want to create custom components, for example Leaflet plugins, you could extend one of the base components depending on the type of component you want to implement.
The created Leaflet map instance is injected by the Map
component to all its children as the map
property. Other layers may inject themselves to their children as the layerContainer
property.
Make sure to inject both layerContainer
and map
in your component's children as well.
See CHANGELOG file.
MIT
See LICENSE file.
FAQs
React components for Leaflet maps
The npm package react-leaflet receives a total of 0 weekly downloads. As such, react-leaflet popularity was classified as not popular.
We found that react-leaflet demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
Security News
The Linux Foundation is warning open source developers that compliance with global sanctions is mandatory, highlighting legal risks and restrictions on contributions.
Security News
Maven Central now validates Sigstore signatures, making it easier for developers to verify the provenance of Java packages.