@mint-ui/map 1.2.0-test.5 → 1.2.0-test.51

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.
Files changed (49) hide show
  1. package/CLAUDE.md +0 -1
  2. package/dist/components/mint-map/core/MintMapCore.js +5 -6
  3. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/CanvasMarkerLayer.d.ts +47 -0
  4. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/CanvasMarkerLayer.js +634 -0
  5. package/dist/components/mint-map/core/advanced/CanvasMarkerLayer/index.d.ts +3 -0
  6. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.d.ts +252 -0
  7. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/CanvasPolygonLayer.js +596 -0
  8. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/index.d.ts +3 -0
  9. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/renderer.d.ts +237 -0
  10. package/dist/components/mint-map/core/advanced/CanvasPolygonLayer/renderer.js +645 -0
  11. package/dist/components/mint-map/core/advanced/canvas/CanvasMarker.d.ts +7 -0
  12. package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerClaude.js +7 -7
  13. package/dist/components/mint-map/core/advanced/canvas/index.d.ts +0 -1
  14. package/dist/components/mint-map/core/advanced/index.d.ts +3 -1
  15. package/dist/components/mint-map/core/advanced/shared/context.d.ts +39 -0
  16. package/dist/components/mint-map/core/advanced/{woongCanvas/shared → shared}/context.js +62 -79
  17. package/dist/components/mint-map/core/advanced/shared/helpers.d.ts +20 -0
  18. package/dist/components/mint-map/core/advanced/shared/helpers.js +40 -0
  19. package/dist/components/mint-map/core/advanced/shared/hooks.d.ts +74 -0
  20. package/dist/components/mint-map/core/advanced/shared/hooks.js +189 -0
  21. package/dist/components/mint-map/core/advanced/{woongCanvas/shared → shared}/index.d.ts +3 -0
  22. package/dist/components/mint-map/core/advanced/shared/performance.d.ts +77 -0
  23. package/dist/components/mint-map/core/advanced/shared/performance.js +262 -0
  24. package/dist/components/mint-map/core/advanced/shared/types.d.ts +127 -0
  25. package/dist/components/mint-map/core/advanced/{woongCanvas/shared → shared}/types.js +5 -1
  26. package/dist/components/mint-map/core/advanced/shared/utils.d.ts +130 -0
  27. package/dist/components/mint-map/core/advanced/shared/utils.js +303 -0
  28. package/dist/components/mint-map/core/advanced/shared/viewport.d.ts +42 -0
  29. package/dist/components/mint-map/core/advanced/shared/viewport.js +51 -0
  30. package/dist/components/mint-map/google/GoogleMintMapController.js +5 -4
  31. package/dist/components/mint-map/kakao/KakaoMintMapController.js +5 -4
  32. package/dist/components/mint-map/naver/NaverMintMapController.js +5 -4
  33. package/dist/index.es.js +3233 -2687
  34. package/dist/index.js +25 -10
  35. package/dist/index.umd.js +3247 -2689
  36. package/package.json +1 -1
  37. package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerHanquf.d.ts +0 -22
  38. package/dist/components/mint-map/core/advanced/canvas/CanvasMarkerHanquf.js +0 -413
  39. package/dist/components/mint-map/core/advanced/woongCanvas/ClusterMarker.d.ts +0 -11
  40. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.d.ts +0 -50
  41. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.js +0 -1065
  42. package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +0 -3
  43. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +0 -31
  44. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.d.ts +0 -161
  45. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.js +0 -343
  46. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +0 -131
  47. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +0 -31
  48. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +0 -164
  49. package/dist/components/mint-map/core/util/geohash.js +0 -125
@@ -0,0 +1,77 @@
1
+ /**
2
+ * 공간 인덱스 그리드 셀 크기 (픽셀 단위)
3
+ *
4
+ * @default 100
5
+ *
6
+ * @remarks
7
+ * 셀 크기는 평균 마커 크기의 1.5~2배가 적절합니다.
8
+ * - 마커가 50px 이하: 50px 권장
9
+ * - 마커가 60-80px: 100px 권장 (현재 설정)
10
+ * - 마커가 100px 이상: 150-200px 권장
11
+ *
12
+ * 셀 크기가 너무 작으면:
13
+ * - 한 마커가 여러 셀에 등록되어 메모리 사용량 증가
14
+ * - 인덱스 빌드 비용 증가
15
+ *
16
+ * 셀 크기가 너무 크면:
17
+ * - 한 셀에 많은 마커가 들어가서 Hit Test 시 후보 항목이 많아짐
18
+ * - Hit Test 성능 저하
19
+ */
20
+ export declare const SPATIAL_GRID_CELL_SIZE = 100;
21
+ /**
22
+ * 뷰포트 컬링 여유 공간 (픽셀 단위)
23
+ *
24
+ * @default 100
25
+ */
26
+ export declare const DEFAULT_CULLING_MARGIN = 100;
27
+ /**
28
+ * LRU 캐시 최대 항목 수
29
+ *
30
+ * @default 30000
31
+ */
32
+ export declare const DEFAULT_MAX_CACHE_SIZE = 30000;
33
+ /**
34
+ * LRU Cache (Least Recently Used)
35
+ *
36
+ * 좌표 변환 결과를 캐싱하기 위한 캐시 구현
37
+ *
38
+ * @template K 캐시 키 타입
39
+ * @template V 캐시 값 타입
40
+ */
41
+ export declare class LRUCache<K, V> {
42
+ private cache;
43
+ private maxSize;
44
+ constructor(maxSize?: number);
45
+ get(key: K): V | undefined;
46
+ set(key: K, value: V): void;
47
+ clear(): void;
48
+ size(): number;
49
+ has(key: K): boolean;
50
+ }
51
+ /**
52
+ * Spatial Hash Grid (공간 해시 그리드)
53
+ *
54
+ * 빠른 Hit Test를 위한 그리드 기반 공간 인덱싱 자료구조
55
+ *
56
+ * @template T 인덱싱할 항목 타입
57
+ */
58
+ export declare class SpatialHashGrid<T> {
59
+ private cellSize;
60
+ private grid;
61
+ private itemToCells;
62
+ constructor(cellSize?: number);
63
+ private getCellKey;
64
+ private getCellsForBounds;
65
+ insert(item: T, minX: number, minY: number, maxX: number, maxY: number): void;
66
+ remove(item: T): void;
67
+ update(item: T, minX: number, minY: number, maxX: number, maxY: number): void;
68
+ queryPoint(x: number, y: number): T[];
69
+ queryBounds(minX: number, minY: number, maxX: number, maxY: number): T[];
70
+ has(item: T): boolean;
71
+ clear(): void;
72
+ stats(): {
73
+ totalCells: number;
74
+ totalItems: number;
75
+ avgItemsPerCell: number;
76
+ };
77
+ }
@@ -0,0 +1,262 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ /**
6
+ * 공간 인덱스 그리드 셀 크기 (픽셀 단위)
7
+ *
8
+ * @default 100
9
+ *
10
+ * @remarks
11
+ * 셀 크기는 평균 마커 크기의 1.5~2배가 적절합니다.
12
+ * - 마커가 50px 이하: 50px 권장
13
+ * - 마커가 60-80px: 100px 권장 (현재 설정)
14
+ * - 마커가 100px 이상: 150-200px 권장
15
+ *
16
+ * 셀 크기가 너무 작으면:
17
+ * - 한 마커가 여러 셀에 등록되어 메모리 사용량 증가
18
+ * - 인덱스 빌드 비용 증가
19
+ *
20
+ * 셀 크기가 너무 크면:
21
+ * - 한 셀에 많은 마커가 들어가서 Hit Test 시 후보 항목이 많아짐
22
+ * - Hit Test 성능 저하
23
+ */
24
+ var SPATIAL_GRID_CELL_SIZE = 100;
25
+ /**
26
+ * 뷰포트 컬링 여유 공간 (픽셀 단위)
27
+ *
28
+ * @default 100
29
+ */
30
+
31
+ var DEFAULT_CULLING_MARGIN = 100;
32
+ /**
33
+ * LRU 캐시 최대 항목 수
34
+ *
35
+ * @default 30000
36
+ */
37
+
38
+ var DEFAULT_MAX_CACHE_SIZE = 30000;
39
+ /**
40
+ * LRU Cache (Least Recently Used)
41
+ *
42
+ * 좌표 변환 결과를 캐싱하기 위한 캐시 구현
43
+ *
44
+ * @template K 캐시 키 타입
45
+ * @template V 캐시 값 타입
46
+ */
47
+
48
+ var LRUCache =
49
+ /** @class */
50
+ function () {
51
+ function LRUCache(maxSize) {
52
+ if (maxSize === void 0) {
53
+ maxSize = 10000;
54
+ }
55
+
56
+ this.cache = new Map();
57
+ this.maxSize = maxSize;
58
+ } // 캐시에서 값 조회
59
+
60
+
61
+ LRUCache.prototype.get = function (key) {
62
+ return this.cache.get(key);
63
+ }; // 캐시에 값 저장 (FIFO eviction)
64
+
65
+
66
+ LRUCache.prototype.set = function (key, value) {
67
+ var exists = this.cache.has(key);
68
+
69
+ if (exists) {
70
+ this.cache.set(key, value);
71
+ return;
72
+ }
73
+
74
+ if (this.cache.size >= this.maxSize) {
75
+ var firstKey = this.cache.keys().next().value;
76
+
77
+ if (firstKey !== undefined) {
78
+ this.cache.delete(firstKey);
79
+ }
80
+ }
81
+
82
+ this.cache.set(key, value);
83
+ }; // 캐시 초기화
84
+
85
+
86
+ LRUCache.prototype.clear = function () {
87
+ this.cache.clear();
88
+ }; // 캐시 크기 반환
89
+
90
+
91
+ LRUCache.prototype.size = function () {
92
+ return this.cache.size;
93
+ }; // 키 존재 여부 확인
94
+
95
+
96
+ LRUCache.prototype.has = function (key) {
97
+ return this.cache.has(key);
98
+ };
99
+
100
+ return LRUCache;
101
+ }();
102
+ /**
103
+ * Spatial Hash Grid (공간 해시 그리드)
104
+ *
105
+ * 빠른 Hit Test를 위한 그리드 기반 공간 인덱싱 자료구조
106
+ *
107
+ * @template T 인덱싱할 항목 타입
108
+ */
109
+
110
+ var SpatialHashGrid =
111
+ /** @class */
112
+ function () {
113
+ function SpatialHashGrid(cellSize) {
114
+ if (cellSize === void 0) {
115
+ cellSize = SPATIAL_GRID_CELL_SIZE;
116
+ }
117
+
118
+ this.cellSize = cellSize;
119
+ this.grid = new Map();
120
+ this.itemToCells = new Map();
121
+ } // 셀 키 생성 (x, y 좌표 → 그리드 셀 ID)
122
+
123
+
124
+ SpatialHashGrid.prototype.getCellKey = function (x, y) {
125
+ // 좌표를 셀 크기로 나눈 몫으로 셀 인덱스 계산
126
+ var cellX = Math.floor(x / this.cellSize);
127
+ var cellY = Math.floor(y / this.cellSize);
128
+ return "".concat(cellX, ",").concat(cellY);
129
+ }; // 바운딩 박스가 걸치는 모든 셀 키 배열 반환
130
+
131
+
132
+ SpatialHashGrid.prototype.getCellsForBounds = function (minX, minY, maxX, maxY) {
133
+ var cells = []; // 바운딩 박스가 걸치는 셀 범위 계산
134
+
135
+ var startCellX = Math.floor(minX / this.cellSize);
136
+ var startCellY = Math.floor(minY / this.cellSize);
137
+ var endCellX = Math.floor(maxX / this.cellSize);
138
+ var endCellY = Math.floor(maxY / this.cellSize); // 바운딩 박스가 걸치는 모든 셀을 배열에 추가
139
+
140
+ for (var x = startCellX; x <= endCellX; x++) {
141
+ for (var y = startCellY; y <= endCellY; y++) {
142
+ cells.push("".concat(x, ",").concat(y));
143
+ }
144
+ }
145
+
146
+ return cells;
147
+ }; // 항목 추가 (바운딩 박스 기반, 중복 삽입 방지)
148
+
149
+
150
+ SpatialHashGrid.prototype.insert = function (item, minX, minY, maxX, maxY) {
151
+ // 기존 항목 제거 (중복 삽입 방지: 같은 항목을 여러 번 insert 해도 안전)
152
+ this.remove(item); // 바운딩 박스가 걸치는 모든 셀에 항목 등록
153
+
154
+ var cells = this.getCellsForBounds(minX, minY, maxX, maxY);
155
+ this.itemToCells.set(item, cells); // 항목과 셀의 매핑 저장 (제거 시 필요)
156
+
157
+ for (var _i = 0, cells_1 = cells; _i < cells_1.length; _i++) {
158
+ var cell = cells_1[_i];
159
+
160
+ if (!this.grid.has(cell)) {
161
+ this.grid.set(cell, []);
162
+ }
163
+
164
+ this.grid.get(cell).push(item);
165
+ }
166
+ }; // 항목 제거 (모든 셀에서 참조 제거)
167
+
168
+
169
+ SpatialHashGrid.prototype.remove = function (item) {
170
+ var prevCells = this.itemToCells.get(item);
171
+ if (!prevCells) return; // 항목이 등록된 모든 셀에서 참조 제거 (메모리 누수 방지)
172
+
173
+ for (var _i = 0, prevCells_1 = prevCells; _i < prevCells_1.length; _i++) {
174
+ var cell = prevCells_1[_i];
175
+ var cellItems = this.grid.get(cell);
176
+
177
+ if (cellItems) {
178
+ var index = cellItems.indexOf(item);
179
+
180
+ if (index !== -1) {
181
+ cellItems.splice(index, 1);
182
+ } // 빈 셀 정리 (메모리 효율: 사용하지 않는 셀 제거)
183
+
184
+
185
+ if (cellItems.length === 0) {
186
+ this.grid.delete(cell);
187
+ }
188
+ }
189
+ } // 항목과 셀의 매핑 제거
190
+
191
+
192
+ this.itemToCells.delete(item);
193
+ }; // 항목 위치 업데이트 (remove + insert)
194
+
195
+
196
+ SpatialHashGrid.prototype.update = function (item, minX, minY, maxX, maxY) {
197
+ this.insert(item, minX, minY, maxX, maxY);
198
+ }; // 점 주변의 항목 조회 (Hit Test용)
199
+
200
+
201
+ SpatialHashGrid.prototype.queryPoint = function (x, y) {
202
+ // 클릭 위치가 속한 셀의 모든 항목 조회 (O(1) 수준의 빠른 조회)
203
+ var cellKey = this.getCellKey(x, y);
204
+ var items = this.grid.get(cellKey); // 빈 배열 재사용 (메모리 할당 최소화)
205
+
206
+ return items || [];
207
+ }; // 영역 내 항목 조회 (Viewport Culling용)
208
+
209
+
210
+ SpatialHashGrid.prototype.queryBounds = function (minX, minY, maxX, maxY) {
211
+ // 영역이 걸치는 모든 셀 찾기
212
+ var cells = this.getCellsForBounds(minX, minY, maxX, maxY);
213
+ var results = new Set(); // 중복 제거를 위해 Set 사용
214
+ // 각 셀의 모든 항목을 결과에 추가
215
+
216
+ for (var _i = 0, cells_2 = cells; _i < cells_2.length; _i++) {
217
+ var cell = cells_2[_i];
218
+ var items = this.grid.get(cell);
219
+
220
+ if (items) {
221
+ for (var _a = 0, items_1 = items; _a < items_1.length; _a++) {
222
+ var item = items_1[_a];
223
+ results.add(item); // Set이므로 중복 자동 제거
224
+ }
225
+ }
226
+ }
227
+
228
+ return Array.from(results);
229
+ }; // 항목 존재 여부 확인
230
+
231
+
232
+ SpatialHashGrid.prototype.has = function (item) {
233
+ return this.itemToCells.has(item);
234
+ }; // 전체 초기화
235
+
236
+
237
+ SpatialHashGrid.prototype.clear = function () {
238
+ this.grid.clear();
239
+ this.itemToCells.clear();
240
+ }; // 통계 정보 반환
241
+
242
+
243
+ SpatialHashGrid.prototype.stats = function () {
244
+ var totalCellItems = 0;
245
+ this.grid.forEach(function (items) {
246
+ totalCellItems += items.length;
247
+ });
248
+ return {
249
+ totalCells: this.grid.size,
250
+ totalItems: this.itemToCells.size,
251
+ avgItemsPerCell: this.grid.size > 0 ? totalCellItems / this.grid.size : 0
252
+ };
253
+ };
254
+
255
+ return SpatialHashGrid;
256
+ }();
257
+
258
+ exports.DEFAULT_CULLING_MARGIN = DEFAULT_CULLING_MARGIN;
259
+ exports.DEFAULT_MAX_CACHE_SIZE = DEFAULT_MAX_CACHE_SIZE;
260
+ exports.LRUCache = LRUCache;
261
+ exports.SPATIAL_GRID_CELL_SIZE = SPATIAL_GRID_CELL_SIZE;
262
+ exports.SpatialHashGrid = SpatialHashGrid;
@@ -0,0 +1,127 @@
1
+ import Konva from "konva";
2
+ import { Position, Offset } from "../../../types";
3
+ /**
4
+ * 캔버스 데이터 타입 Enum
5
+ */
6
+ export declare enum CanvasDataType {
7
+ MARKER = "MARKER",
8
+ POLYGON = "POLYGON"
9
+ }
10
+ /**
11
+ * 폴리곤 경로 정의 (GeoJSON MultiPolygon 형식)
12
+ */
13
+ export interface Paths {
14
+ type: string;
15
+ coordinates: number[][][][];
16
+ }
17
+ /**
18
+ * 캔버스 마커/폴리곤의 기본 필수 속성
19
+ */
20
+ export interface CanvasOption {
21
+ id: string;
22
+ position: Position;
23
+ boxWidth?: number;
24
+ boxHeight?: number;
25
+ tailHeight?: number;
26
+ paths?: Paths;
27
+ isDonutPolygon?: boolean;
28
+ /** 렌더링 오프셋 X (픽셀 단위, 기본값: 0) */
29
+ offsetX?: number;
30
+ /** 렌더링 오프셋 Y (픽셀 단위, 기본값: 0) */
31
+ offsetY?: number;
32
+ }
33
+ /**
34
+ * 서버 데이터와 캔버스 옵션을 결합한 타입
35
+ *
36
+ * @template T 서버에서 받은 원본 데이터 타입
37
+ *
38
+ * @remarks
39
+ * 서버 데이터의 필드가 CanvasOption과 충돌하는 경우 (예: id, position 등),
40
+ * 변환 시 명시적으로 매핑해야 합니다. createCanvasData 헬퍼 함수를 사용하세요.
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * // 서버 데이터에 id가 number 타입인 경우
45
+ * interface ServerData {
46
+ * id: number;
47
+ * name: string;
48
+ * }
49
+ *
50
+ * // ❌ 잘못된 사용 (타입 에러 발생)
51
+ * const data: CanvasData<ServerData> = {
52
+ * ...serverData,
53
+ * id: String(serverData.id), // 명시적 변환 필요
54
+ * position: new Position(lat, lng)
55
+ * };
56
+ *
57
+ * // ✅ 올바른 사용 (헬퍼 함수 사용)
58
+ * const data = createCanvasData(serverData, {
59
+ * id: String(serverData.id),
60
+ * position: new Position(lat, lng)
61
+ * });
62
+ * ```
63
+ */
64
+ export declare type CanvasData<T = {}> = T & CanvasOption;
65
+ /**
66
+ * 서버 데이터를 CanvasData로 변환하는 헬퍼 함수들
67
+ *
68
+ * @see createCanvasData, createCanvasDataArray in ./utils.ts
69
+ */
70
+ export { createCanvasData, createCanvasDataArray } from './utils';
71
+ /**
72
+ * 렌더링 유틸리티 함수들 (좌표 변환)
73
+ *
74
+ * @template T 마커/폴리곤 데이터의 추가 속성 타입
75
+ */
76
+ export interface RenderUtils<T> {
77
+ getOrComputePolygonOffsets: (polygonData: CanvasData<T>) => number[][][][] | null;
78
+ getOrComputeMarkerOffset: (markerData: CanvasData<T>) => Offset | null;
79
+ }
80
+ /**
81
+ * 커스텀 렌더링 함수 파라미터 - Base Layer
82
+ */
83
+ export interface RenderBaseParams<T> {
84
+ ctx: CanvasRenderingContext2D;
85
+ items: CanvasData<T>[];
86
+ selectedIds: Set<string>;
87
+ hoveredItem?: CanvasData<T> | null;
88
+ selectedItem?: CanvasData<T> | null;
89
+ utils: RenderUtils<T>;
90
+ }
91
+ /**
92
+ * 커스텀 렌더링 함수 타입 - Base Layer
93
+ *
94
+ * @template T 마커/폴리곤 데이터의 추가 속성 타입
95
+ */
96
+ export declare type CustomRenderBase<T> = (params: RenderBaseParams<T>) => void;
97
+ /**
98
+ * 커스텀 렌더링 함수 파라미터 - Animation Layer
99
+ */
100
+ export interface RenderAnimationParams<T> {
101
+ layer: Konva.Layer;
102
+ selectedIds: Set<string>;
103
+ items: CanvasData<T>[];
104
+ utils: RenderUtils<T>;
105
+ }
106
+ /**
107
+ * 커스텀 렌더링 함수 타입 - Animation Layer (선택)
108
+ *
109
+ * @template T 마커/폴리곤 데이터의 추가 속성 타입
110
+ */
111
+ export declare type CustomRenderAnimation<T> = (params: RenderAnimationParams<T>) => void;
112
+ /**
113
+ * 커스텀 렌더링 함수 파라미터 - Event Layer
114
+ */
115
+ export interface RenderEventParams<T> {
116
+ ctx: CanvasRenderingContext2D;
117
+ hoveredItem: CanvasData<T> | null;
118
+ utils: RenderUtils<T>;
119
+ selectedItems?: CanvasData<T>[];
120
+ selectedItem?: CanvasData<T> | null;
121
+ }
122
+ /**
123
+ * 커스텀 렌더링 함수 타입 - Event Layer
124
+ *
125
+ * @template T 마커/폴리곤 데이터의 추가 속성 타입
126
+ */
127
+ export declare type CustomRenderEvent<T> = (params: RenderEventParams<T>) => void;
@@ -2,9 +2,10 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
+ var utils = require('./utils.js');
6
+
5
7
  /**
6
8
  * 캔버스 데이터 타입 Enum
7
- * 마커인지 폴리곤인지 구분하는 상수
8
9
  */
9
10
  exports.CanvasDataType = void 0;
10
11
 
@@ -12,3 +13,6 @@ exports.CanvasDataType = void 0;
12
13
  CanvasDataType["MARKER"] = "MARKER";
13
14
  CanvasDataType["POLYGON"] = "POLYGON";
14
15
  })(exports.CanvasDataType || (exports.CanvasDataType = {}));
16
+
17
+ exports.createCanvasData = utils.createCanvasData;
18
+ exports.createCanvasDataArray = utils.createCanvasDataArray;
@@ -0,0 +1,130 @@
1
+ import { Offset } from "../../../types";
2
+ import { MintMapController } from "../../MintMapController";
3
+ import { CanvasData, CanvasOption } from "./types";
4
+ /**
5
+ * 폴리곤 좌표 변환 (위경도 → 화면 좌표)
6
+ *
7
+ * @param polygonData 폴리곤 데이터
8
+ * @param controller MintMapController 인스턴스
9
+ * @returns 변환된 화면 좌표 배열 (4차원 배열) 또는 null
10
+ */
11
+ export declare const computePolygonOffsets: (polygonData: CanvasData<any>, controller: MintMapController) => number[][][][] | null;
12
+ /**
13
+ * 마커 좌표 변환 (위경도 → 화면 좌표)
14
+ *
15
+ * @param markerData 마커 데이터
16
+ * @param controller MintMapController 인스턴스
17
+ * @returns 변환된 화면 좌표 또는 null
18
+ */
19
+ export declare const computeMarkerOffset: (markerData: CanvasData<any>, controller: MintMapController) => Offset | null;
20
+ /**
21
+ * Point-in-Polygon 알고리즘 (Ray Casting)
22
+ *
23
+ * @param point 확인할 점의 좌표
24
+ * @param polygon 폴리곤 좌표 배열
25
+ * @returns 점이 폴리곤 내부에 있으면 true
26
+ */
27
+ export declare const isPointInPolygon: (point: Offset, polygon: number[][]) => boolean;
28
+ /**
29
+ * 폴리곤 히트 테스트 (도넛 폴리곤 지원)
30
+ *
31
+ * @param clickedOffset 클릭/마우스 위치 좌표
32
+ * @param polygonData 폴리곤 데이터
33
+ * @param getPolygonOffsets 폴리곤 좌표 변환 함수
34
+ * @returns 점이 폴리곤 내부에 있으면 true
35
+ */
36
+ export declare const isPointInPolygonData: (clickedOffset: Offset, polygonData: CanvasData<any>, getPolygonOffsets: (data: CanvasData<any>) => number[][][][] | null) => boolean;
37
+ /**
38
+ * 마커 히트 테스트 (꼬리 제외, 오프셋 지원)
39
+ *
40
+ * @param clickedOffset 클릭/마우스 위치 좌표
41
+ * @param markerData 마커 데이터
42
+ * @param getMarkerOffset 마커 좌표 변환 함수
43
+ * @returns 점이 마커 영역 내부에 있으면 true
44
+ */
45
+ export declare const isPointInMarkerData: (clickedOffset: Offset, markerData: CanvasData<any>, getMarkerOffset: (data: CanvasData<any>) => Offset | null) => boolean;
46
+ export declare const hexToRgba: (hexColor: string, alpha?: number) => string;
47
+ /**
48
+ * 텍스트 박스 너비 계산
49
+ *
50
+ * @param params 파라미터 객체
51
+ * @param params.text 측정할 텍스트
52
+ * @param params.fontConfig 폰트 설정
53
+ * @param params.padding 패딩 값 (px)
54
+ * @param params.minWidth 최소 너비 (px)
55
+ * @returns 계산된 텍스트 박스 너비 (px)
56
+ */
57
+ export declare const calculateTextBoxWidth: ({ text, fontConfig, padding, minWidth, }: {
58
+ text: string;
59
+ fontConfig: string;
60
+ padding: number;
61
+ minWidth: number;
62
+ }) => number;
63
+ /**
64
+ * 서버 데이터를 CanvasData로 변환하는 헬퍼 함수
65
+ *
66
+ * 서버 데이터의 필드가 CanvasOption과 충돌하는 경우 (예: id, position 등),
67
+ * 이 함수를 사용하여 명시적으로 매핑할 수 있습니다.
68
+ *
69
+ * @template T 서버에서 받은 원본 데이터 타입
70
+ * @param serverData 서버에서 받은 원본 데이터
71
+ * @param canvasOptions CanvasOption 필드들 (충돌하는 필드는 여기서 명시적으로 지정)
72
+ * @returns CanvasData<T> 타입의 데이터
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * interface ServerData {
77
+ * id: number; // CanvasOption의 id와 충돌
78
+ * name: string;
79
+ * }
80
+ *
81
+ * const serverData: ServerData = { id: 123, name: "Test" };
82
+ *
83
+ * // ✅ 올바른 사용
84
+ * const canvasData = createCanvasData(serverData, {
85
+ * id: String(serverData.id), // 명시적으로 변환
86
+ * position: new Position(37.5, 127.0)
87
+ * });
88
+ *
89
+ * // canvasData는 CanvasData<ServerData> 타입이며:
90
+ * // - id: string (CanvasOption의 id)
91
+ * // - name: string (서버 데이터의 name)
92
+ * // - position: Position (CanvasOption의 position)
93
+ * ```
94
+ */
95
+ export declare function createCanvasData<T extends Record<string, any>>(serverData: T, canvasOptions: CanvasOption): CanvasData<T>;
96
+ /**
97
+ * 서버 데이터 배열을 CanvasData 배열로 변환하는 헬퍼 함수
98
+ *
99
+ * 서버 데이터 배열의 각 항목을 CanvasData로 변환합니다.
100
+ * 각 항목마다 다른 CanvasOption을 적용할 수 있습니다.
101
+ *
102
+ * @template T 서버에서 받은 원본 데이터 타입
103
+ * @param serverDataArray 서버에서 받은 원본 데이터 배열
104
+ * @param getCanvasOptions 각 항목에 대해 CanvasOption을 생성하는 함수
105
+ * @returns CanvasData<T>[] 타입의 데이터 배열
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * interface ServerData {
110
+ * id: number; // CanvasOption의 id와 충돌
111
+ * name: string;
112
+ * lat: number;
113
+ * lng: number;
114
+ * }
115
+ *
116
+ * const serverDataArray: ServerData[] = [
117
+ * { id: 1, name: "Item 1", lat: 37.5, lng: 127.0 },
118
+ * { id: 2, name: "Item 2", lat: 37.6, lng: 127.1 }
119
+ * ];
120
+ *
121
+ * // ✅ 올바른 사용
122
+ * const canvasDataArray = createCanvasDataArray(serverDataArray, (item, index) => ({
123
+ * id: String(item.id), // 각 항목마다 명시적으로 변환
124
+ * position: new Position(item.lat, item.lng)
125
+ * }));
126
+ *
127
+ * // canvasDataArray는 CanvasData<ServerData>[] 타입입니다
128
+ * ```
129
+ */
130
+ export declare function createCanvasDataArray<T extends Record<string, any>>(serverDataArray: T[], getCanvasOptions: (serverData: T, index: number) => CanvasOption): CanvasData<T>[];