I am using react-google-maps to show the location of the user after fetching her co-ordinates using ReactJS. But, when I move marker from the original position, the initial marker stays there, so two markers are created. I don't know how to fix this.
I want that whatever happens, the Map Marker remains at center, also when the user drags OR zoom in/out of the marker, the marker remains at center, so that the user's location is always at the center of the map. In this way, the user will be able to update her location. As per your example, when I drag, the marker stays fixed in it's location This component was designed so that the user can set her location, with a little bit of tweaking the Marker's position, in case the marker is a little bit off Any Help will be appreciated:
App.js
import React from "react";
import WrappedMap from "./Map";
import "./styles.css";
export default class App extends React.Component {
constructor(props) {
super(props);
this.state = {
location: "",
place: ""
};
}
handleLocation = (location) => {
this.setState({ location: location });
};
handlePlace = (place) => {
this.setState({ place: place });
};
render() {
return (
<div className="App">
<WrappedMap
googleMapURL={`https://maps.googleapis.com/maps/api/js?key=`}
loadingElement={<div style={{ height: `100%` }} />}
containerElement={
<div
style={{
height: `50%`,
width: "95%",
position: "absolute",
marginTop: "25%"
}}
/>
}
mapElement={<div style={{ height: `100%` }} />}
location={this.state.location}
handleLocation={this.handleLocation}
changeState={this.changeState}
place={this.state.place}
handlePlace={this.handlePlace}
handleUseGPS={this.handleUseGPS}
/>
</div>
);
}
}
Map.js
import React, { useRef, useState, useEffect } from "react";
import Geocode from "react-geocode";
import Button from "@material-ui/core/Button";
import {
GoogleMap,
withScriptjs,
withGoogleMap,
Marker
} from "react-google-maps";
// import "./Sign.css";
function Map({
location,
handleLocation,
changeState,
place,
handlePlace,
handleUseGPS
}) {
const [center, setCenter] = useState(location);
const [showMap, setShowMap] = useState(false);
const refMap = useRef(null);
var options = {
enableHighAccuracy: true,
timeout: 10000,
maximumAge: 30000
};
function success(pos) {
var crd = pos.coords;
console.log(crd);
console.log("Your current position is:");
console.log(`Latitude : ${crd.latitude}`);
console.log(`Longitude: ${crd.longitude}`);
console.log(`More or less ${crd.accuracy} meters.`);
const loc = {
lat: crd.latitude,
lng: crd.longitude
};
handleLocation(loc);
getAndChangeAddress(loc);
setCenter(loc);
setShowMap(true);
}
function error(err) {
if (!navigator.geolocation) {
console.log("Geolocation is not supported by your browser");
} else {
console.log("loading");
}
let typeErr = err.code;
console.log(`Code: ${typeErr}`);
switch (typeErr) {
case 1:
console.log("User has not given permissions");
break;
case 2:
console.log(
"The acquisition of the geolocation failed because at least one internal source of position returned an internal error."
);
break;
case 3:
console.log("Timeout reached before obtaining information");
break;
default:
break;
}
console.warn(`ERROR(${err.code}): ${err.message}`);
handlePlace("");
handleLocation({});
// handleUseGPS(true);
// changeState(7);
}
const handleBoundsChanged = () => {
const mapCenter = refMap.current.getCenter(); //get map center
setCenter(mapCenter);
};
useEffect(() => {
navigator.geolocation.getCurrentPosition(success, error, options);
}, []);
const handleDragEnd = () => {
const newCenter = refMap.current.getCenter();
const newLocation = {
lat: newCenter.lat(),
lng: newCenter.lng()
};
handleLocation(newLocation);
getAndChangeAddress(newLocation);
};
const returnToMenu = () => {
// changeState(4);
};
const getAndChangeAddress = (loc) => {
const lat = loc.lat.toString();
const lng = loc.lng.toString();
console.log(typeof lat);
console.log(`From getAddress() function => lat: ${lat}, lng: ${lng}`);
Geocode.fromLatLng(lat, lng).then(
(response) => {
const address = response.results[0].formatted_address;
console.log(`Formatted address: ${address}`);
handlePlace(address);
},
(error) => {
console.error(error);
console.log("Error occuredd in getting address");
}
);
};
return (
<>
<div className="sign-in-form">
{showMap && (
<GoogleMap
ref={refMap}
defaultZoom={15}
defaultCenter={center}
onBoundsChanged={handleBoundsChanged}
onDragEnd={handleDragEnd}
>
<Marker
// defaultPlace={center}
position={center}
// ref={refMap}
// defaultPosition={center}
// onDrag={handleBoundsChanged}
// onDragEnd={handleDragEnd}
/>
</GoogleMap>
)}
{location.lat !== "" && (
<>
<hr />
<div style={{ margin: "1em" }}>{place}</div>
<hr />
</>
)}
<Button
className="otp-button"
onClick={returnToMenu}
fullWidth
variant="contained"
>
SAVE LOCATION
</Button>
</div>
</>
);
}
export default withScriptjs(withGoogleMap(Map));
Also See: CodeSandbox Link