You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:27:02