Вы можете запросить текущее местоположение пользователя, когда ваш компонент смонтирован, и продолжить прослушивание на предмет изменения положения, а затем рассчитать изменение расстояния от разных положений:
componentDidMount() {
this.getLocation(); // Get users current location
}
componentDidUpdate(prevProps, prevState) {
// If prevState changes
if (prevState.newLatitude !== this.state.newLatitude) {
// calculate the distance between initial and new coordinates
this.getDistance();
}
}
componentWillUnmount() {
// Remember to clear all listeners
navigator.geolocation.clearWatch(this.watcher);
}
getLocation() {
navigator.geolocation.getCurrentPosition((position) => {
this.setState({
latitude: position.coords.latitude,
longitude: position.coords.longitude
}, () => {
this.sendToFirebase();
this.watchUserPosition(); //continue listening for location changes
});
},
(error) => {
//Handle error
},
{ enableHighAccuracy: false, timeout: 200000, maximumAge: 1000 },
);
}
watchUserPosition() {
this.watcher = navigator.geolocation.watchPosition(
(position) => {
this.setState({
newLatitude: position.coords.latitude,
newLongitude: position.coords.longitude,
error: null,
});
},
(error) => this.setState({ error: error.message }),
{ enableHighAccuracy: true, timeout: 20000, maximumAge: 1000, distanceFilter: 10 },
);
}
Теперь после получения начальной долготыи широту, вы можете продолжать сравнивать новую долготу и широту, которые вы получаете от watchUserPosition
.Это будет означать преобразование долготы и широты в метры и проверку разницы начальных координат в метрах и новых координат в метрах.
Для этого вы можете использовать библиотеку Geolib
getDistance() {
let initial = {latitude: this.state.latitude, longitude: this.state.longitude};
let newCoord = {latitude: this.state.newLatitude, longitude: this.state.newLongitude};
const distance = geolib.getDistance(initial, newCoord);
if (distance >== 100) {
Alert.alert("Success!", "You have reached 100meters!");
this.sendToFirebase(); // whatever you are saving to firebase
}
}
В качестве альтернативы вы можете рассмотреть возможность использования Firebase Geo-Fire