React-Native中Glympse位置数据delta压缩数组POST请求格式咨询
React Native Glympse Delta压缩位置数据上传完整示例
1. Delta压缩数组规则说明
Glympse要求的位置delta数组遵循以下规则:
- 数组第一个元素为全量基准位置数据,包含
timestamp、lat、lng、accuracy四个核心字段 - 从第二个元素开始,每个元素为相对前一个元素的字段差值,没有变化的字段可以省略不传
- 所有差值统一使用整数类型传输,经纬度需要先乘以1e6转为微度单位再计算差值,避免浮点精度丢失
2. 位置数据预处理函数
// 原始位置数据转Glympse delta压缩数组 const convertToGlympseDelta = (rawLocations) => { if (!rawLocations.length) return [] // 处理第一个基准元素 const base = rawLocations[0] const deltaArray = [{ timestamp: Math.floor(base.timestamp), lat: Math.floor(base.latitude * 1e6), lng: Math.floor(base.longitude * 1e6), accuracy: Math.floor(base.accuracy) }] let prev = deltaArray[0] // 遍历后续位置计算差值 for (let i = 1; i < rawLocations.length; i++) { const curr = rawLocations[i] const currDelta = {} const currLat = Math.floor(curr.latitude * 1e6) const currLng = Math.floor(curr.longitude * 1e6) const currTs = Math.floor(curr.timestamp) const currAcc = Math.floor(curr.accuracy) if (currTs !== prev.timestamp) currDelta.timestamp = currTs - prev.timestamp if (currLat !== prev.lat) currDelta.lat = currLat - prev.lat if (currLng !== prev.lng) currDelta.lng = currLng - prev.lng if (currAcc !== prev.accuracy) currDelta.accuracy = currAcc - prev.accuracy deltaArray.push(currDelta) // 更新前一个元素的全量值,用于下一次差值计算 prev = { timestamp: currTs, lat: currLat, lng: currLng, accuracy: currAcc } } return deltaArray }
3. POST请求体结构说明
请求体为JSON格式,固定包含以下字段:
{ "api_key": "你的Glympse API密钥", "user_id": "当前用户的唯一标识", "location_delta": [], // 上一步生成的delta压缩数组 "delta_version": "1.0", // 固定为1.0,Glympse官方指定版本号 "upload_time": 1690000000000 // 本次上传的时间戳,毫秒级 }
4. React Native请求发送实现
使用React Native内置的fetch API发起请求的完整代码:
import Geolocation from '@react-native-community/geolocation' const uploadGlympseLocations = async (rawLocations) => { const deltaArray = convertToGlympseDelta(rawLocations) if (!deltaArray.length) return const requestBody = { api_key: "YOUR_GLYMPSE_API_KEY", user_id: "CURRENT_USER_ID", location_delta: deltaArray, delta_version: "1.0", upload_time: Date.now() } try { const response = await fetch("https://api.glympse.com/v2/locations/batch", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": "Bearer YOUR_AUTH_TOKEN" }, body: JSON.stringify(requestBody) }) const result = await response.json() if (response.ok) { console.log("位置上传成功", result) } else { console.error("位置上传失败", result) } } catch (error) { console.error("请求异常", error) } } // 调用示例:获取位置后上传 const batchUploadLocations = () => { // 替换为实际存储的原始位置数组,也可以实时从定位SDK获取 const mockRawLocations = [ {timestamp: 1690000000000, latitude: 39.9042, longitude: 116.4074, accuracy: 10}, {timestamp: 1690000001000, latitude: 39.9043, longitude: 116.4075, accuracy: 10}, {timestamp: 1690000002000, latitude: 39.9044, longitude: 116.4076, accuracy: 12} ] uploadGlympseLocations(mockRawLocations) }
5. 注意事项
- 经纬度转为微度单位计算差值可以大幅降低数据体积,同时避免浮点运算的精度误差
- 差值计算时省略无变化的字段,可以进一步压缩请求体大小
- 如果定位频率为1秒1次,建议每30-60条位置点批量上传一次,平衡传输效率和重试成本
- 上传失败时需要保留未上传的原始位置数据,重试时重新生成delta数组即可
内容的提问来源于stack exchange,提问作者Shmuli Adelman
相关产品推荐
相关产品推荐

