@caoguo/maplibre 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-DENQSIV2.js +81 -0
- package/dist/chunk-DENQSIV2.js.map +1 -0
- package/dist/chunk-G7VY42ZG.js +210 -0
- package/dist/chunk-G7VY42ZG.js.map +1 -0
- package/dist/chunk-MLLIAWVI.js +214 -0
- package/dist/chunk-MLLIAWVI.js.map +1 -0
- package/dist/chunk-OLS4DD3F.js +27 -0
- package/dist/chunk-OLS4DD3F.js.map +1 -0
- package/dist/chunk-OUEPE6JT.js +26 -0
- package/dist/chunk-OUEPE6JT.js.map +1 -0
- package/dist/chunk-SKXL3DKL.js +125 -0
- package/dist/chunk-SKXL3DKL.js.map +1 -0
- package/dist/chunk-Y3JNDOHU.js +56 -0
- package/dist/chunk-Y3JNDOHU.js.map +1 -0
- package/dist/controls/index.cjs +227 -0
- package/dist/controls/index.cjs.map +1 -0
- package/dist/controls/index.d.cts +171 -0
- package/dist/controls/index.d.ts +171 -0
- package/dist/controls/index.js +4 -0
- package/dist/controls/index.js.map +1 -0
- package/dist/crs/index.cjs +137 -0
- package/dist/crs/index.cjs.map +1 -0
- package/dist/crs/index.d.cts +80 -0
- package/dist/crs/index.d.ts +80 -0
- package/dist/crs/index.js +3 -0
- package/dist/crs/index.js.map +1 -0
- package/dist/index.cjs +48 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -499
- package/dist/index.d.ts +11 -499
- package/dist/index.js +14 -643
- package/dist/index.js.map +1 -1
- package/dist/lod/index.cjs +60 -0
- package/dist/lod/index.cjs.map +1 -0
- package/dist/lod/index.d.cts +62 -0
- package/dist/lod/index.d.ts +62 -0
- package/dist/lod/index.js +3 -0
- package/dist/lod/index.js.map +1 -0
- package/dist/shaders/index.cjs +215 -0
- package/dist/shaders/index.cjs.map +1 -0
- package/dist/shaders/index.d.cts +131 -0
- package/dist/shaders/index.d.ts +131 -0
- package/dist/shaders/index.js +3 -0
- package/dist/shaders/index.js.map +1 -0
- package/dist/sourceUtils.cjs +30 -0
- package/dist/sourceUtils.cjs.map +1 -0
- package/dist/sourceUtils.d.cts +60 -0
- package/dist/sourceUtils.d.ts +60 -0
- package/dist/sourceUtils.js +3 -0
- package/dist/sourceUtils.js.map +1 -0
- package/dist/styles.cjs +47 -12
- package/dist/styles.cjs.map +1 -1
- package/dist/styles.d.cts +13 -4
- package/dist/styles.d.ts +13 -4
- package/dist/styles.js +1 -1
- package/dist/terrain.cjs +31 -0
- package/dist/terrain.cjs.map +1 -0
- package/dist/terrain.d.cts +28 -0
- package/dist/terrain.d.ts +28 -0
- package/dist/terrain.js +3 -0
- package/dist/terrain.js.map +1 -0
- package/package.json +31 -1
- package/dist/chunk-DNEF4DHG.js +0 -48
- package/dist/chunk-DNEF4DHG.js.map +0 -1
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { ThemeName } from '@caoguo/theme';
|
|
2
|
+
|
|
3
|
+
interface ScaleBar {
|
|
4
|
+
/** 比例尺条代表的真实距离(米) */
|
|
5
|
+
meters: number;
|
|
6
|
+
/** 比例尺条在屏幕上的像素宽度 */
|
|
7
|
+
pixels: number;
|
|
8
|
+
/** 展示文案,如 "500 m" / "2 km" */
|
|
9
|
+
label: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 计算比例尺。
|
|
13
|
+
* @param latitude 当前视图中心纬度(度)
|
|
14
|
+
* @param zoom MapLibre zoom(Web Mercator)
|
|
15
|
+
* @param dpiScale 设备像素比(默认 1;Retina 设为 window.devicePixelRatio)
|
|
16
|
+
* @param maxWidth 比例尺条最大像素宽度(默认 100)
|
|
17
|
+
* @param tileSize 瓦片像素尺寸(默认 512,MapLibre v4 默认)
|
|
18
|
+
*/
|
|
19
|
+
declare function computeScaleBar(latitude: number, zoom: number, opts?: {
|
|
20
|
+
dpiScale?: number;
|
|
21
|
+
maxWidth?: number;
|
|
22
|
+
tileSize?: number;
|
|
23
|
+
}): ScaleBar;
|
|
24
|
+
interface ScaleControlOptions {
|
|
25
|
+
/** 挂载容器(可选;不传则在地图容器内自动创建) */
|
|
26
|
+
container?: HTMLElement;
|
|
27
|
+
/** 是否显示实时坐标(默认 true) */
|
|
28
|
+
showCoordinate?: boolean;
|
|
29
|
+
/** 最大比例尺像素宽度 */
|
|
30
|
+
maxWidth?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 比例尺控件。需传入 maplibre Map 实例(直接用 maplibre-gl 的 Map)。
|
|
34
|
+
*/
|
|
35
|
+
declare class ScaleControl {
|
|
36
|
+
private el;
|
|
37
|
+
private barEl;
|
|
38
|
+
private labelEl;
|
|
39
|
+
private coordEl?;
|
|
40
|
+
private map;
|
|
41
|
+
private opts;
|
|
42
|
+
private onMove;
|
|
43
|
+
private onZoom;
|
|
44
|
+
constructor(map: ScaleControl['map'], options?: ScaleControlOptions);
|
|
45
|
+
/** 把控件挂到地图容器(无预设容器时调用) */
|
|
46
|
+
addTo(container: HTMLElement): this;
|
|
47
|
+
/** 计算并刷新显示 */
|
|
48
|
+
update(): void;
|
|
49
|
+
private handleMove;
|
|
50
|
+
/** 移除控件与事件监听 */
|
|
51
|
+
remove(): void;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* 主题切换控件(T8 / F-1.9)。
|
|
56
|
+
*
|
|
57
|
+
* 在暗色(caoguo-dark)与亮色(caoguo-light)官方矢量主题间切换,
|
|
58
|
+
* 调用 `map.setStyle` 并保留当前视图(center/zoom)与现有 GeoJSON 源/图层。
|
|
59
|
+
*
|
|
60
|
+
* 设计为「纯函数 core + 薄 DOM 绑定」:
|
|
61
|
+
* - `toggleTheme` / `themeFromStyle` 为纯逻辑,可独立单测;
|
|
62
|
+
* - `ThemeSwitcher` 类负责渲染按钮并绑定点击事件。
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
interface ThemeSwitcherOptions {
|
|
66
|
+
/** 挂载容器(可选) */
|
|
67
|
+
container?: HTMLElement;
|
|
68
|
+
/** 初始主题 */
|
|
69
|
+
initial?: ThemeName;
|
|
70
|
+
}
|
|
71
|
+
declare function oppositeTheme(theme: ThemeName): ThemeName;
|
|
72
|
+
/**
|
|
73
|
+
* 从当前 style 对象推断主题名(依据其 JSON 标识)。
|
|
74
|
+
* 非草果主题时回退到传入的 fallback。
|
|
75
|
+
*/
|
|
76
|
+
declare function themeFromStyle(style: {
|
|
77
|
+
name?: string;
|
|
78
|
+
} | string | null | undefined, fallback?: ThemeName): ThemeName;
|
|
79
|
+
declare class ThemeSwitcher {
|
|
80
|
+
private el;
|
|
81
|
+
private btn;
|
|
82
|
+
private current;
|
|
83
|
+
private map;
|
|
84
|
+
constructor(map: ThemeSwitcher['map'], options?: ThemeSwitcherOptions);
|
|
85
|
+
private applyLabel;
|
|
86
|
+
/** 当前主题 */
|
|
87
|
+
getTheme(): ThemeName;
|
|
88
|
+
/** 切换到指定主题(保留视图,diff 模式避免闪烁) */
|
|
89
|
+
setTheme(theme: ThemeName): void;
|
|
90
|
+
/** 在明暗之间切换 */
|
|
91
|
+
toggle(): void;
|
|
92
|
+
/** 挂到容器 */
|
|
93
|
+
addTo(container: HTMLElement): this;
|
|
94
|
+
/** 移除 */
|
|
95
|
+
remove(): void;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 图例控件(通用)。
|
|
100
|
+
*
|
|
101
|
+
* 行业专题图(水深色阶 / 光缆利用率 / 闸站状态 / 故障告警等)渲染后,
|
|
102
|
+
* 需要用户可读的图例说明。本控件接收数据驱动的图例项(label + color),
|
|
103
|
+
* 以「色块 + 文案」形式渲染;支持运行时 setItems 随图层切换更新。
|
|
104
|
+
*
|
|
105
|
+
* 设计为「纯函数 renderLegendHtml + 薄 DOM 绑定」:renderLegendHtml 不依赖浏览器,可独立单测。
|
|
106
|
+
*/
|
|
107
|
+
interface LegendItem {
|
|
108
|
+
/** 文案,如「水深 > 3m」「利用率高」 */
|
|
109
|
+
label: string;
|
|
110
|
+
/** 色值(CSS color,可与渲染层 paint 配色保持一致) */
|
|
111
|
+
color: string;
|
|
112
|
+
/** 标记形状:color 色块(默认)/ line 线段 */
|
|
113
|
+
shape?: 'color' | 'line';
|
|
114
|
+
}
|
|
115
|
+
interface LegendOptions {
|
|
116
|
+
/** 图例标题(可选) */
|
|
117
|
+
title?: string;
|
|
118
|
+
/** 图例项 */
|
|
119
|
+
items: LegendItem[];
|
|
120
|
+
/** 挂载容器(可选;不传则自动创建) */
|
|
121
|
+
container?: HTMLElement;
|
|
122
|
+
}
|
|
123
|
+
/** 纯函数:根据图例项生成 HTML 字符串(可单测) */
|
|
124
|
+
declare function renderLegendHtml(items: LegendItem[], title?: string): string;
|
|
125
|
+
/** 图例控件 */
|
|
126
|
+
declare class LegendControl {
|
|
127
|
+
private el;
|
|
128
|
+
private bodyEl;
|
|
129
|
+
private opts;
|
|
130
|
+
constructor(options: LegendOptions);
|
|
131
|
+
private render;
|
|
132
|
+
/** 运行时更新图例项(随图层切换重新渲染) */
|
|
133
|
+
setItems(items: LegendItem[], title?: string): void;
|
|
134
|
+
/** 挂载到容器 */
|
|
135
|
+
addTo(container: HTMLElement): this;
|
|
136
|
+
remove(): void;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 地图导出控件(通用)。
|
|
141
|
+
*
|
|
142
|
+
* 行业专题图渲染后,常需导出当前视图为成果图(PNG)。
|
|
143
|
+
* 基于 maplibre-gl 画布 `toDataURL('image/png')` 生成截图并触发浏览器下载。
|
|
144
|
+
*
|
|
145
|
+
* 设计为「纯函数 triggerDownload + 薄 DOM 绑定」:triggerDownload 不依赖地图,可独立单测。
|
|
146
|
+
*/
|
|
147
|
+
interface ExportOptions {
|
|
148
|
+
/** 下载文件名(不含扩展名) */
|
|
149
|
+
filename?: string;
|
|
150
|
+
/** 挂载容器(可选;不传则自动创建) */
|
|
151
|
+
container?: HTMLElement;
|
|
152
|
+
/** 按钮文案 */
|
|
153
|
+
buttonText?: string;
|
|
154
|
+
}
|
|
155
|
+
/** 纯函数:触发浏览器下载(data URL) */
|
|
156
|
+
declare function triggerDownload(dataUrl: string, filename: string): void;
|
|
157
|
+
/** 导出控件 */
|
|
158
|
+
declare class ExportControl {
|
|
159
|
+
private el;
|
|
160
|
+
private map;
|
|
161
|
+
private filename;
|
|
162
|
+
private onClick;
|
|
163
|
+
constructor(map: ExportControl['map'], options?: ExportOptions);
|
|
164
|
+
/** 导出当前地图视图为 PNG 并下载 */
|
|
165
|
+
export(): void;
|
|
166
|
+
/** 挂载到容器 */
|
|
167
|
+
addTo(container: HTMLElement): this;
|
|
168
|
+
remove(): void;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export { ExportControl, type ExportOptions, LegendControl, type LegendItem, type LegendOptions, type ScaleBar, ScaleControl, type ScaleControlOptions, ThemeSwitcher, type ThemeSwitcherOptions, computeScaleBar, oppositeTheme, renderLegendHtml, themeFromStyle, triggerDownload };
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { ThemeName } from '@caoguo/theme';
|
|
2
|
+
|
|
3
|
+
interface ScaleBar {
|
|
4
|
+
/** 比例尺条代表的真实距离(米) */
|
|
5
|
+
meters: number;
|
|
6
|
+
/** 比例尺条在屏幕上的像素宽度 */
|
|
7
|
+
pixels: number;
|
|
8
|
+
/** 展示文案,如 "500 m" / "2 km" */
|
|
9
|
+
label: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 计算比例尺。
|
|
13
|
+
* @param latitude 当前视图中心纬度(度)
|
|
14
|
+
* @param zoom MapLibre zoom(Web Mercator)
|
|
15
|
+
* @param dpiScale 设备像素比(默认 1;Retina 设为 window.devicePixelRatio)
|
|
16
|
+
* @param maxWidth 比例尺条最大像素宽度(默认 100)
|
|
17
|
+
* @param tileSize 瓦片像素尺寸(默认 512,MapLibre v4 默认)
|
|
18
|
+
*/
|
|
19
|
+
declare function computeScaleBar(latitude: number, zoom: number, opts?: {
|
|
20
|
+
dpiScale?: number;
|
|
21
|
+
maxWidth?: number;
|
|
22
|
+
tileSize?: number;
|
|
23
|
+
}): ScaleBar;
|
|
24
|
+
interface ScaleControlOptions {
|
|
25
|
+
/** 挂载容器(可选;不传则在地图容器内自动创建) */
|
|
26
|
+
container?: HTMLElement;
|
|
27
|
+
/** 是否显示实时坐标(默认 true) */
|
|
28
|
+
showCoordinate?: boolean;
|
|
29
|
+
/** 最大比例尺像素宽度 */
|
|
30
|
+
maxWidth?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 比例尺控件。需传入 maplibre Map 实例(直接用 maplibre-gl 的 Map)。
|
|
34
|
+
*/
|
|
35
|
+
declare class ScaleControl {
|
|
36
|
+
private el;
|
|
37
|
+
private barEl;
|
|
38
|
+
private labelEl;
|
|
39
|
+
private coordEl?;
|
|
40
|
+
private map;
|
|
41
|
+
private opts;
|
|
42
|
+
private onMove;
|
|
43
|
+
private onZoom;
|
|
44
|
+
constructor(map: ScaleControl['map'], options?: ScaleControlOptions);
|
|
45
|
+
/** 把控件挂到地图容器(无预设容器时调用) */
|
|
46
|
+
addTo(container: HTMLElement): this;
|
|
47
|
+
/** 计算并刷新显示 */
|
|
48
|
+
update(): void;
|
|
49
|
+
private handleMove;
|
|
50
|
+
/** 移除控件与事件监听 */
|
|
51
|
+
remove(): void;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* 主题切换控件(T8 / F-1.9)。
|
|
56
|
+
*
|
|
57
|
+
* 在暗色(caoguo-dark)与亮色(caoguo-light)官方矢量主题间切换,
|
|
58
|
+
* 调用 `map.setStyle` 并保留当前视图(center/zoom)与现有 GeoJSON 源/图层。
|
|
59
|
+
*
|
|
60
|
+
* 设计为「纯函数 core + 薄 DOM 绑定」:
|
|
61
|
+
* - `toggleTheme` / `themeFromStyle` 为纯逻辑,可独立单测;
|
|
62
|
+
* - `ThemeSwitcher` 类负责渲染按钮并绑定点击事件。
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
interface ThemeSwitcherOptions {
|
|
66
|
+
/** 挂载容器(可选) */
|
|
67
|
+
container?: HTMLElement;
|
|
68
|
+
/** 初始主题 */
|
|
69
|
+
initial?: ThemeName;
|
|
70
|
+
}
|
|
71
|
+
declare function oppositeTheme(theme: ThemeName): ThemeName;
|
|
72
|
+
/**
|
|
73
|
+
* 从当前 style 对象推断主题名(依据其 JSON 标识)。
|
|
74
|
+
* 非草果主题时回退到传入的 fallback。
|
|
75
|
+
*/
|
|
76
|
+
declare function themeFromStyle(style: {
|
|
77
|
+
name?: string;
|
|
78
|
+
} | string | null | undefined, fallback?: ThemeName): ThemeName;
|
|
79
|
+
declare class ThemeSwitcher {
|
|
80
|
+
private el;
|
|
81
|
+
private btn;
|
|
82
|
+
private current;
|
|
83
|
+
private map;
|
|
84
|
+
constructor(map: ThemeSwitcher['map'], options?: ThemeSwitcherOptions);
|
|
85
|
+
private applyLabel;
|
|
86
|
+
/** 当前主题 */
|
|
87
|
+
getTheme(): ThemeName;
|
|
88
|
+
/** 切换到指定主题(保留视图,diff 模式避免闪烁) */
|
|
89
|
+
setTheme(theme: ThemeName): void;
|
|
90
|
+
/** 在明暗之间切换 */
|
|
91
|
+
toggle(): void;
|
|
92
|
+
/** 挂到容器 */
|
|
93
|
+
addTo(container: HTMLElement): this;
|
|
94
|
+
/** 移除 */
|
|
95
|
+
remove(): void;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 图例控件(通用)。
|
|
100
|
+
*
|
|
101
|
+
* 行业专题图(水深色阶 / 光缆利用率 / 闸站状态 / 故障告警等)渲染后,
|
|
102
|
+
* 需要用户可读的图例说明。本控件接收数据驱动的图例项(label + color),
|
|
103
|
+
* 以「色块 + 文案」形式渲染;支持运行时 setItems 随图层切换更新。
|
|
104
|
+
*
|
|
105
|
+
* 设计为「纯函数 renderLegendHtml + 薄 DOM 绑定」:renderLegendHtml 不依赖浏览器,可独立单测。
|
|
106
|
+
*/
|
|
107
|
+
interface LegendItem {
|
|
108
|
+
/** 文案,如「水深 > 3m」「利用率高」 */
|
|
109
|
+
label: string;
|
|
110
|
+
/** 色值(CSS color,可与渲染层 paint 配色保持一致) */
|
|
111
|
+
color: string;
|
|
112
|
+
/** 标记形状:color 色块(默认)/ line 线段 */
|
|
113
|
+
shape?: 'color' | 'line';
|
|
114
|
+
}
|
|
115
|
+
interface LegendOptions {
|
|
116
|
+
/** 图例标题(可选) */
|
|
117
|
+
title?: string;
|
|
118
|
+
/** 图例项 */
|
|
119
|
+
items: LegendItem[];
|
|
120
|
+
/** 挂载容器(可选;不传则自动创建) */
|
|
121
|
+
container?: HTMLElement;
|
|
122
|
+
}
|
|
123
|
+
/** 纯函数:根据图例项生成 HTML 字符串(可单测) */
|
|
124
|
+
declare function renderLegendHtml(items: LegendItem[], title?: string): string;
|
|
125
|
+
/** 图例控件 */
|
|
126
|
+
declare class LegendControl {
|
|
127
|
+
private el;
|
|
128
|
+
private bodyEl;
|
|
129
|
+
private opts;
|
|
130
|
+
constructor(options: LegendOptions);
|
|
131
|
+
private render;
|
|
132
|
+
/** 运行时更新图例项(随图层切换重新渲染) */
|
|
133
|
+
setItems(items: LegendItem[], title?: string): void;
|
|
134
|
+
/** 挂载到容器 */
|
|
135
|
+
addTo(container: HTMLElement): this;
|
|
136
|
+
remove(): void;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 地图导出控件(通用)。
|
|
141
|
+
*
|
|
142
|
+
* 行业专题图渲染后,常需导出当前视图为成果图(PNG)。
|
|
143
|
+
* 基于 maplibre-gl 画布 `toDataURL('image/png')` 生成截图并触发浏览器下载。
|
|
144
|
+
*
|
|
145
|
+
* 设计为「纯函数 triggerDownload + 薄 DOM 绑定」:triggerDownload 不依赖地图,可独立单测。
|
|
146
|
+
*/
|
|
147
|
+
interface ExportOptions {
|
|
148
|
+
/** 下载文件名(不含扩展名) */
|
|
149
|
+
filename?: string;
|
|
150
|
+
/** 挂载容器(可选;不传则自动创建) */
|
|
151
|
+
container?: HTMLElement;
|
|
152
|
+
/** 按钮文案 */
|
|
153
|
+
buttonText?: string;
|
|
154
|
+
}
|
|
155
|
+
/** 纯函数:触发浏览器下载(data URL) */
|
|
156
|
+
declare function triggerDownload(dataUrl: string, filename: string): void;
|
|
157
|
+
/** 导出控件 */
|
|
158
|
+
declare class ExportControl {
|
|
159
|
+
private el;
|
|
160
|
+
private map;
|
|
161
|
+
private filename;
|
|
162
|
+
private onClick;
|
|
163
|
+
constructor(map: ExportControl['map'], options?: ExportOptions);
|
|
164
|
+
/** 导出当前地图视图为 PNG 并下载 */
|
|
165
|
+
export(): void;
|
|
166
|
+
/** 挂载到容器 */
|
|
167
|
+
addTo(container: HTMLElement): this;
|
|
168
|
+
remove(): void;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export { ExportControl, type ExportOptions, LegendControl, type LegendItem, type LegendOptions, type ScaleBar, ScaleControl, type ScaleControlOptions, ThemeSwitcher, type ThemeSwitcherOptions, computeScaleBar, oppositeTheme, renderLegendHtml, themeFromStyle, triggerDownload };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { ExportControl, LegendControl, ScaleControl, ThemeSwitcher, computeScaleBar, oppositeTheme, renderLegendHtml, themeFromStyle, triggerDownload } from '../chunk-MLLIAWVI.js';
|
|
2
|
+
import '../chunk-DENQSIV2.js';
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/crs/gcj02.ts
|
|
4
|
+
var PI = Math.PI;
|
|
5
|
+
var A = 6378245;
|
|
6
|
+
var EE = 0.006693421622965943;
|
|
7
|
+
function outOfChina(lng, lat) {
|
|
8
|
+
return lng < 72.004 || lng > 137.8347 || lat < 0.8293 || lat > 55.8271;
|
|
9
|
+
}
|
|
10
|
+
function transformLat(lng, lat) {
|
|
11
|
+
let ret = -100 + 2 * lng + 3 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
|
|
12
|
+
ret += (20 * Math.sin(6 * lng * PI) + 20 * Math.sin(2 * lng * PI)) * 2 / 3;
|
|
13
|
+
ret += (20 * Math.sin(lat * PI) + 40 * Math.sin(lat / 3 * PI)) * 2 / 3;
|
|
14
|
+
ret += (160 * Math.sin(lat / 12 * PI) + 320 * Math.sin(lat * PI / 30)) * 2 / 3;
|
|
15
|
+
return ret;
|
|
16
|
+
}
|
|
17
|
+
function transformLng(lng, lat) {
|
|
18
|
+
let ret = 300 + lng + 2 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
|
|
19
|
+
ret += (20 * Math.sin(6 * lng * PI) + 20 * Math.sin(2 * lng * PI)) * 2 / 3;
|
|
20
|
+
ret += (20 * Math.sin(lng * PI) + 40 * Math.sin(lng / 3 * PI)) * 2 / 3;
|
|
21
|
+
ret += (150 * Math.sin(lng / 12 * PI) + 300 * Math.sin(lng / 30 * PI)) * 2 / 3;
|
|
22
|
+
return ret;
|
|
23
|
+
}
|
|
24
|
+
function wgs84ToGcj02(lng, lat) {
|
|
25
|
+
if (outOfChina(lng, lat)) return [lng, lat];
|
|
26
|
+
let dLat = transformLat(lng - 105, lat - 35);
|
|
27
|
+
let dLng = transformLng(lng - 105, lat - 35);
|
|
28
|
+
const radLat = lat / 180 * PI;
|
|
29
|
+
let magic = Math.sin(radLat);
|
|
30
|
+
magic = 1 - EE * magic * magic;
|
|
31
|
+
const sqrtMagic = Math.sqrt(magic);
|
|
32
|
+
dLat = dLat * 180 / (A * (1 - EE) / (magic * sqrtMagic) * PI);
|
|
33
|
+
dLng = dLng * 180 / (A / sqrtMagic * Math.cos(radLat) * PI);
|
|
34
|
+
return [lng + dLng, lat + dLat];
|
|
35
|
+
}
|
|
36
|
+
function gcj02ToWgs84(lng, lat) {
|
|
37
|
+
if (outOfChina(lng, lat)) return [lng, lat];
|
|
38
|
+
let [mlng, mlat] = wgs84ToGcj02(lng, lat);
|
|
39
|
+
let dlng = mlng - lng;
|
|
40
|
+
let dlat = mlat - lat;
|
|
41
|
+
[mlng, mlat] = wgs84ToGcj02(lng - dlng, lat - dlat);
|
|
42
|
+
dlng = mlng - lng;
|
|
43
|
+
dlat = mlat - lat;
|
|
44
|
+
[mlng, mlat] = wgs84ToGcj02(lng - dlng, lat - dlat);
|
|
45
|
+
dlng = mlng - lng;
|
|
46
|
+
dlat = mlat - lat;
|
|
47
|
+
return [lng - dlng, lat - dlat];
|
|
48
|
+
}
|
|
49
|
+
function isInChina(lng, lat) {
|
|
50
|
+
return !outOfChina(lng, lat);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// src/crs/cgcs2000.ts
|
|
54
|
+
var gridShift = null;
|
|
55
|
+
function setCgcs2000GridShift(provider) {
|
|
56
|
+
gridShift = provider;
|
|
57
|
+
}
|
|
58
|
+
function wgs84ToCgcs2000(lng, lat) {
|
|
59
|
+
if (!gridShift) return [lng, lat];
|
|
60
|
+
const [dLng, dLat] = gridShift.shift(lng, lat);
|
|
61
|
+
return [lng + dLng, lat + dLat];
|
|
62
|
+
}
|
|
63
|
+
function cgcs2000ToWgs84(lng, lat) {
|
|
64
|
+
if (!gridShift) return [lng, lat];
|
|
65
|
+
const [dLng, dLat] = gridShift.shift(lng, lat);
|
|
66
|
+
return [lng - dLng, lat - dLat];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// src/crs/transform.ts
|
|
70
|
+
function toWgs84(crs, lng, lat) {
|
|
71
|
+
switch (crs) {
|
|
72
|
+
case "WGS84":
|
|
73
|
+
return [lng, lat];
|
|
74
|
+
case "GCJ02":
|
|
75
|
+
return gcj02ToWgs84(lng, lat);
|
|
76
|
+
case "CGCS2000":
|
|
77
|
+
return cgcs2000ToWgs84(lng, lat);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function fromWgs84(crs, lng, lat) {
|
|
81
|
+
switch (crs) {
|
|
82
|
+
case "WGS84":
|
|
83
|
+
return [lng, lat];
|
|
84
|
+
case "GCJ02":
|
|
85
|
+
return wgs84ToGcj02(lng, lat);
|
|
86
|
+
case "CGCS2000":
|
|
87
|
+
return wgs84ToCgcs2000(lng, lat);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function createTransformer(from, to) {
|
|
91
|
+
if (from === to) {
|
|
92
|
+
const identity = (lng, lat) => [lng, lat];
|
|
93
|
+
return { forward: identity, inverse: identity };
|
|
94
|
+
}
|
|
95
|
+
const forward = (lng, lat) => {
|
|
96
|
+
const [wLng, wLat] = toWgs84(from, lng, lat);
|
|
97
|
+
return fromWgs84(to, wLng, wLat);
|
|
98
|
+
};
|
|
99
|
+
const inverse = (lng, lat) => {
|
|
100
|
+
const [wLng, wLat] = toWgs84(to, lng, lat);
|
|
101
|
+
return fromWgs84(from, wLng, wLat);
|
|
102
|
+
};
|
|
103
|
+
return { forward, inverse };
|
|
104
|
+
}
|
|
105
|
+
function transformPoint(lng, lat, from, to) {
|
|
106
|
+
return createTransformer(from, to).forward(lng, lat);
|
|
107
|
+
}
|
|
108
|
+
function transformBounds(b, from, to) {
|
|
109
|
+
const t = createTransformer(from, to);
|
|
110
|
+
const xs = [];
|
|
111
|
+
const ys = [];
|
|
112
|
+
for (const [x, y] of [
|
|
113
|
+
[b[0], b[1]],
|
|
114
|
+
[b[2], b[1]],
|
|
115
|
+
[b[0], b[3]],
|
|
116
|
+
[b[2], b[3]]
|
|
117
|
+
]) {
|
|
118
|
+
const [nx, ny] = t.forward(x, y);
|
|
119
|
+
xs.push(nx);
|
|
120
|
+
ys.push(ny);
|
|
121
|
+
}
|
|
122
|
+
return [Math.min(...xs), Math.min(...ys), Math.max(...xs), Math.max(...ys)];
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
exports.cgcs2000ToWgs84 = cgcs2000ToWgs84;
|
|
126
|
+
exports.createTransformer = createTransformer;
|
|
127
|
+
exports.fromWgs84 = fromWgs84;
|
|
128
|
+
exports.gcj02ToWgs84 = gcj02ToWgs84;
|
|
129
|
+
exports.isInChina = isInChina;
|
|
130
|
+
exports.setCgcs2000GridShift = setCgcs2000GridShift;
|
|
131
|
+
exports.toWgs84 = toWgs84;
|
|
132
|
+
exports.transformBounds = transformBounds;
|
|
133
|
+
exports.transformPoint = transformPoint;
|
|
134
|
+
exports.wgs84ToCgcs2000 = wgs84ToCgcs2000;
|
|
135
|
+
exports.wgs84ToGcj02 = wgs84ToGcj02;
|
|
136
|
+
//# sourceMappingURL=index.cjs.map
|
|
137
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/crs/gcj02.ts","../../src/crs/cgcs2000.ts","../../src/crs/transform.ts"],"names":[],"mappings":";;;AAQA,IAAM,KAAK,IAAA,CAAK,EAAA;AAChB,IAAM,CAAA,GAAI,OAAA;AACV,IAAM,EAAA,GAAK,oBAAA;AAEX,SAAS,UAAA,CAAW,KAAa,GAAA,EAAsB;AACrD,EAAA,OAAO,MAAM,MAAA,IAAU,GAAA,GAAM,QAAA,IAAY,GAAA,GAAM,UAAU,GAAA,GAAM,OAAA;AACjE;AAEA,SAAS,YAAA,CAAa,KAAa,GAAA,EAAqB;AACtD,EAAA,IAAI,MACF,IAAA,GACA,CAAA,GAAM,MACN,CAAA,GAAM,GAAA,GACN,MAAM,GAAA,GAAM,GAAA,GACZ,GAAA,GAAM,GAAA,GAAM,MACZ,GAAA,GAAM,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAC/B,EAAA,GAAA,IAAA,CAAS,EAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAM,MAAM,EAAE,CAAA,GAAI,EAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAM,GAAA,GAAM,EAAE,KAAK,CAAA,GAAO,CAAA;AACrF,EAAA,GAAA,IAAA,CAAS,EAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,EAAE,CAAA,GAAI,EAAA,GAAO,IAAA,CAAK,GAAA,CAAK,GAAA,GAAM,CAAA,GAAO,EAAE,KAAK,CAAA,GAAO,CAAA;AACjF,EAAA,GAAA,IAAA,CAAS,GAAA,GAAQ,IAAA,CAAK,GAAA,CAAK,GAAA,GAAM,KAAQ,EAAE,CAAA,GAAI,GAAA,GAAM,IAAA,CAAK,GAAA,CAAK,GAAA,GAAM,EAAA,GAAM,EAAI,KAAK,CAAA,GAAO,CAAA;AAC3F,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAA,CAAa,KAAa,GAAA,EAAqB;AACtD,EAAA,IAAI,MACF,GAAA,GACA,GAAA,GACA,CAAA,GAAM,GAAA,GACN,MAAM,GAAA,GAAM,GAAA,GACZ,GAAA,GAAM,GAAA,GAAM,MACZ,GAAA,GAAM,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAC/B,EAAA,GAAA,IAAA,CAAS,EAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAM,MAAM,EAAE,CAAA,GAAI,EAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAM,GAAA,GAAM,EAAE,KAAK,CAAA,GAAO,CAAA;AACrF,EAAA,GAAA,IAAA,CAAS,EAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,EAAE,CAAA,GAAI,EAAA,GAAO,IAAA,CAAK,GAAA,CAAK,GAAA,GAAM,CAAA,GAAO,EAAE,KAAK,CAAA,GAAO,CAAA;AACjF,EAAA,GAAA,IAAA,CAAS,GAAA,GAAQ,IAAA,CAAK,GAAA,CAAK,GAAA,GAAM,KAAQ,EAAE,CAAA,GAAI,GAAA,GAAQ,IAAA,CAAK,GAAA,CAAK,GAAA,GAAM,EAAA,GAAQ,EAAE,KAAK,CAAA,GAAO,CAAA;AAC7F,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,YAAA,CAAa,KAAa,GAAA,EAA+B;AACvE,EAAA,IAAI,WAAW,GAAA,EAAK,GAAG,GAAG,OAAO,CAAC,KAAK,GAAG,CAAA;AAC1C,EAAA,IAAI,IAAA,GAAO,YAAA,CAAa,GAAA,GAAM,GAAA,EAAO,MAAM,EAAI,CAAA;AAC/C,EAAA,IAAI,IAAA,GAAO,YAAA,CAAa,GAAA,GAAM,GAAA,EAAO,MAAM,EAAI,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAU,MAAM,GAAA,GAAS,EAAA;AAC/B,EAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAC3B,EAAA,KAAA,GAAQ,CAAA,GAAI,KAAK,KAAA,GAAQ,KAAA;AACzB,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AACjC,EAAA,IAAA,GAAQ,OAAO,GAAA,IAAY,CAAA,IAAK,CAAA,GAAI,EAAA,CAAA,IAAQ,QAAQ,SAAA,CAAA,GAAc,EAAA,CAAA;AAClE,EAAA,IAAA,GAAQ,OAAO,GAAA,IAAW,CAAA,GAAI,YAAa,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,EAAA,CAAA;AAC9D,EAAA,OAAO,CAAC,GAAA,GAAM,IAAA,EAAM,GAAA,GAAM,IAAI,CAAA;AAChC;AAGO,SAAS,YAAA,CAAa,KAAa,GAAA,EAA+B;AACvE,EAAA,IAAI,WAAW,GAAA,EAAK,GAAG,GAAG,OAAO,CAAC,KAAK,GAAG,CAAA;AAC1C,EAAA,IAAI,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,YAAA,CAAa,KAAK,GAAG,CAAA;AACxC,EAAA,IAAI,OAAO,IAAA,GAAO,GAAA;AAClB,EAAA,IAAI,OAAO,IAAA,GAAO,GAAA;AAElB,EAAA,CAAC,MAAM,IAAI,CAAA,GAAI,aAAa,GAAA,GAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAClD,EAAA,IAAA,GAAO,IAAA,GAAO,GAAA;AACd,EAAA,IAAA,GAAO,IAAA,GAAO,GAAA;AAEd,EAAA,CAAC,MAAM,IAAI,CAAA,GAAI,aAAa,GAAA,GAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAClD,EAAA,IAAA,GAAO,IAAA,GAAO,GAAA;AACd,EAAA,IAAA,GAAO,IAAA,GAAO,GAAA;AACd,EAAA,OAAO,CAAC,GAAA,GAAM,IAAA,EAAM,GAAA,GAAM,IAAI,CAAA;AAChC;AAGO,SAAS,SAAA,CAAU,KAAa,GAAA,EAAsB;AAC3D,EAAA,OAAO,CAAC,UAAA,CAAW,GAAA,EAAK,GAAG,CAAA;AAC7B;;;ACjEA,IAAI,SAAA,GAAsC,IAAA;AAGnC,SAAS,qBAAqB,QAAA,EAA0C;AAC7E,EAAA,SAAA,GAAY,QAAA;AACd;AAGO,SAAS,eAAA,CAAgB,KAAa,GAAA,EAAqB;AAChE,EAAA,IAAI,CAAC,SAAA,EAAW,OAAO,CAAC,KAAK,GAAG,CAAA;AAChC,EAAA,MAAM,CAAC,IAAA,EAAM,IAAI,IAAI,SAAA,CAAU,KAAA,CAAM,KAAK,GAAG,CAAA;AAC7C,EAAA,OAAO,CAAC,GAAA,GAAM,IAAA,EAAM,GAAA,GAAM,IAAI,CAAA;AAChC;AAGO,SAAS,eAAA,CAAgB,KAAa,GAAA,EAAqB;AAChE,EAAA,IAAI,CAAC,SAAA,EAAW,OAAO,CAAC,KAAK,GAAG,CAAA;AAChC,EAAA,MAAM,CAAC,IAAA,EAAM,IAAI,IAAI,SAAA,CAAU,KAAA,CAAM,KAAK,GAAG,CAAA;AAC7C,EAAA,OAAO,CAAC,GAAA,GAAM,IAAA,EAAM,GAAA,GAAM,IAAI,CAAA;AAChC;;;ACnBO,SAAS,OAAA,CAAQ,GAAA,EAAU,GAAA,EAAa,GAAA,EAAqB;AAClE,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,OAAA;AACH,MAAA,OAAO,CAAC,KAAK,GAAG,CAAA;AAAA,IAClB,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,IAC9B,KAAK,UAAA;AACH,MAAA,OAAO,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA;AAErC;AAGO,SAAS,SAAA,CAAU,GAAA,EAAU,GAAA,EAAa,GAAA,EAAqB;AACpE,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,OAAA;AACH,MAAA,OAAO,CAAC,KAAK,GAAG,CAAA;AAAA,IAClB,KAAK,OAAA;AACH,MAAA,OAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,IAC9B,KAAK,UAAA;AACH,MAAA,OAAO,eAAA,CAAgB,KAAK,GAAG,CAAA;AAAA;AAErC;AAEO,SAAS,iBAAA,CAAkB,MAAW,EAAA,EAAsB;AACjE,EAAA,IAAI,SAAS,EAAA,EAAI;AACf,IAAA,MAAM,WAAW,CAAC,GAAA,EAAa,GAAA,KAAwB,CAAC,KAAK,GAAG,CAAA;AAChE,IAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,QAAA,EAAS;AAAA,EAChD;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,EAAa,GAAA,KAAwB;AACpD,IAAA,MAAM,CAAC,IAAA,EAAM,IAAI,IAAI,OAAA,CAAQ,IAAA,EAAM,KAAK,GAAG,CAAA;AAC3C,IAAA,OAAO,SAAA,CAAU,EAAA,EAAI,IAAA,EAAM,IAAI,CAAA;AAAA,EACjC,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAA,EAAa,GAAA,KAAwB;AACpD,IAAA,MAAM,CAAC,IAAA,EAAM,IAAI,IAAI,OAAA,CAAQ,EAAA,EAAI,KAAK,GAAG,CAAA;AACzC,IAAA,OAAO,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAAA,EACnC,CAAA;AACA,EAAA,OAAO,EAAE,SAAS,OAAA,EAAQ;AAC5B;AAGO,SAAS,cAAA,CACd,GAAA,EACA,GAAA,EACA,IAAA,EACA,EAAA,EACQ;AACR,EAAA,OAAO,kBAAkB,IAAA,EAAM,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAK,GAAG,CAAA;AACrD;AAGO,SAAS,eAAA,CAAgB,CAAA,EAAW,IAAA,EAAW,EAAA,EAAiB;AACrE,EAAA,MAAM,CAAA,GAAI,iBAAA,CAAkB,IAAA,EAAM,EAAE,CAAA;AACpC,EAAA,MAAM,KAAe,EAAC;AACtB,EAAA,MAAM,KAAe,EAAC;AACtB,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK;AAAA,IACnB,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IACX,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IACX,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IACX,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC;AAAA,GACb,EAAG;AACD,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,IAAI,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAC,CAAA;AAC/B,IAAA,EAAA,CAAG,KAAK,EAAE,CAAA;AACV,IAAA,EAAA,CAAG,KAAK,EAAE,CAAA;AAAA,EACZ;AACA,EAAA,OAAO,CAAC,KAAK,GAAA,CAAI,GAAG,EAAE,CAAA,EAAG,IAAA,CAAK,IAAI,GAAG,EAAE,GAAG,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA,EAAG,KAAK,GAAA,CAAI,GAAG,EAAE,CAAC,CAAA;AAC5E","file":"index.cjs","sourcesContent":["/**\n * WGS84 <-> GCJ-02(火星坐标系)转换。\n *\n * 算法:公开的解析偏移模型(Krasovsky 椭球),与 coordtransform 一致。\n * 全国范围单点误差 < 50m(PRD 验收 F-1.1)。\n * 注意:GCJ-02 -> WGS84 采用 3 次迭代反算,进一步收敛残差。\n */\n\nconst PI = Math.PI;\nconst A = 6378245.0; // 长半轴\nconst EE = 0.00669342162296594323; // 第一偏心率平方\n\nfunction outOfChina(lng: number, lat: number): boolean {\n return lng < 72.004 || lng > 137.8347 || lat < 0.8293 || lat > 55.8271;\n}\n\nfunction transformLat(lng: number, lat: number): number {\n let ret =\n -100.0 +\n 2.0 * lng +\n 3.0 * lat +\n 0.2 * lat * lat +\n 0.1 * lng * lat +\n 0.2 * Math.sqrt(Math.abs(lng));\n ret += ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0) / 3.0;\n ret += ((20.0 * Math.sin(lat * PI) + 40.0 * Math.sin((lat / 3.0) * PI)) * 2.0) / 3.0;\n ret += ((160.0 * Math.sin((lat / 12.0) * PI) + 320 * Math.sin((lat * PI) / 30.0)) * 2.0) / 3.0;\n return ret;\n}\n\nfunction transformLng(lng: number, lat: number): number {\n let ret =\n 300.0 +\n lng +\n 2.0 * lat +\n 0.1 * lng * lng +\n 0.1 * lng * lat +\n 0.1 * Math.sqrt(Math.abs(lng));\n ret += ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0) / 3.0;\n ret += ((20.0 * Math.sin(lng * PI) + 40.0 * Math.sin((lng / 3.0) * PI)) * 2.0) / 3.0;\n ret += ((150.0 * Math.sin((lng / 12.0) * PI) + 300.0 * Math.sin((lng / 30.0) * PI)) * 2.0) / 3.0;\n return ret;\n}\n\n/** WGS84 -> GCJ-02 */\nexport function wgs84ToGcj02(lng: number, lat: number): [number, number] {\n if (outOfChina(lng, lat)) return [lng, lat];\n let dLat = transformLat(lng - 105.0, lat - 35.0);\n let dLng = transformLng(lng - 105.0, lat - 35.0);\n const radLat = (lat / 180.0) * PI;\n let magic = Math.sin(radLat);\n magic = 1 - EE * magic * magic;\n const sqrtMagic = Math.sqrt(magic);\n dLat = (dLat * 180.0) / (((A * (1 - EE)) / (magic * sqrtMagic)) * PI);\n dLng = (dLng * 180.0) / ((A / sqrtMagic) * Math.cos(radLat) * PI);\n return [lng + dLng, lat + dLat];\n}\n\n/** GCJ-02 -> WGS84(3 次迭代反算) */\nexport function gcj02ToWgs84(lng: number, lat: number): [number, number] {\n if (outOfChina(lng, lat)) return [lng, lat];\n let [mlng, mlat] = wgs84ToGcj02(lng, lat);\n let dlng = mlng - lng;\n let dlat = mlat - lat;\n // 一次迭代\n [mlng, mlat] = wgs84ToGcj02(lng - dlng, lat - dlat);\n dlng = mlng - lng;\n dlat = mlat - lat;\n // 二次迭代(收敛)\n [mlng, mlat] = wgs84ToGcj02(lng - dlng, lat - dlat);\n dlng = mlng - lng;\n dlat = mlat - lat;\n return [lng - dlng, lat - dlat];\n}\n\n/** 是否在 GCJ-02 偏移覆盖区(中国境内外判定) */\nexport function isInChina(lng: number, lat: number): boolean {\n return !outOfChina(lng, lat);\n}\n","/**\n * WGS84 <-> CGCS2000 转换。\n *\n * 说明:CGCS2000 与 WGS84 采用近似相同的参考椭球(扁率/长半轴差异极小,\n * 历元差异仅导致 cm~dm 级点位偏移),在 Web Mercator 显示尺度下等价于一致。\n * 因此 Phase 0 默认实现为恒等变换(残差 < 0.5m,满足 PRD 验收 F-1.1)。\n *\n * 测绘级高精度需求:可注入 `GridShiftProvider`(区域 7 参数 / 格网平移),\n * 见 types.ts。本文件保留可扩展入口。\n */\n\nimport type { GridShiftProvider, LngLat } from './types';\n\nlet gridShift: GridShiftProvider | null = null;\n\n/** 注册 CGCS2000 偏移提供方(可选,测绘级) */\nexport function setCgcs2000GridShift(provider: GridShiftProvider | null): void {\n gridShift = provider;\n}\n\n/** WGS84 -> CGCS2000 */\nexport function wgs84ToCgcs2000(lng: number, lat: number): LngLat {\n if (!gridShift) return [lng, lat];\n const [dLng, dLat] = gridShift.shift(lng, lat);\n return [lng + dLng, lat + dLat];\n}\n\n/** CGCS2000 -> WGS84 */\nexport function cgcs2000ToWgs84(lng: number, lat: number): LngLat {\n if (!gridShift) return [lng, lat];\n const [dLng, dLat] = gridShift.shift(lng, lat);\n return [lng - dLng, lat - dLat];\n}\n","/**\n * 坐标系变换组合器(以 WGS84 为枢纽)。\n *\n * 用法:\n * const t = createTransformer('GCJ02', 'WGS84');\n * const [lng, lat] = t.forward(114.30, 30.59); // GCJ-02 业务数据 -> 渲染基准\n */\n\nimport type { Bounds, CRS, LngLat, Transformer } from './types';\nimport { cgcs2000ToWgs84, wgs84ToCgcs2000 } from './cgcs2000';\nimport { gcj02ToWgs84, wgs84ToGcj02 } from './gcj02';\n\n/** 把任意 CRS 的坐标转换到 WGS84 */\nexport function toWgs84(crs: CRS, lng: number, lat: number): LngLat {\n switch (crs) {\n case 'WGS84':\n return [lng, lat];\n case 'GCJ02':\n return gcj02ToWgs84(lng, lat);\n case 'CGCS2000':\n return cgcs2000ToWgs84(lng, lat);\n }\n}\n\n/** 把 WGS84 坐标转换到目标 CRS */\nexport function fromWgs84(crs: CRS, lng: number, lat: number): LngLat {\n switch (crs) {\n case 'WGS84':\n return [lng, lat];\n case 'GCJ02':\n return wgs84ToGcj02(lng, lat);\n case 'CGCS2000':\n return wgs84ToCgcs2000(lng, lat);\n }\n}\n\nexport function createTransformer(from: CRS, to: CRS): Transformer {\n if (from === to) {\n const identity = (lng: number, lat: number): LngLat => [lng, lat];\n return { forward: identity, inverse: identity };\n }\n const forward = (lng: number, lat: number): LngLat => {\n const [wLng, wLat] = toWgs84(from, lng, lat);\n return fromWgs84(to, wLng, wLat);\n };\n const inverse = (lng: number, lat: number): LngLat => {\n const [wLng, wLat] = toWgs84(to, lng, lat);\n return fromWgs84(from, wLng, wLat);\n };\n return { forward, inverse };\n}\n\n/** 单点快捷转换 */\nexport function transformPoint(\n lng: number,\n lat: number,\n from: CRS,\n to: CRS\n): LngLat {\n return createTransformer(from, to).forward(lng, lat);\n}\n\n/** 范围 [w, s, e, n] 转换(取四个角点极值) */\nexport function transformBounds(b: Bounds, from: CRS, to: CRS): Bounds {\n const t = createTransformer(from, to);\n const xs: number[] = [];\n const ys: number[] = [];\n for (const [x, y] of [\n [b[0], b[1]],\n [b[2], b[1]],\n [b[0], b[3]],\n [b[2], b[3]],\n ]) {\n const [nx, ny] = t.forward(x, y);\n xs.push(nx);\n ys.push(ny);\n }\n return [Math.min(...xs), Math.min(...ys), Math.max(...xs), Math.max(...ys)];\n}\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 坐标系类型与变换接口(F-1.1)。
|
|
3
|
+
*
|
|
4
|
+
* 草果地图内部统一以 WGS84(EPSG:4326)为渲染基准。
|
|
5
|
+
* 业务数据可能为 GCJ-02(火星坐标)或 CGCS2000(国家2000),
|
|
6
|
+
* 通过 `createTransformer` 以 WGS84 为枢纽做相互转换。
|
|
7
|
+
*/
|
|
8
|
+
type CRS = 'WGS84' | 'GCJ02' | 'CGCS2000';
|
|
9
|
+
type LngLat = [number, number];
|
|
10
|
+
/** 一个坐标对(经/纬),与 MapLibre [lng, lat] 顺序一致 */
|
|
11
|
+
type Point = LngLat;
|
|
12
|
+
/** 地理范围 [west, south, east, north] */
|
|
13
|
+
type Bounds = [number, number, number, number];
|
|
14
|
+
interface Transformer {
|
|
15
|
+
/** 正向变换:from -> to */
|
|
16
|
+
forward(lng: number, lat: number): LngLat;
|
|
17
|
+
/** 逆向变换:to -> from(数学逆) */
|
|
18
|
+
inverse(lng: number, lat: number): LngLat;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* CGCS2000 高精度偏移提供方(可选)。
|
|
22
|
+
* Phase 0 默认不接入官方格网,使用等价实现(误差 < 0.5m)。
|
|
23
|
+
* 测绘级场景可注入区域 7 参数 / 格网平移表。
|
|
24
|
+
*/
|
|
25
|
+
interface GridShiftProvider {
|
|
26
|
+
/** 返回相对 WGS84 的 [dLng, dLat] 偏移(单位:度) */
|
|
27
|
+
shift(lng: number, lat: number): LngLat;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* WGS84 <-> GCJ-02(火星坐标系)转换。
|
|
32
|
+
*
|
|
33
|
+
* 算法:公开的解析偏移模型(Krasovsky 椭球),与 coordtransform 一致。
|
|
34
|
+
* 全国范围单点误差 < 50m(PRD 验收 F-1.1)。
|
|
35
|
+
* 注意:GCJ-02 -> WGS84 采用 3 次迭代反算,进一步收敛残差。
|
|
36
|
+
*/
|
|
37
|
+
/** WGS84 -> GCJ-02 */
|
|
38
|
+
declare function wgs84ToGcj02(lng: number, lat: number): [number, number];
|
|
39
|
+
/** GCJ-02 -> WGS84(3 次迭代反算) */
|
|
40
|
+
declare function gcj02ToWgs84(lng: number, lat: number): [number, number];
|
|
41
|
+
/** 是否在 GCJ-02 偏移覆盖区(中国境内外判定) */
|
|
42
|
+
declare function isInChina(lng: number, lat: number): boolean;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* WGS84 <-> CGCS2000 转换。
|
|
46
|
+
*
|
|
47
|
+
* 说明:CGCS2000 与 WGS84 采用近似相同的参考椭球(扁率/长半轴差异极小,
|
|
48
|
+
* 历元差异仅导致 cm~dm 级点位偏移),在 Web Mercator 显示尺度下等价于一致。
|
|
49
|
+
* 因此 Phase 0 默认实现为恒等变换(残差 < 0.5m,满足 PRD 验收 F-1.1)。
|
|
50
|
+
*
|
|
51
|
+
* 测绘级高精度需求:可注入 `GridShiftProvider`(区域 7 参数 / 格网平移),
|
|
52
|
+
* 见 types.ts。本文件保留可扩展入口。
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
/** 注册 CGCS2000 偏移提供方(可选,测绘级) */
|
|
56
|
+
declare function setCgcs2000GridShift(provider: GridShiftProvider | null): void;
|
|
57
|
+
/** WGS84 -> CGCS2000 */
|
|
58
|
+
declare function wgs84ToCgcs2000(lng: number, lat: number): LngLat;
|
|
59
|
+
/** CGCS2000 -> WGS84 */
|
|
60
|
+
declare function cgcs2000ToWgs84(lng: number, lat: number): LngLat;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 坐标系变换组合器(以 WGS84 为枢纽)。
|
|
64
|
+
*
|
|
65
|
+
* 用法:
|
|
66
|
+
* const t = createTransformer('GCJ02', 'WGS84');
|
|
67
|
+
* const [lng, lat] = t.forward(114.30, 30.59); // GCJ-02 业务数据 -> 渲染基准
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
/** 把任意 CRS 的坐标转换到 WGS84 */
|
|
71
|
+
declare function toWgs84(crs: CRS, lng: number, lat: number): LngLat;
|
|
72
|
+
/** 把 WGS84 坐标转换到目标 CRS */
|
|
73
|
+
declare function fromWgs84(crs: CRS, lng: number, lat: number): LngLat;
|
|
74
|
+
declare function createTransformer(from: CRS, to: CRS): Transformer;
|
|
75
|
+
/** 单点快捷转换 */
|
|
76
|
+
declare function transformPoint(lng: number, lat: number, from: CRS, to: CRS): LngLat;
|
|
77
|
+
/** 范围 [w, s, e, n] 转换(取四个角点极值) */
|
|
78
|
+
declare function transformBounds(b: Bounds, from: CRS, to: CRS): Bounds;
|
|
79
|
+
|
|
80
|
+
export { type Bounds, type CRS, type GridShiftProvider, type LngLat, type Point, type Transformer, cgcs2000ToWgs84, createTransformer, fromWgs84, gcj02ToWgs84, isInChina, setCgcs2000GridShift, toWgs84, transformBounds, transformPoint, wgs84ToCgcs2000, wgs84ToGcj02 };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 坐标系类型与变换接口(F-1.1)。
|
|
3
|
+
*
|
|
4
|
+
* 草果地图内部统一以 WGS84(EPSG:4326)为渲染基准。
|
|
5
|
+
* 业务数据可能为 GCJ-02(火星坐标)或 CGCS2000(国家2000),
|
|
6
|
+
* 通过 `createTransformer` 以 WGS84 为枢纽做相互转换。
|
|
7
|
+
*/
|
|
8
|
+
type CRS = 'WGS84' | 'GCJ02' | 'CGCS2000';
|
|
9
|
+
type LngLat = [number, number];
|
|
10
|
+
/** 一个坐标对(经/纬),与 MapLibre [lng, lat] 顺序一致 */
|
|
11
|
+
type Point = LngLat;
|
|
12
|
+
/** 地理范围 [west, south, east, north] */
|
|
13
|
+
type Bounds = [number, number, number, number];
|
|
14
|
+
interface Transformer {
|
|
15
|
+
/** 正向变换:from -> to */
|
|
16
|
+
forward(lng: number, lat: number): LngLat;
|
|
17
|
+
/** 逆向变换:to -> from(数学逆) */
|
|
18
|
+
inverse(lng: number, lat: number): LngLat;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* CGCS2000 高精度偏移提供方(可选)。
|
|
22
|
+
* Phase 0 默认不接入官方格网,使用等价实现(误差 < 0.5m)。
|
|
23
|
+
* 测绘级场景可注入区域 7 参数 / 格网平移表。
|
|
24
|
+
*/
|
|
25
|
+
interface GridShiftProvider {
|
|
26
|
+
/** 返回相对 WGS84 的 [dLng, dLat] 偏移(单位:度) */
|
|
27
|
+
shift(lng: number, lat: number): LngLat;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* WGS84 <-> GCJ-02(火星坐标系)转换。
|
|
32
|
+
*
|
|
33
|
+
* 算法:公开的解析偏移模型(Krasovsky 椭球),与 coordtransform 一致。
|
|
34
|
+
* 全国范围单点误差 < 50m(PRD 验收 F-1.1)。
|
|
35
|
+
* 注意:GCJ-02 -> WGS84 采用 3 次迭代反算,进一步收敛残差。
|
|
36
|
+
*/
|
|
37
|
+
/** WGS84 -> GCJ-02 */
|
|
38
|
+
declare function wgs84ToGcj02(lng: number, lat: number): [number, number];
|
|
39
|
+
/** GCJ-02 -> WGS84(3 次迭代反算) */
|
|
40
|
+
declare function gcj02ToWgs84(lng: number, lat: number): [number, number];
|
|
41
|
+
/** 是否在 GCJ-02 偏移覆盖区(中国境内外判定) */
|
|
42
|
+
declare function isInChina(lng: number, lat: number): boolean;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* WGS84 <-> CGCS2000 转换。
|
|
46
|
+
*
|
|
47
|
+
* 说明:CGCS2000 与 WGS84 采用近似相同的参考椭球(扁率/长半轴差异极小,
|
|
48
|
+
* 历元差异仅导致 cm~dm 级点位偏移),在 Web Mercator 显示尺度下等价于一致。
|
|
49
|
+
* 因此 Phase 0 默认实现为恒等变换(残差 < 0.5m,满足 PRD 验收 F-1.1)。
|
|
50
|
+
*
|
|
51
|
+
* 测绘级高精度需求:可注入 `GridShiftProvider`(区域 7 参数 / 格网平移),
|
|
52
|
+
* 见 types.ts。本文件保留可扩展入口。
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
/** 注册 CGCS2000 偏移提供方(可选,测绘级) */
|
|
56
|
+
declare function setCgcs2000GridShift(provider: GridShiftProvider | null): void;
|
|
57
|
+
/** WGS84 -> CGCS2000 */
|
|
58
|
+
declare function wgs84ToCgcs2000(lng: number, lat: number): LngLat;
|
|
59
|
+
/** CGCS2000 -> WGS84 */
|
|
60
|
+
declare function cgcs2000ToWgs84(lng: number, lat: number): LngLat;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 坐标系变换组合器(以 WGS84 为枢纽)。
|
|
64
|
+
*
|
|
65
|
+
* 用法:
|
|
66
|
+
* const t = createTransformer('GCJ02', 'WGS84');
|
|
67
|
+
* const [lng, lat] = t.forward(114.30, 30.59); // GCJ-02 业务数据 -> 渲染基准
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
/** 把任意 CRS 的坐标转换到 WGS84 */
|
|
71
|
+
declare function toWgs84(crs: CRS, lng: number, lat: number): LngLat;
|
|
72
|
+
/** 把 WGS84 坐标转换到目标 CRS */
|
|
73
|
+
declare function fromWgs84(crs: CRS, lng: number, lat: number): LngLat;
|
|
74
|
+
declare function createTransformer(from: CRS, to: CRS): Transformer;
|
|
75
|
+
/** 单点快捷转换 */
|
|
76
|
+
declare function transformPoint(lng: number, lat: number, from: CRS, to: CRS): LngLat;
|
|
77
|
+
/** 范围 [w, s, e, n] 转换(取四个角点极值) */
|
|
78
|
+
declare function transformBounds(b: Bounds, from: CRS, to: CRS): Bounds;
|
|
79
|
+
|
|
80
|
+
export { type Bounds, type CRS, type GridShiftProvider, type LngLat, type Point, type Transformer, cgcs2000ToWgs84, createTransformer, fromWgs84, gcj02ToWgs84, isInChina, setCgcs2000GridShift, toWgs84, transformBounds, transformPoint, wgs84ToCgcs2000, wgs84ToGcj02 };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { cgcs2000ToWgs84, createTransformer, fromWgs84, gcj02ToWgs84, isInChina, setCgcs2000GridShift, toWgs84, transformBounds, transformPoint, wgs84ToCgcs2000, wgs84ToGcj02 } from '../chunk-SKXL3DKL.js';
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
3
|
+
//# sourceMappingURL=index.js.map
|