feat: add background gps tracking support

This commit is contained in:
2026-03-20 19:03:57 +08:00
parent 1ecb4809df
commit a4c426df8b
6 changed files with 353 additions and 5 deletions

View File

@@ -59,3 +59,45 @@ export function worldTileToLonLat(point: WorldTilePoint, zoom: number): LonLatPo
lat: latRad * 180 / Math.PI,
}
}
const CHINA_AXIS = 6378245
const CHINA_EE = 0.00669342162296594323
function isOutsideChina(point: LonLatPoint): boolean {
return point.lon < 72.004 || point.lon > 137.8347 || point.lat < 0.8293 || point.lat > 55.8271
}
function transformLat(x: number, y: number): number {
let result = -100 + 2 * x + 3 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x))
result += (20 * Math.sin(6 * x * Math.PI) + 20 * Math.sin(2 * x * Math.PI)) * 2 / 3
result += (20 * Math.sin(y * Math.PI) + 40 * Math.sin(y / 3 * Math.PI)) * 2 / 3
result += (160 * Math.sin(y / 12 * Math.PI) + 320 * Math.sin(y * Math.PI / 30)) * 2 / 3
return result
}
function transformLon(x: number, y: number): number {
let result = 300 + x + 2 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x))
result += (20 * Math.sin(6 * x * Math.PI) + 20 * Math.sin(2 * x * Math.PI)) * 2 / 3
result += (20 * Math.sin(x * Math.PI) + 40 * Math.sin(x / 3 * Math.PI)) * 2 / 3
result += (150 * Math.sin(x / 12 * Math.PI) + 300 * Math.sin(x / 30 * Math.PI)) * 2 / 3
return result
}
export function gcj02ToWgs84(point: LonLatPoint): LonLatPoint {
if (isOutsideChina(point)) {
return point
}
const dLat = transformLat(point.lon - 105, point.lat - 35)
const dLon = transformLon(point.lon - 105, point.lat - 35)
const radLat = point.lat / 180 * Math.PI
const magic = Math.sin(radLat)
const sqrtMagic = Math.sqrt(1 - CHINA_EE * magic * magic)
const latOffset = (dLat * 180) / ((CHINA_AXIS * (1 - CHINA_EE)) / (sqrtMagic * sqrtMagic * sqrtMagic) * Math.PI)
const lonOffset = (dLon * 180) / (CHINA_AXIS / sqrtMagic * Math.cos(radLat) * Math.PI)
return {
lon: point.lon - lonOffset,
lat: point.lat - latOffset,
}
}