Доступ к текущему местоположению и отправка его в firebase - PullRequest
0 голосов
/ 19 марта 2019

У меня есть собственное приложение реагирования, в котором я использую react-native-maps. Я хочу отправить текущее местоположение в firebase, а также хочу предупредить пользователя, когда он прошел 100 метров от текущего местоположения.Как я могу это сделать?

Дополнительная информация:

  • React Native версия "0.57.5"
  • response-native-firebase "^ 5.2.3"
  • реакция-нативные карты "^ 0.22.1"

Заранее спасибо.

1 Ответ

1 голос
/ 19 марта 2019

Вы можете запросить текущее местоположение пользователя, когда ваш компонент смонтирован, и продолжить прослушивание на предмет изменения положения, а затем рассчитать изменение расстояния от разных положений:

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

...