Expo 定位与地图实战:权限、轨迹与就近搜索
Created on
前言
定位类功能在外卖、出行、到店与运动场景里非常常见。Expo 提供 expo-location,能快速完成定位权限、实时更新与地理信息获取。本篇以“就近搜索 + 轨迹记录”为例,搭建一个可复用的定位基础。
安装依赖
expo install expo-location
请求定位权限
import * as Location from "expo-location";
export async function requestLocationPermission() {
const { status } = await Location.requestForegroundPermissionsAsync();
return status === "granted";
}
如果需要后台定位,要增加 requestBackgroundPermissionsAsync,并配置相应权限描述与用途说明。
获取当前坐标
import * as Location from "expo-location";
export async function getCurrentPosition() {
return Location.getCurrentPositionAsync({
accuracy: Location.Accuracy.High,
});
}
实时定位与轨迹记录
import * as Location from "expo-location";
import { useEffect, useRef, useState } from "react";
export function useLocationTrace() {
const [points, setPoints] = useState<Location.LocationObject[]>([]);
const watcher = useRef<Location.LocationSubscription | null>(null);
useEffect(() => {
(async () => {
watcher.current = await Location.watchPositionAsync(
{
accuracy: Location.Accuracy.Balanced,
timeInterval: 2000,
distanceInterval: 5,
},
(loc) => setPoints((prev) => [...prev, loc])
);
})();
return () => {
watcher.current?.remove();
};
}, []);
return points;
}
timeInterval + distanceInterval 可以同时控制更新频率,避免耗电过高。
反向地理编码与就近搜索
import * as Location from "expo-location";
export async function reverseGeocode(lat: number, lon: number) {
const result = await Location.reverseGeocodeAsync({
latitude: lat,
longitude: lon,
});
return result[0];
}
就近搜索通常需要配合第三方地图或 POI API。流程是:
- 获取当前位置
- 调用 POI 服务(高德/Google/Mapbox)
- 返回周边地点列表
Expo 在定位层提供坐标数据,真正的“就近搜索”还是依赖地图服务本身。
常见问题与建议
- iOS 需要在
app.json配置定位权限描述 - 连续定位会影响耗电,推荐先使用
Balanced精度 - 对地图展示可使用
react-native-maps(需注意平台兼容与配置)
小结
Expo 的定位能力足够覆盖大部分业务需求。从当前坐标、实时更新到反向地理编码,都能通过 expo-location 直接完成。关键在于控制定位频率与与地图服务的配合,避免体验与耗电问题。