NextJS Leaflet : Adding Geoman to Leaflet
Geoman is a powerful library that enables the creation and editing of geospatial data on maps. It integrates seamlessly with Leaflet, making it an excellent choice for anyone working with interactive web maps.
One of the best features of Geoman is its easy integration with Leaflet.js and React-Leaflet. This tool provides a range of useful features, including:
- Creating polygons for maps
- Completely free to use
- Excellent documentation
Integrating Geoman into Leaflet
In this tutorial, I’ll demonstrate how to integrate Geoman into a Next.js project using React-Leaflet. If you’re new to React-Leaflet integration, you can refer to this guide for a detailed explanation.
Step 1: Install Geoman
First, we need to install Geoman. For this example, we’ll use the free version of Leaflet-Geoman:
npm i @geoman-io/leaflet-geoman-free
Step 2: Add the CSS Module to layout.tsx
Next, we need to import the Geoman CSS file in the layout file to style the controls properly:
import "@geoman-io/leaflet-geoman-free/dist/leaflet-geoman.css";
Step 3: Import Geoman in the Map Component
Now, we import the Geoman module into the component responsible for rendering the map:
import "@geoman-io/leaflet-geoman-free";
Step 4: Initialize the Geoman Toolbar
We create a function to initialize the Geoman toolbar and add it to our map controls:
import { useMap } from 'react-leaflet';
import { useEffect } from 'react';
const AddGeomanControls = () => {
const map = useMap();
useEffect(() => {
map.pm.addControls({
position: 'topleft',
drawMarker: true,
drawPolygon: true,
drawPolyline: true,
drawCircle: true,
drawCircleMarker: true,
editMode: true,
dragMode: true,
cutPolygon: true,
removalMode: true,
});
map.on('pm:create', (e) => {
// Handle creation event here
console.log(e);
});
}, [map]);
return null;
};
In this example, useMap()
is used to access the map object, and the pm.addControls
method is used to add drawing and editing controls to the toolbar. We set various controls like drawing markers, polygons, circles, and enabling editing and dragging modes by setting the respective keys to true
.
map.pm.addControls({
position: 'topleft',
drawMarker: true,
drawPolygon: true,
drawPolyline: true,
drawCircle: true,
drawCircleMarker: true,
editMode: true,
dragMode: true,
cutPolygon: true,
removalMode: true,
});
The event handler:
map.on('pm:create', (e) => {
// Trigger actions when a shape is created
console.log(e);
});
This allows you to trigger specific actions, such as saving the drawn polygon or interacting with the created object when the user draws a shape on the map.
You can explore more about Geoman's toolbar controls here. By default, many controls are enabled, but you can customize them as needed.
Step 5: Add the Geoman Controls to the Map
Finally, we integrate the AddGeomanControls
function into the map component:
<MapContainer
className="h-[500px] w-full"
zoom={13}
scrollWheelZoom={false}
center={leafletCoordinates}
>
<TileLayer
attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
<Marker position={leafletCoordinates} icon={icon}>
<Popup>
{name} <br /> {address}
</Popup>
</Marker>
<GeoJSON data={dataGeoJSON} />
<AddGeomanControls />
</MapContainer>
You can find the full example code here on GitHub.
That’s it for this simple tutorial on integrating Geoman. In the next part, we’ll cover how to create dynamic maps and save the drawn shapes to a database.