การอ่านตำแหน่ง GPS ด้วย expo-location
ขอสิทธิ์เข้าถึงตำแหน่งขณะใช้งาน รับพิกัดปัจจุบันด้วย getCurrentPositionAsync และแสดงละติจูดกับลองจิจูดบนหน้าจอ
การอ่านตำแหน่ง GPS ด้วย expo-location เป็นบทเรียน React Native Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Native Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Native Academy มีบทเรียนทั้งหมด 4 บทเรียน
บางส่วนของบทเรียนนี้ยังไม่ได้รับการแปล และแสดงเป็นภาษาอังกฤษ
What Is expo-location?
expo-location provides an API to read the device's geographic position using GPS, Wi-Fi triangulation, and cell tower data. It works on both iOS and Android without writing native code. You can get a one-time position fix, watch the location as the user moves, or geocode an address to coordinates and vice versa.
Installing expo-location
Use the Expo install command to get the SDK-compatible version of expo-location. In managed Expo projects, the native module is linked automatically. For bare React Native projects, you must also run pod install on iOS and update AndroidManifest.xml with the location permission declarations.
npx expo install expo-locationRequesting Foreground Location Permission
Location access requires explicit user permission. Call Location.requestForegroundPermissionsAsync() to ask for permission to read location while the app is in the foreground. Check the status field of the returned object — only proceed if it equals 'granted'. The hook version Location.useForegroundPermissions() simplifies this in functional components.
import * as Location from 'expo-location';
const [permission, requestPermission] = Location.useForegroundPermissions();
if (!permission) return <ActivityIndicator />;
if (!permission.granted) {
return (
<View>
<Text>Location access is needed to show your position.</Text>
<Button title='Allow Location' onPress={requestPermission} />
</View>
);
}Getting the Current Position Once
Location.getCurrentPositionAsync() performs a single GPS fix and returns a LocationObject containing coords.latitude, coords.longitude, coords.accuracy (in meters), and a timestamp. Use this for one-time lookups like 'find nearby restaurants' where you do not need continuous tracking.
const [location, setLocation] = React.useState(null);
async function fetchLocation() {
const loc = await Location.getCurrentPositionAsync({
accuracy: Location.Accuracy.Balanced,
});
setLocation(loc);
console.log('Lat:', loc.coords.latitude);
console.log('Lng:', loc.coords.longitude);
console.log('Accuracy:', loc.coords.accuracy, 'meters');
}Accuracy Levels
expo-location provides several accuracy presets via Location.Accuracy. Use Lowest or Low for coarse location with minimal battery impact, Balanced for general use, and High or BestForNavigation when you need precise GPS coordinates for turn-by-turn navigation. Higher accuracy drains battery faster, so choose appropriately for your use case.
// Coarse — fast, low battery, uses Wi-Fi/cell
Location.Accuracy.Lowest // ~3 km
Location.Accuracy.Low // ~1 km
Location.Accuracy.Balanced // ~100 m — good default
// Precise — uses GPS, more battery
Location.Accuracy.High // ~10 m
Location.Accuracy.Highest // ~1 m
Location.Accuracy.BestForNavigation // highest + sensorsWatching the Location Continuously
Location.watchPositionAsync starts a subscription that calls a callback every time the device's position changes by a specified distance or time interval. It returns a subscription object with a remove() method. Always call remove() in a useEffect cleanup function to stop tracking when the component unmounts and save battery.
useEffect(() => {
let subscription: Location.LocationSubscription;
async function startWatching() {
subscription = await Location.watchPositionAsync(
{
accuracy: Location.Accuracy.High,
distanceInterval: 10, // update every 10 meters
timeInterval: 5000, // or every 5 seconds
},
(loc) => setLocation(loc)
);
}
startWatching();
return () => subscription?.remove(); // cleanup on unmount
}, []);Displaying Coordinates on Screen
Once you have a location object, display the coordinates in a human-readable format. Round latitude and longitude to 5-6 decimal places for readability — that corresponds to roughly 1-meter precision. Display the accuracy value so users understand how precise the reading is, especially on devices that cannot get a good GPS fix indoors.
export default function LocationDisplay() {
const [location, setLocation] = React.useState(null);
// ... permission check and fetch ...
if (!location) return <Button title='Get Location' onPress={fetchLocation} />;
return (
<View>
<Text>Latitude: {location.coords.latitude.toFixed(6)}</Text>
<Text>Longitude: {location.coords.longitude.toFixed(6)}</Text>
<Text>Accuracy: {location.coords.accuracy?.toFixed(0)} m</Text>
</View>
);
}Reverse Geocoding: Coordinates to Address
Location.reverseGeocodeAsync converts latitude and longitude coordinates into a human-readable address. It returns an array of LocationGeocodedAddress objects with fields like street, city, region, country, and postalCode. Use the first result — it is the most likely match for the given coordinates.
async function getAddress(latitude: number, longitude: number) {
const results = await Location.reverseGeocodeAsync({ latitude, longitude });
if (results.length > 0) {
const addr = results[0];
return [addr.street, addr.city, addr.region, addr.country]
.filter(Boolean)
.join(', ');
}
return 'Unknown location';
}Forward Geocoding: Address to Coordinates
Location.geocodeAsync converts a text address into latitude and longitude. This is useful for features like 'search nearby' where users type a location name. The function returns an array of results (multiple matches are possible for ambiguous addresses) each containing latitude, longitude, and altitude.
async function searchAddress(address: string) {
const results = await Location.geocodeAsync(address);
if (results.length > 0) {
const { latitude, longitude } = results[0];
console.log('Coordinates:', latitude, longitude);
return { latitude, longitude };
}
return null;
}Handling Location Errors
Location requests can fail when the user is indoors, when the device's GPS is disabled, or on simulators that do not have a simulated location set. Wrap location calls in try-catch and show a fallback UI. Check Location.hasServicesEnabledAsync() before requesting a position to detect when the device's location services are turned off in system settings.
async function fetchLocationSafe() {
const enabled = await Location.hasServicesEnabledAsync();
if (!enabled) {
Alert.alert('Location Off', 'Please enable Location Services in Settings.');
return;
}
try {
const loc = await Location.getCurrentPositionAsync({
accuracy: Location.Accuracy.Balanced,
});
setLocation(loc);
} catch (err) {
Alert.alert('Error', 'Could not get your location. Please try again.');
}
}Background Location Tracking
Tracking location when the app is in the background requires background location permission (requestBackgroundPermissionsAsync) and a background task defined with expo-task-manager. This is only needed for apps like fitness trackers or delivery apps. Apple and Google have strict review requirements for apps that use background location, so only request it if the feature is core to your app.
Quick Check
Test your understanding of React Native Mobile Development concepts from this lesson.
Lesson Recap
In this lesson you learned: requestForegroundPermissionsAsync must be called and granted before any location reading is possible, getCurrentPositionAsync performs a one-time position fix while watchPositionAsync tracks continuous movement, and reverseGeocodeAsync converts coordinates to a human-readable address. Next up we explore scheduling local notifications.
คำถามที่พบบ่อย
บทเรียน “การอ่านตำแหน่ง GPS ด้วย expo-location” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การอ่านตำแหน่ง GPS ด้วย expo-location” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Native Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Native Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การอ่านตำแหน่ง GPS ด้วย expo-location”
ขอสิทธิ์เข้าถึงตำแหน่งขณะใช้งาน รับพิกัดปัจจุบันด้วย getCurrentPositionAsync และแสดงละติจูดกับลองจิจูดบนหน้าจอ คุณปฏิบัติ React Native Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Native Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Native Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การอ่านตำแหน่ง GPS ด้วย expo-location” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Native Academy นี้ได้ไหม
ได้ บทเรียน React Native Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเข้าถึงกล้องด้วย expo-camera
- การอ่านตำแหน่ง GPS ด้วย expo-location
- การตั้งเวลาการแจ้งเตือนภายในเครื่อง
- การจัดการสิทธิ์อย่างเหมาะสม