Kurs React Native · Moduł 8: Lokalizacja i mapy
expo-location - Geolokalizacja
W tej lekcji4
Witaj w Kartograficznej Komnacie! Poznaj lokalizację użytkownika i nawiguj po podwodnym świecie.
Instalacja
npx expo install expo-locationUprawnienia i aktualna lokalizacja
import * as Location from 'expo-location';
async function getCurrentLocation() {
// Poproś o uprawnienia
const { status } = await Location.requestForegroundPermissionsAsync();
if (status !== 'granted') {
Alert.alert('Brak uprawnień', 'Włącz dostęp do lokalizacji');
return null;
}
// Pobierz aktualną lokalizację
const location = await Location.getCurrentPositionAsync({
accuracy: Location.Accuracy.High,
});
return {
latitude: location.coords.latitude,
longitude: location.coords.longitude,
};
}Śledzenie lokalizacji
function useLocationTracking() {
const [location, setLocation] = useState<Location.LocationObject | null>(null);
useEffect(() => {
let subscription: Location.LocationSubscription;
(async () => {
const { status } = await Location.requestForegroundPermissionsAsync();
if (status !== 'granted') return;
subscription = await Location.watchPositionAsync(
{
accuracy: Location.Accuracy.BestForNavigation,
timeInterval: 5000,
distanceInterval: 10,
},
(newLocation) => setLocation(newLocation)
);
})();
return () => subscription?.remove();
}, []);
return location;
}Geokodowanie
// Adres -> Współrzędne
const geocode = async (address: string) => {
const results = await Location.geocodeAsync(address);
if (results.length > 0) {
return { lat: results[0].latitude, lng: results[0].longitude };
}
return null;
};
// Współrzędne -> Adres
const reverseGeocode = async (lat: number, lng: number) => {
const results = await Location.reverseGeocodeAsync({ latitude: lat, longitude: lng });
if (results.length > 0) {
const { city, street, streetNumber, country } = results[0];
return `${street} ${streetNumber}, ${city}, ${country}`;
}
return null;
};Kod do tej lekcji: App.tsx
import React, { useState, useEffect } from 'react';
import { View, Text, StyleSheet } from 'react-native';
import * as Location from 'expo-location';
export default function App() {
const [location, setLocation] = useState<Location.LocationObject | null>(null);
useEffect(() => {
let subscription: Location.LocationSubscription | undefined;
(async () => {
// Poproś o uprawnienia do lokalizacji w foreground
const { status } = await Location.requestForegroundPermissionsAsync();
if (status !== 'granted') return;
// TODO: uruchom Location.watchPositionAsync z konfiguracją:
// accuracy: Location.Accuracy.High,
// timeInterval: 5000,
// distanceInterval: 10
// a w callbacku zapisz nową lokalizację przez setLocation
subscription = await Location.watchPositionAsync(
{
// TODO: uzupełnij accuracy, timeInterval i distanceInterval
},
(newLocation) => {
// TODO: zaktualizuj stan lokalizacji
}
);
})();
// Pamiętaj o sprzątaniu subskrypcji
return () => subscription?.remove();
}, []);
return (
<View style={styles.container}>
<Text style={styles.title}>Navigator Atlantydy</Text>
<Text style={styles.coords}>
{location
? `${location.coords.latitude.toFixed(4)}, ${location.coords.longitude.toFixed(4)}`
: 'Namierzanie pozycji...'}
</Text>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#1a5276',
},
title: {
fontSize: 22,
color: '#fff',
marginBottom: 12,
},
coords: {
fontSize: 16,
color: '#aed6f1',
},
});Hasła z dokumentacji w tej lekcji
Widzisz błąd w tej lekcji?
Sprawdź się
Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.
1. Jak zainstalować expo-location?
2. Jak poprosić o uprawnienia do lokalizacji w foreground?
To 2 z 9 pytań do tej lekcji. Pozostałe rozwiążesz w grze.
Zadania praktyczne w grze
- Układanie w poziomie
Ułóż pobieranie aktualnej lokalizacji:
- Układanie w pionie
Uporządkuj konfigurację śledzenia lokalizacji:
- Edytor kodu
Uzupełnij kod watchPositionAsync.
- Klikanie w kolejności
Kliknij elementy reverse geocoding: