Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

react-leaflet get current latlng onClick

I would be realy happy if some one could help me... I've installed react-leaflet on my react project and the map component is loaded successfully, i need to get current latlng and show it in the Popup when i click on map but I don't know how to :(

please... please... help me...

this is my code

import React from 'react'
import { Map as LeafletMap, TileLayer, Marker, Popup } from 'react-leaflet';

class Mapp extends React.Component {
    componentDidMount() {

    }

    render() {
        return (
            <LeafletMap
                center={[35.755229,51.304470]}
                zoom={16}
                maxZoom={20}
                attributionControl={true}
                zoomControl={true}
                doubleClickZoom={true}
                scrollWheelZoom={true}
                dragging={true}
                animate={true}
                easeLinearity={0.35}
            >
                <TileLayer
                    url='http://{s}.tile.osm.org/{z}/{x}/{y}.png'
                />
                <Marker position={[35.755229,51.304470]}
                draggable={true}
                >
                    <Popup >
                        Popup for any custom information.
                    </Popup>

                </Marker>
            </LeafletMap>
        );
    }
}

export default Mapp;
like image 382
Maryam Alishahi Avatar asked Feb 03 '19 13:02

Maryam Alishahi


3 Answers

If you work with react-leaflet version 3.x this does not work. In this case, use the useMapEvents hook in a dummy component that you add to the map. For example, if you want to console.log the clicked position:

const LocationFinderDummy = () => {
    const map = useMapEvents({
        click(e) {
            console.log(e.latlng);
        },
    });
    return null;
};

Then use the LocationFinderDummy in the map as follows:

<MapContainer
    center={[0, 0]}
    zoom={6}>
    <LocationFinderDummy />
</MapContainer>
like image 129
Alex V. Avatar answered Oct 05 '22 13:10

Alex V.


Here is an example on how to display maker position in popup once map is clicked:

class MapExample extends Component {
  constructor(props) {
    super(props);
    this.state = {
      currentPos: null
    };
    this.handleClick = this.handleClick.bind(this);
  }


  handleClick(e){
    this.setState({ currentPos: e.latlng });
  }

  render() {
    return (
      <div>
        <Map center={this.props.center} zoom={this.props.zoom} onClick={this.handleClick}>
          <TileLayer
              url='http://{s}.tile.osm.org/{z}/{x}/{y}.png'
          />
          { this.state.currentPos && <Marker position={this.state.currentPos} draggable={true}>
            <Popup position={this.state.currentPos}>
              Current location: <pre>{JSON.stringify(this.state.currentPos, null, 2)}</pre>
            </Popup>
          </Marker>}
        </Map>
      </div>
    )
  }
}

Explanation:

  • currentPos state is used to keep marker position
  • event.latLng property of Map.onClick event handler returns mouse event location

Here is a demo for your reference

like image 14
Vadim Gremyachev Avatar answered Nov 20 '22 09:11

Vadim Gremyachev


What did you try to achieve that?

This will be the start:

Use the click (see https://leafletjs.com/reference-1.4.0.html#map-click) event from the LeafletMap component and call your function, like:

<LeafletMap
  center={[35.755229,51.304470]}
  zoom={16}
  maxZoom={20}
  attributionControl={true}
  zoomControl={true}
  doubleClickZoom={true}
  scrollWheelZoom={true}
  dragging={true}
  animate={true}
  easeLinearity={0.35}
  onclick={this.handleClick}>
>
...
</LeafletMap>

In your handleClick function you get the information of lat and lng like this:

handleClick = (e) => {
  const { lat, lng } = e.latlng;
  console.log(lat, lng);
}

From here on, you can create your marker / popup with the information you were looking for.

Additional hint: Please make sure your code is wrapped in correctly in your post..

like image 5
grenzbotin Avatar answered Nov 20 '22 09:11

grenzbotin