import type { ICameraService } from '../camera/ICameraService'; import type { ICoordinateSystemService } from './ICoordinateSystemService'; import { CoordinateSystem } from './ICoordinateSystemService'; export default class CoordinateSystemService implements ICoordinateSystemService { private cameraService; constructor(cameraService: ICameraService); needRefresh: boolean; /** * 1. Web 墨卡托坐标系 * 2. 偏移经纬度,用于解决高精度抖动问题 * 3. 瓦片坐标,用于数据瓦片 * 4. 常规世界坐标系,用于常规 2D/3D 可视化场景 * @see https://yuque.antfin-inc.com/yuqi.pyq/fgetpa/doml91 */ private coordinateSystem; /** * 屏幕中心点 [lng, lat] */ private viewportCenter; /** * 屏幕中心点的最终投影结果,在 CPU 侧计算后传入 Shader * @see https://zhuanlan.zhihu.com/p/57469121 */ private viewportCenterProjection; /** * 像素单位 -> 经纬度 [x, y, z] */ private pixelsPerDegree; /** * 像素单位 -> 经纬度 [lng, lat] 使用泰勒级数展开 * 通过墨卡托坐标系下的差值估计世界坐标系下的差值 * @see https://zhuanlan.zhihu.com/p/57469121 */ private pixelsPerDegree2; /** * 像素单位 -> 米 */ private pixelsPerMeter; /** * 重新计算当前坐标系参数 * TODO: 使用 memoize 缓存参数以及计算结果 */ refresh(offsetCenter?: [number, number]): void; getCoordinateSystem(): CoordinateSystem; setCoordinateSystem(coordinateSystem: CoordinateSystem): void; getViewportCenter(): [number, number]; setViewportCenter(center: [number, number]): void; getViewportCenterProjection(): [number, number, number, number]; getPixelsPerDegree(): [number, number, number]; getPixelsPerDegree2(): [number, number, number]; getPixelsPerMeter(): [number, number, number]; private calculateLnglatOffset; }