Как мне получить список ближайших пользователей в приложении react native на основе Firebase?

#javascript #reactjs #firebase #react-native #firebase-realtime-database

#javascript #reactjs #firebase #react-native #firebase-realtime-database

Вопрос:

Я работаю над приложением, основанным на картах, с react native и Firebase в качестве серверной части, и я застрял с функцией Nearby users, я использую карты react native для геолокации и react native firebase.

Теперь в моем приложении у меня есть два типа пользователей (конечный пользователь, поставщик), и при регистрации я сохраняю данные о них, содержащие их местоположение (широта, длина), на данный момент я работаю с приложением конечного пользователя, и я сохраняю некоторые поддельные данные о поставщиках (местоположении), и яне имею представления о том, как получить всех поставщиков поблизости от моего местоположения,

Вот моя база данных [Поставщики]

Поставщик

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

 import React, { Component } from 'react';
import MapView, { Marker } from 'react-native-maps';
import { View, Text, StyleSheet, Dimensions, PermissionsAndroid } from 'react-native';

let { width, height } = Dimensions.get('window');

const LATITUDE = 50.78825;
const LONGITUDE = 51.4324;
const LATITUDE_DELTA = 0.0922;
const LONGITUDE_DELTA = 0.0421;

class Map extends Component {
    constructor(props) {
        super(props);
        this.state = {
            error: null,
            width: width,
            marginBottom: 1,
            region: {
                latitude: LATITUDE,
                longitude: LONGITUDE,
                latitudeDelta: LATITUDE_DELTA,
                longitudeDelta: LONGITUDE_DELTA,
            }
        };

    }
    requestLocationPermission = async () => {
        const LocationPermission = await PermissionsAndroid.request(
            PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION
            // , {
            //     'message': 'This App needs to Access your location, OK?'
            // }
        )
        if (LocationPermission === PermissionsAndroid.RESULTS.GRANTED) {
            navigator.geolocation.getCurrentPosition(
                //Will give you the current location
                position => {
                    const longitude = position.coords.longitude;
                    const latitude = position.coords.latitude;

                    this.setState({
                        region: {
                            latitude,
                            longitude,
                            latitudeDelta: LATITUDE_DELTA,
                            longitudeDelta: LONGITUDE_DELTA,
                        }
                    })
                },
                error => alert(error.message),
                { enableHighAccuracy: true, timeout: 20000, maximumAge: 1000 }
            );
            this.watchID = navigator.geolocation.watchPosition(position => {
                console.log(position);
                const longitude = position.coords.longitude;
                const latitude = position.coords.latitude;

                this.setState({
                    region: {
                        latitude,
                        longitude,
                        latitudeDelta: LATITUDE_DELTA,
                        longitudeDelta: LONGITUDE_DELTA,
                    }
                });
            });

        }
    }
    async componentDidMount() {
        await this.requestLocationPermission()
    };
    render() {
        const { region } = this.state;
        return (
            <View style={styles.container}>
                <MapView
                    style={[styles.map, { width: this.state.width }]}
                    style={StyleSheet.absoluteFill}
                    onMapReady={() => console.log(this.state.region)}
                    showsUserLocation
                    region={region}
                    loadingEnabled={true}
                    // style={StyleSheet.absoluteFill}
                    textStyle={{ color: '#bc8b00' }}
                    containerStyle={{ backgroundColor: 'white', borderColor: '#BC8B00' }}
                >
                    <Marker
                        coordinate={this.state.region}
                        title="Hello Title"
                        description="description..."
                    />
                </MapView>
                {/* <Text>{this.state.region.latitude}</Text> */}
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        flexDirection: 'row',
        justifyContent: 'space-between',
        padding: 30,
        flex: 1,
        alignItems: 'center'
    },
    map: {
        position: 'absolute',
        zIndex: -1,
        top: 0,
        left: 0,
        right: 0,
        bottom: 0,
    },
});

export default Map;
  

Если кому-то интересно помочь мне, вот мой
репозиторий

Комментарии:

1. Вы нашли решение? Я пытаюсь создать функцию firebase для ее обработки, но пока безуспешно…

2. Привет, @David, я немедленно решаю эту проблему, используя @turf / distance во внешнем интерфейсе, а не в облачной функции firebase

3. Не могли бы вы поделиться каким-нибудь кодом, чтобы я мог понять, как я могу справиться с этим со своей стороны? Спасибо

4. Итак, вы получаете всех пользователей, а затем применяете фильтрацию? Я хочу получать только пользователей, которые находятся рядом со мной…

5. Да, основная идея заключается в том, чтобы выбрать всех пользователей, а затем выполнить фильтрацию, чтобы получить всех пользователей на основе моего местоположения и на сколько км от меня «Я отправил этот комментарий с мобильного, я добавлю код позже»