'React-Leaflet marker files not found
I've got very simple code to display a map using react-leaflet and place a marker on it. However, i get the following two errors in my browser console
GET http://localhost:8080/marker-icon-2x.png 404 (Not Found)
GET http://localhost:8080/marker-shadow.png 404 (Not Found)
I tried to fix this issue by downloading those two images and placing them at the root. It works. However, how can i change the URL the react-leaflet marker element looks for the marker images? I'd like to store them in "./images" rather than at the root.
Solution 1:[1]
Try to do this :)
React leaflet for some reason do not include images and you will need to reset default icons image.
Below is some working example, I hope it will solve your issue.
You also can add icons from one of public link
https://cdnjs.com/libraries/Leaflet.awesome-markers
import React, { Component } from 'react';
import L from 'leaflet';
import {
Map, TileLayer, Marker, Popup
} from 'react-leaflet'
import 'leaflet/dist/leaflet.css';
import './style.css';
import icon from 'leaflet/dist/images/marker-icon.png';
import iconShadow from 'leaflet/dist/images/marker-shadow.png';
let DefaultIcon = L.icon({
iconUrl: icon,
shadowUrl: iconShadow
});
L.Marker.prototype.options.icon = DefaultIcon;
Solution 2:[2]
Here is the solution that worked for me:
I added the following lines in the top of the file:
import { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet';
import 'leaflet/dist/leaflet.css';
import L from 'leaflet';
delete L.Icon.Default.prototype._getIconUrl;
L.Icon.Default.mergeOptions({
iconRetinaUrl: require('leaflet/dist/images/marker-icon-2x.png').default,
iconUrl: require('leaflet/dist/images/marker-icon.png').default,
shadowUrl: require('leaflet/dist/images/marker-shadow.png').default
});
Solution 3:[3]
It seems not all stuff is properly integrated together when using react, leaflet and react-leaflet. I had the same problem and found this
https://github.com/PaulLeCam/react-leaflet/issues/453
You need to setup leafelet itself again, as something brokes after importing leaflet.css.
Hope it helps
Solution 4:[4]
Adding answer for Next.js
Copy over marker icon from
node_modules/leaflet/dist/images
topublic/images
something like/images/marker-icon.png
Create Leaflet icon reference and use the reference in Marker
const icon = L.icon({ iconUrl: "/images/marker-icon.png" });
// some other code
<Marker key={obj.id} position={position} icon={icon}>
// rest of the code
Solution 5:[5]
Copy all images from leaflet package to the public directory:
cp node_modules/leaflet/dist/images/* {PUBLIC_WEB_DIRECTORY}/leaflet_images/
Fix the path in Leaflet
import L from 'leaflet';
L.Icon.Default.imagePath='leaflet_images/';
Solution 6:[6]
What ended up fixing this for me was removing:
import 'leaflet/dist/leaflet.css';
from the file in which my map components was in. I ended up importing leaflet css through the create-react-app index.html file and my marker was able to load alongside my map. Hope this helps anyone stuck.
Solution 7:[7]
Elaborated answer from @ch4nd4n's answer and adapted for leaflet (v1.8.0) for reactjs (v17).
import iconMarker from 'leaflet/dist/images/marker-icon.png'
import iconRetina from 'leaflet/dist/images/marker-icon-2x.png'
import iconShadow from 'leaflet/dist/images/marker-shadow.png'
Then,
const icon = L.icon({
iconRetinaUrl:iconRetina,
iconUrl: iconMarker,
shadowUrl: iconShadow
});
Add icon prop to the Marker
component.
<Marker key={index} position={[loc.lat, loc.long]} icon={icon}>
<Popup><h3>{loc.name}</h3> {loc.address}</Popup>
</Marker>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | Daniel James |
Solution 3 | develucas |
Solution 4 | ch4nd4n |
Solution 5 | ninja |
Solution 6 | a-maccormack |
Solution 7 | Nipuna |