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。流程是:

  1. 获取当前位置
  2. 调用 POI 服务(高德/Google/Mapbox)
  3. 返回周边地点列表

Expo 在定位层提供坐标数据,真正的“就近搜索”还是依赖地图服务本身。

常见问题与建议

小结

Expo 的定位能力足够覆盖大部分业务需求。从当前坐标、实时更新到反向地理编码,都能通过 expo-location 直接完成。关键在于控制定位频率与与地图服务的配合,避免体验与耗电问题。