@mint-ui/map 1.2.0-test.4 → 1.2.0-test.40

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 (42) hide show
  1. package/dist/components/mint-map/core/MintMapCore.js +5 -6
  2. package/dist/components/mint-map/core/advanced/index.d.ts +2 -1
  3. package/dist/components/mint-map/core/advanced/shared/context.d.ts +39 -0
  4. package/dist/components/mint-map/core/advanced/{woongCanvas/shared → shared}/context.js +62 -79
  5. package/dist/components/mint-map/core/advanced/shared/helpers.d.ts +20 -0
  6. package/dist/components/mint-map/core/advanced/shared/helpers.js +40 -0
  7. package/dist/components/mint-map/core/advanced/shared/hooks.d.ts +74 -0
  8. package/dist/components/mint-map/core/advanced/shared/hooks.js +189 -0
  9. package/dist/components/mint-map/core/advanced/{woongCanvas/shared → shared}/index.d.ts +3 -0
  10. package/dist/components/mint-map/core/advanced/shared/performance.d.ts +77 -0
  11. package/dist/components/mint-map/core/advanced/shared/performance.js +262 -0
  12. package/dist/components/mint-map/core/advanced/shared/types.d.ts +111 -0
  13. package/dist/components/mint-map/core/advanced/{woongCanvas/shared → shared}/types.js +0 -1
  14. package/dist/components/mint-map/core/advanced/shared/utils.d.ts +62 -0
  15. package/dist/components/mint-map/core/advanced/shared/utils.js +221 -0
  16. package/dist/components/mint-map/core/advanced/shared/viewport.d.ts +42 -0
  17. package/dist/components/mint-map/core/advanced/shared/viewport.js +51 -0
  18. package/dist/components/mint-map/core/advanced/woongCanvasMarker/WoongCanvasMarker.d.ts +47 -0
  19. package/dist/components/mint-map/core/advanced/woongCanvasMarker/WoongCanvasMarker.js +620 -0
  20. package/dist/components/mint-map/core/advanced/woongCanvasMarker/index.d.ts +3 -0
  21. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.d.ts +61 -0
  22. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/WoongCanvasPolygon.js +582 -0
  23. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/index.d.ts +3 -0
  24. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/renderer.d.ts +120 -0
  25. package/dist/components/mint-map/core/advanced/woongCanvasPolygon/renderer.js +295 -0
  26. package/dist/components/mint-map/google/GoogleMintMapController.js +5 -4
  27. package/dist/components/mint-map/kakao/KakaoMintMapController.js +5 -4
  28. package/dist/components/mint-map/naver/NaverMintMapController.js +5 -4
  29. package/dist/index.es.js +1711 -1056
  30. package/dist/index.js +23 -8
  31. package/dist/index.umd.js +1723 -1057
  32. package/package.json +1 -1
  33. package/dist/components/mint-map/core/advanced/woongCanvas/ClusterMarker.d.ts +0 -11
  34. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.d.ts +0 -50
  35. package/dist/components/mint-map/core/advanced/woongCanvas/WoongKonvaMarker.js +0 -1065
  36. package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +0 -3
  37. package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +0 -31
  38. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.d.ts +0 -161
  39. package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.js +0 -343
  40. package/dist/components/mint-map/core/advanced/woongCanvas/shared/types.d.ts +0 -131
  41. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +0 -23
  42. package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +0 -115
@@ -0,0 +1,221 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ require('../../../types/MapDrawables.js');
6
+ var MapTypes = require('../../../types/MapTypes.js');
7
+ require('../../../types/MapEventTypes.js');
8
+
9
+ /**
10
+ * 폴리곤 좌표 변환 (위경도 → 화면 좌표)
11
+ *
12
+ * @param polygonData 폴리곤 데이터
13
+ * @param controller MintMapController 인스턴스
14
+ * @returns 변환된 화면 좌표 배열 (4차원 배열) 또는 null
15
+ */
16
+
17
+ var computePolygonOffsets = function (polygonData, controller) {
18
+ var paths = polygonData.paths;
19
+
20
+ if (!paths || paths.type !== 'MultiPolygon' || !paths.coordinates) {
21
+ return null;
22
+ }
23
+
24
+ var result = []; // GeoJSON MultiPolygon 구조: [MultiPolygon][PolygonGroup][Coordinate][lng, lat]
25
+
26
+ for (var _i = 0, _a = paths.coordinates; _i < _a.length; _i++) {
27
+ var multiPolygon = _a[_i];
28
+ var multiPolygonOffsets = [];
29
+
30
+ for (var _b = 0, multiPolygon_1 = multiPolygon; _b < multiPolygon_1.length; _b++) {
31
+ var polygonGroup = multiPolygon_1[_b];
32
+ var polygonOffsets = [];
33
+
34
+ for (var _c = 0, polygonGroup_1 = polygonGroup; _c < polygonGroup_1.length; _c++) {
35
+ var coord = polygonGroup_1[_c]; // GeoJSON은 [lng, lat] 순서이지만 Position은 [lat, lng] 순서
36
+
37
+ var pos = new MapTypes.Position(coord[1], coord[0]);
38
+ var offset = controller.positionToOffset(pos);
39
+ polygonOffsets.push([offset.x, offset.y]);
40
+ }
41
+
42
+ multiPolygonOffsets.push(polygonOffsets);
43
+ }
44
+
45
+ result.push(multiPolygonOffsets);
46
+ }
47
+
48
+ return result;
49
+ };
50
+ /**
51
+ * 마커 좌표 변환 (위경도 → 화면 좌표)
52
+ *
53
+ * @param markerData 마커 데이터
54
+ * @param controller MintMapController 인스턴스
55
+ * @returns 변환된 화면 좌표 또는 null
56
+ */
57
+
58
+ var computeMarkerOffset = function (markerData, controller) {
59
+ if (!markerData.position) return null;
60
+ return controller.positionToOffset(markerData.position);
61
+ };
62
+ /**
63
+ * Point-in-Polygon 알고리즘 (Ray Casting)
64
+ *
65
+ * @param point 확인할 점의 좌표
66
+ * @param polygon 폴리곤 좌표 배열
67
+ * @returns 점이 폴리곤 내부에 있으면 true
68
+ */
69
+
70
+ var isPointInPolygon = function (point, polygon) {
71
+ // Ray Casting 알고리즘: 점에서 오른쪽으로 무한히 뻗은 선과 폴리곤 변의 교차 횟수로 판단
72
+ var inside = false;
73
+
74
+ for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
75
+ var xi = polygon[i][0],
76
+ yi = polygon[i][1];
77
+ var xj = polygon[j][0],
78
+ yj = polygon[j][1]; // 점의 y 좌표가 변의 양 끝점 사이에 있고, 교차점의 x 좌표가 점의 x 좌표보다 큰지 확인
79
+
80
+ var intersect = yi > point.y !== yj > point.y && point.x < (xj - xi) * (point.y - yi) / (yj - yi) + xi;
81
+ if (intersect) inside = !inside; // 교차할 때마다 inside 상태 토글
82
+ }
83
+
84
+ return inside;
85
+ };
86
+ /**
87
+ * 폴리곤 히트 테스트 (도넛 폴리곤 지원)
88
+ *
89
+ * @param clickedOffset 클릭/마우스 위치 좌표
90
+ * @param polygonData 폴리곤 데이터
91
+ * @param getPolygonOffsets 폴리곤 좌표 변환 함수
92
+ * @returns 점이 폴리곤 내부에 있으면 true
93
+ */
94
+
95
+ var isPointInPolygonData = function (clickedOffset, polygonData, getPolygonOffsets) {
96
+ var polygonOffsets = getPolygonOffsets(polygonData);
97
+ if (!polygonOffsets) return false; // 도넛 폴리곤 처리: 외부 폴리곤 내부에 있으면서 구멍(hole) 내부에 있지 않아야 함
98
+
99
+ if (polygonData.isDonutPolygon) {
100
+ for (var _i = 0, polygonOffsets_1 = polygonOffsets; _i < polygonOffsets_1.length; _i++) {
101
+ var multiPolygon = polygonOffsets_1[_i];
102
+ if (multiPolygon.length === 0) continue; // 구멍이 없는 경우 일반 폴리곤과 동일
103
+
104
+ if (multiPolygon.length === 1) {
105
+ if (isPointInPolygon(clickedOffset, multiPolygon[0])) {
106
+ return true;
107
+ }
108
+
109
+ continue;
110
+ } // 외부 폴리곤 내부에 있는지 확인
111
+
112
+
113
+ var outerPolygon = multiPolygon[0];
114
+
115
+ if (!isPointInPolygon(clickedOffset, outerPolygon)) {
116
+ continue;
117
+ } // 구멍 내부에 있으면 false (도넛의 빈 공간)
118
+
119
+
120
+ for (var i = 1; i < multiPolygon.length; i++) {
121
+ var hole = multiPolygon[i];
122
+
123
+ if (isPointInPolygon(clickedOffset, hole)) {
124
+ return false;
125
+ }
126
+ } // 외부 폴리곤 내부에 있으면서 모든 구멍 밖에 있으면 true
127
+
128
+
129
+ return true;
130
+ }
131
+
132
+ return false;
133
+ } // 일반 폴리곤 처리
134
+
135
+
136
+ for (var _a = 0, polygonOffsets_2 = polygonOffsets; _a < polygonOffsets_2.length; _a++) {
137
+ var multiPolygon = polygonOffsets_2[_a];
138
+
139
+ for (var _b = 0, multiPolygon_2 = multiPolygon; _b < multiPolygon_2.length; _b++) {
140
+ var polygonGroup = multiPolygon_2[_b];
141
+ if (polygonGroup.length === 0) continue;
142
+
143
+ if (isPointInPolygon(clickedOffset, polygonGroup)) {
144
+ return true;
145
+ }
146
+ }
147
+ }
148
+
149
+ return false;
150
+ };
151
+ /**
152
+ * 마커 히트 테스트 (꼬리 제외, 오프셋 지원)
153
+ *
154
+ * @param clickedOffset 클릭/마우스 위치 좌표
155
+ * @param markerData 마커 데이터
156
+ * @param getMarkerOffset 마커 좌표 변환 함수
157
+ * @returns 점이 마커 영역 내부에 있으면 true
158
+ */
159
+
160
+ var isPointInMarkerData = function (clickedOffset, markerData, getMarkerOffset) {
161
+ var markerOffset = getMarkerOffset(markerData);
162
+ if (!markerOffset) return false;
163
+ var boxWidth = markerData.boxWidth || 50;
164
+ var boxHeight = markerData.boxHeight || 28;
165
+ var tailHeight = markerData.tailHeight || 0;
166
+ var offsetX = markerData.offsetX || 0;
167
+ var offsetY = markerData.offsetY || 0; // 오프셋을 적용한 마커 중심점 기준으로 박스 영역 계산 (꼬리는 제외)
168
+
169
+ var x = markerOffset.x + offsetX - boxWidth / 2;
170
+ var y = markerOffset.y + offsetY - boxHeight - tailHeight; // 클릭 위치가 박스 영역 내부에 있는지 확인
171
+
172
+ return clickedOffset.x >= x && clickedOffset.x <= x + boxWidth && clickedOffset.y >= y && clickedOffset.y <= y + boxHeight;
173
+ }; // Hex 색상을 RGBA로 변환
174
+
175
+ var hexToRgba = function (hexColor, alpha) {
176
+ if (alpha === void 0) {
177
+ alpha = 1;
178
+ }
179
+
180
+ var hex = hexColor.replace('#', '');
181
+
182
+ if (hex.length !== 6) {
183
+ throw new Error('Invalid hex color format');
184
+ }
185
+
186
+ var r = parseInt(hex.substring(0, 2), 16);
187
+ var g = parseInt(hex.substring(2, 4), 16);
188
+ var b = parseInt(hex.substring(4, 6), 16);
189
+ return "rgba(".concat(r, ", ").concat(g, ", ").concat(b, ", ").concat(alpha, ")");
190
+ };
191
+ var tempCanvas = document.createElement('canvas');
192
+ var tempCtx = tempCanvas.getContext('2d');
193
+ /**
194
+ * 텍스트 박스 너비 계산
195
+ *
196
+ * @param params 파라미터 객체
197
+ * @param params.text 측정할 텍스트
198
+ * @param params.fontConfig 폰트 설정
199
+ * @param params.padding 패딩 값 (px)
200
+ * @param params.minWidth 최소 너비 (px)
201
+ * @returns 계산된 텍스트 박스 너비 (px)
202
+ */
203
+
204
+ var calculateTextBoxWidth = function (_a) {
205
+ var text = _a.text,
206
+ fontConfig = _a.fontConfig,
207
+ padding = _a.padding,
208
+ minWidth = _a.minWidth;
209
+ if (!tempCtx) return 0;
210
+ tempCtx.font = fontConfig;
211
+ var textWidth = tempCtx.measureText(text).width;
212
+ return Math.max(minWidth, textWidth + padding);
213
+ };
214
+
215
+ exports.calculateTextBoxWidth = calculateTextBoxWidth;
216
+ exports.computeMarkerOffset = computeMarkerOffset;
217
+ exports.computePolygonOffsets = computePolygonOffsets;
218
+ exports.hexToRgba = hexToRgba;
219
+ exports.isPointInMarkerData = isPointInMarkerData;
220
+ exports.isPointInPolygon = isPointInPolygon;
221
+ exports.isPointInPolygonData = isPointInPolygonData;
@@ -0,0 +1,42 @@
1
+ import { MutableRefObject } from "react";
2
+ import { CanvasData } from "./types";
3
+ /**
4
+ * 뷰포트 영역 (화면에 보이는 영역)
5
+ */
6
+ export interface ViewportBounds {
7
+ minX: number;
8
+ maxX: number;
9
+ minY: number;
10
+ maxY: number;
11
+ }
12
+ /**
13
+ * 바운딩 박스 (마커/폴리곤의 최소/최대 좌표)
14
+ */
15
+ export interface BoundingBox {
16
+ minX: number;
17
+ minY: number;
18
+ maxX: number;
19
+ maxY: number;
20
+ }
21
+ /**
22
+ * 현재 뷰포트 영역 계산
23
+ *
24
+ * @param stage Konva Stage 인스턴스
25
+ * @param cullingMargin 컬링 여유 공간 (px)
26
+ * @param viewportRef 뷰포트 경계를 저장할 ref
27
+ */
28
+ export declare const updateViewport: (stage: {
29
+ width: () => number;
30
+ height: () => number;
31
+ } | null, cullingMargin: number, viewportRef: MutableRefObject<ViewportBounds | null>) => void;
32
+ /**
33
+ * 아이템이 현재 뷰포트 안에 있는지 확인 (바운딩 박스 캐싱)
34
+ *
35
+ * @template T 마커/폴리곤 데이터의 추가 속성 타입
36
+ * @param item 확인할 아이템
37
+ * @param viewportRef 뷰포트 경계 ref
38
+ * @param boundingBoxCacheRef 바운딩 박스 캐시 ref
39
+ * @param computeBoundingBox 바운딩 박스 계산 함수
40
+ * @returns 뷰포트 안에 있으면 true
41
+ */
42
+ export declare const isInViewport: <T>(item: CanvasData<T>, viewportRef: MutableRefObject<ViewportBounds | null>, boundingBoxCacheRef: MutableRefObject<Map<string, BoundingBox>>, computeBoundingBox: (item: CanvasData<T>) => BoundingBox | null) => boolean;
@@ -0,0 +1,51 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ /**
6
+ * 현재 뷰포트 영역 계산
7
+ *
8
+ * @param stage Konva Stage 인스턴스
9
+ * @param cullingMargin 컬링 여유 공간 (px)
10
+ * @param viewportRef 뷰포트 경계를 저장할 ref
11
+ */
12
+ var updateViewport = function (stage, cullingMargin, viewportRef) {
13
+ if (!stage) return;
14
+ viewportRef.current = {
15
+ minX: -cullingMargin,
16
+ maxX: stage.width() + cullingMargin,
17
+ minY: -cullingMargin,
18
+ maxY: stage.height() + cullingMargin
19
+ };
20
+ };
21
+ /**
22
+ * 아이템이 현재 뷰포트 안에 있는지 확인 (바운딩 박스 캐싱)
23
+ *
24
+ * @template T 마커/폴리곤 데이터의 추가 속성 타입
25
+ * @param item 확인할 아이템
26
+ * @param viewportRef 뷰포트 경계 ref
27
+ * @param boundingBoxCacheRef 바운딩 박스 캐시 ref
28
+ * @param computeBoundingBox 바운딩 박스 계산 함수
29
+ * @returns 뷰포트 안에 있으면 true
30
+ */
31
+
32
+ var isInViewport = function (item, viewportRef, boundingBoxCacheRef, computeBoundingBox) {
33
+ if (!viewportRef.current) return true;
34
+ var viewport = viewportRef.current; // 캐시된 바운딩 박스 확인
35
+
36
+ var bbox = boundingBoxCacheRef.current.get(item.id);
37
+
38
+ if (!bbox) {
39
+ // 바운딩 박스 계산 (공통 함수 사용)
40
+ var computed = computeBoundingBox(item);
41
+ if (!computed) return false;
42
+ bbox = computed;
43
+ boundingBoxCacheRef.current.set(item.id, bbox);
44
+ } // 바운딩 박스와 viewport 교차 체크
45
+
46
+
47
+ return !(bbox.maxX < viewport.minX || bbox.minX > viewport.maxX || bbox.maxY < viewport.minY || bbox.minY > viewport.maxY);
48
+ };
49
+
50
+ exports.isInViewport = isInViewport;
51
+ exports.updateViewport = updateViewport;
@@ -0,0 +1,47 @@
1
+ import React from "react";
2
+ import { MarkerOptions } from "../../../types";
3
+ import { CanvasData, CustomRenderBase, CustomRenderEvent } from "../shared";
4
+ export { WoongCanvasProvider, LRUCache, SpatialHashGrid, CanvasDataType } from "../shared";
5
+ export type { CanvasOption, CanvasData, CustomRenderBase, CustomRenderEvent, RenderUtils, RenderBaseParams, RenderEventParams } from "../shared";
6
+ /**
7
+ * WoongCanvasMarker Props
8
+ *
9
+ * @template T 마커 데이터의 추가 속성 타입
10
+ */
11
+ export interface WoongCanvasMarkerProps<T> extends Pick<MarkerOptions, 'zIndex' | 'anchor' | 'visible'> {
12
+ /** 렌더링할 마커 데이터 배열 */
13
+ data: CanvasData<T>[];
14
+ /** 마커 클릭 시 호출되는 콜백 함수 */
15
+ onClick?: (payload: CanvasData<T>, selectedIds: Set<string>) => void;
16
+ /** 마커에 마우스 오버 시 호출되는 콜백 함수 */
17
+ onMouseOver?: (payload: CanvasData<T>) => void;
18
+ /** 마커에서 마우스 아웃 시 호출되는 콜백 함수 */
19
+ onMouseOut?: (payload: CanvasData<T>) => void;
20
+ /** 다중 선택 활성화 여부 (기본값: false) */
21
+ enableMultiSelect?: boolean;
22
+ /** hover 시 마커를 최상단으로 표시할지 여부 (기본값: false) */
23
+ topOnHover?: boolean;
24
+ /** 뷰포트 컬링 활성화 여부 (기본값: false) */
25
+ enableViewportCulling?: boolean;
26
+ /** 뷰포트 컬링 여유 공간 (픽셀 단위, 기본값: 100) */
27
+ cullingMargin?: number;
28
+ /** LRU 캐시 최대 크기 (기본값: 10000) */
29
+ maxCacheSize?: number;
30
+ /** 외부에서 제어하는 선택된 항목 배열 */
31
+ selectedItems?: CanvasData<T>[];
32
+ /** 외부에서 전달된 단일 선택 아이템 */
33
+ selectedItem?: CanvasData<T> | null;
34
+ /** 상호작용 비활성화 여부 (기본값: false) */
35
+ disableInteraction?: boolean;
36
+ /** Base Layer 렌더링 함수 (필수) */
37
+ renderBase: CustomRenderBase<T>;
38
+ /** Event Layer 렌더링 함수 (선택) */
39
+ renderEvent?: CustomRenderEvent<T>;
40
+ }
41
+ declare const WoongCanvasMarker: <T>(props: WoongCanvasMarkerProps<T>) => React.ReactPortal;
42
+ /**
43
+ * WoongCanvasMarker - Konva 기반 고성능 마커 렌더링 컴포넌트
44
+ *
45
+ * @template T 마커 데이터의 추가 속성 타입
46
+ */
47
+ export default WoongCanvasMarker;