@mint-ui/map 1.2.0-test.20 → 1.2.0-test.22
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/components/mint-map/core/advanced/woongCanvas/WoongCanvasLayer.js +55 -38
- package/dist/components/mint-map/core/advanced/woongCanvas/index.d.ts +10 -0
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.d.ts +73 -5
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/context.js +81 -14
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/index.d.ts +11 -0
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.d.ts +62 -13
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/performance.js +62 -13
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.d.ts +78 -24
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.js +77 -23
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.d.ts +142 -20
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/utils.js +146 -23
- package/dist/index.es.js +638 -328
- package/dist/index.js +4 -0
- package/dist/index.umd.js +640 -327
- package/package.json +1 -1
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* @fileoverview WoongCanvasLayer 성능 최적화를 위한 상수 및 클래스
|
|
7
|
+
*
|
|
8
|
+
* 이 파일은 30,000개 이상의 마커/폴리곤을 60fps로 렌더링하기 위한
|
|
9
|
+
* 성능 최적화 상수와 최적화된 자료구조들을 제공합니다.
|
|
10
|
+
*
|
|
11
|
+
* ## 주요 구성 요소
|
|
12
|
+
* - **성능 최적화 상수**: 그리드 셀 크기, 캐시 크기, 컬링 여유 공간
|
|
13
|
+
* - **LRUCache**: 좌표 변환 결과 캐싱을 위한 LRU 캐시 구현
|
|
14
|
+
* - **SpatialHashGrid**: O(1) 수준의 빠른 Hit Test를 위한 공간 해시 그리드
|
|
15
|
+
*
|
|
16
|
+
* @version 2.2.1
|
|
17
|
+
* @since 2.0.0
|
|
18
|
+
* @author 박건웅
|
|
19
|
+
*/
|
|
5
20
|
// ============================================================================
|
|
6
21
|
// 성능 최적화 상수 (30,000개 마커/폴리곤 기준 최적화)
|
|
7
22
|
// ============================================================================
|
|
@@ -50,12 +65,29 @@ var DEFAULT_CULLING_MARGIN = 100;
|
|
|
50
65
|
var DEFAULT_MAX_CACHE_SIZE = 30000;
|
|
51
66
|
/**
|
|
52
67
|
* LRU (Least Recently Used) Cache
|
|
53
|
-
* 메모리 제한을 위한 캐시 구현 (최적화 버전)
|
|
54
68
|
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
69
|
+
* 메모리 제한을 위한 캐시 구현으로, 좌표 변환 결과를 캐싱하여
|
|
70
|
+
* 성능을 최적화합니다. WoongCanvasLayer의 특성에 맞게 최적화되었습니다.
|
|
71
|
+
*
|
|
72
|
+
* ## 주요 특징
|
|
73
|
+
* - **빠른 조회**: O(1) 해시 조회로 성능 최적화
|
|
74
|
+
* - **메모리 제한**: 최대 크기 초과 시 자동 eviction
|
|
75
|
+
* - **FIFO 방식**: 삽입 순서 기반 eviction (접근 빈도 추적 없음)
|
|
76
|
+
*
|
|
77
|
+
* ## 개선 사항
|
|
78
|
+
* 1. **get() 성능 향상**: 접근 빈도 추적 없이 단순 조회만 수행
|
|
79
|
+
* 2. **set() 버그 수정**: 기존 키 업데이트 시 maxSize 체크 로직 개선
|
|
80
|
+
* 3. **메모리 효율**: 단순 FIFO 캐시로 동작하여 오버헤드 최소화
|
|
81
|
+
*
|
|
82
|
+
* @template K 캐시 키 타입
|
|
83
|
+
* @template V 캐시 값 타입
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* const cache = new LRUCache<string, Offset>(1000);
|
|
88
|
+
* cache.set('marker-1', { x: 100, y: 200 });
|
|
89
|
+
* const offset = cache.get('marker-1'); // { x: 100, y: 200 }
|
|
90
|
+
* ```
|
|
59
91
|
*/
|
|
60
92
|
|
|
61
93
|
var LRUCache =
|
|
@@ -135,16 +167,33 @@ function () {
|
|
|
135
167
|
}();
|
|
136
168
|
/**
|
|
137
169
|
* Spatial Hash Grid (공간 해시 그리드)
|
|
138
|
-
* 공간 인덱싱을 위한 그리드 기반 자료구조 (개선 버전)
|
|
139
170
|
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
171
|
+
* 공간 인덱싱을 위한 그리드 기반 자료구조로, 2D 공간을 격자로 나누어
|
|
172
|
+
* 특정 영역에 있는 객체들을 빠르게 찾을 수 있게 해줍니다.
|
|
173
|
+
*
|
|
174
|
+
* ## 주요 특징
|
|
175
|
+
* - **O(1) 조회**: 클릭 위치 주변의 객체들만 체크하여 성능 최적화
|
|
176
|
+
* - **메모리 효율**: 격자 기반으로 필요한 영역만 인덱싱
|
|
177
|
+
* - **중복 방지**: 같은 항목을 여러 번 삽입해도 안전
|
|
178
|
+
*
|
|
179
|
+
* ## 성능 비교
|
|
180
|
+
* - **일반 검색**: 30,000개 항목 전체 체크 → O(n)
|
|
181
|
+
* - **Spatial Hash**: 클릭 위치 주변 ~10개만 체크 → O(1) + O(10)
|
|
182
|
+
* - **성능 향상**: 약 3,000배 빠름! 🚀
|
|
183
|
+
*
|
|
184
|
+
* ## 개선 사항
|
|
185
|
+
* 1. **중복 삽입 방지**: 같은 항목을 여러 번 insert 해도 안전
|
|
186
|
+
* 2. **메모리 누수 방지**: 기존 항목 자동 제거
|
|
187
|
+
* 3. **성능 최적화**: 불필요한 배열 생성 최소화
|
|
188
|
+
*
|
|
189
|
+
* @template T 그리드에 저장할 객체 타입
|
|
144
190
|
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
191
|
+
* @example
|
|
192
|
+
* ```typescript
|
|
193
|
+
* const grid = new SpatialHashGrid<Marker>(50);
|
|
194
|
+
* grid.insert(marker, { x: 100, y: 200, width: 30, height: 40 });
|
|
195
|
+
* const nearby = grid.query(105, 205, 10); // (105, 205) 주변 10px 반경
|
|
196
|
+
* ```
|
|
148
197
|
*/
|
|
149
198
|
|
|
150
199
|
var SpatialHashGrid =
|
|
@@ -1,11 +1,45 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 폴리곤
|
|
2
|
+
* @fileoverview 폴리곤 렌더링을 위한 유틸리티 및 팩토리 함수
|
|
3
3
|
*
|
|
4
|
-
* 이 파일은
|
|
4
|
+
* 이 파일은 WoongCanvasLayer의 POLYGON 모드에서 사용하는 폴리곤 렌더링
|
|
5
|
+
* 함수들을 제공합니다. 다양한 상태(기본, 선택, 호버)에 따른 렌더링과
|
|
6
|
+
* 도넛 폴리곤(구멍이 있는 폴리곤) 지원을 포함합니다.
|
|
7
|
+
*
|
|
8
|
+
* ## 주요 기능
|
|
9
|
+
* - **폴리곤 그리기**: Canvas 2D API를 사용한 폴리곤 렌더링
|
|
10
|
+
* - **도넛 폴리곤 지원**: evenodd fill rule을 사용한 구멍 처리
|
|
11
|
+
* - **상태별 렌더링**: 기본/선택/호버 상태에 따른 색상 및 스타일 적용
|
|
12
|
+
* - **팩토리 함수**: 렌더링 함수를 쉽게 생성할 수 있는 헬퍼
|
|
13
|
+
*
|
|
14
|
+
* @version 2.2.1
|
|
15
|
+
* @since 2.0.0
|
|
16
|
+
* @author 박건웅
|
|
5
17
|
*/
|
|
6
18
|
import { CustomRenderBase, CustomRenderEvent, KonvaCanvasData } from "./types";
|
|
7
19
|
/**
|
|
8
|
-
* 폴리곤 그리기 헬퍼 함수
|
|
20
|
+
* 폴리곤 그리기 헬퍼 함수
|
|
21
|
+
*
|
|
22
|
+
* Canvas 2D API를 사용하여 폴리곤을 그리는 핵심 함수입니다.
|
|
23
|
+
* 도넛 폴리곤(구멍이 있는 폴리곤)도 지원합니다.
|
|
24
|
+
*
|
|
25
|
+
* @param ctx - Canvas 2D 렌더링 컨텍스트
|
|
26
|
+
* @param polygonOffsets - 변환된 폴리곤 좌표 배열
|
|
27
|
+
* @param isDonutPolygon - 도넛 폴리곤 여부
|
|
28
|
+
* @param fillColor - 채우기 색상
|
|
29
|
+
* @param strokeColor - 테두리 색상
|
|
30
|
+
* @param lineWidth - 테두리 두께
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* drawPolygon({
|
|
35
|
+
* ctx,
|
|
36
|
+
* polygonOffsets: [[[[100, 200], [200, 200], [200, 300], [100, 300]]]],
|
|
37
|
+
* isDonutPolygon: false,
|
|
38
|
+
* fillColor: 'rgba(255, 0, 0, 0.5)',
|
|
39
|
+
* strokeColor: 'rgba(255, 0, 0, 1)',
|
|
40
|
+
* lineWidth: 2
|
|
41
|
+
* });
|
|
42
|
+
* ```
|
|
9
43
|
*/
|
|
10
44
|
export declare const drawPolygon: ({ ctx, polygonOffsets, isDonutPolygon, fillColor, strokeColor, lineWidth }: {
|
|
11
45
|
ctx: CanvasRenderingContext2D;
|
|
@@ -16,39 +50,58 @@ export declare const drawPolygon: ({ ctx, polygonOffsets, isDonutPolygon, fillCo
|
|
|
16
50
|
lineWidth: number;
|
|
17
51
|
}) => void;
|
|
18
52
|
/**
|
|
19
|
-
* 폴리곤 Base 렌더링 함수
|
|
53
|
+
* 폴리곤 Base Layer 렌더링 함수 팩토리
|
|
20
54
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
55
|
+
* 기본 상태의 폴리곤들을 렌더링하는 함수를 생성합니다.
|
|
56
|
+
* 선택된 폴리곤들은 Event Layer에서 렌더링되므로 제외됩니다.
|
|
57
|
+
*
|
|
58
|
+
* @param baseFillColor - 기본 폴리곤 채우기 색상
|
|
59
|
+
* @param baseStrokeColor - 기본 폴리곤 테두리 색상
|
|
60
|
+
* @param baseLineWidth - 기본 폴리곤 테두리 두께
|
|
24
61
|
* @returns Base Layer 렌더링 함수
|
|
25
62
|
*
|
|
63
|
+
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
64
|
+
*
|
|
26
65
|
* @example
|
|
66
|
+
* ```typescript
|
|
27
67
|
* const renderBase = renderPolygonBase(
|
|
28
|
-
* 'rgba(255, 100, 100, 0.5)',
|
|
29
|
-
* 'rgba(200, 50, 50, 0.8)',
|
|
30
|
-
* 2
|
|
68
|
+
* 'rgba(255, 100, 100, 0.5)', // 기본 채우기 색상
|
|
69
|
+
* 'rgba(200, 50, 50, 0.8)', // 기본 테두리 색상
|
|
70
|
+
* 2 // 기본 테두리 두께
|
|
31
71
|
* );
|
|
72
|
+
* ```
|
|
32
73
|
*/
|
|
33
74
|
export declare const renderPolygonBase: <T = any>(baseFillColor: string, baseStrokeColor: string, baseLineWidth: number) => CustomRenderBase<KonvaCanvasData<T>>;
|
|
34
75
|
/**
|
|
35
|
-
* 폴리곤 Event 렌더링 함수
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* @param
|
|
47
|
-
* @param
|
|
48
|
-
* @param
|
|
76
|
+
* 폴리곤 Event Layer 렌더링 함수 팩토리
|
|
77
|
+
*
|
|
78
|
+
* 선택, 호버, 활성 상태의 폴리곤들을 렌더링하는 함수를 생성합니다.
|
|
79
|
+
* 다양한 상태에 따른 색상과 스타일을 지원하며, fallback 메커니즘을 제공합니다.
|
|
80
|
+
*
|
|
81
|
+
* ## 상태별 렌더링 우선순위
|
|
82
|
+
* 1. **Hovered**: 마우스가 올라간 폴리곤 (최우선)
|
|
83
|
+
* 2. **Active**: 마지막으로 선택된 폴리곤
|
|
84
|
+
* 3. **Selected**: 선택된 폴리곤들
|
|
85
|
+
* 4. **Base**: 기본 상태 (fallback)
|
|
86
|
+
*
|
|
87
|
+
* @param baseFillColor - 기본 폴리곤 채우기 색상 (필수, fallback용)
|
|
88
|
+
* @param baseStrokeColor - 기본 폴리곤 테두리 색상 (필수, fallback용)
|
|
89
|
+
* @param baseLineWidth - 기본 폴리곤 테두리 두께 (필수, fallback용)
|
|
90
|
+
* @param selectedFillColor - 선택된 폴리곤 채우기 색상 (선택, 기본값: baseFillColor)
|
|
91
|
+
* @param selectedStrokeColor - 선택된 폴리곤 테두리 색상 (선택, 기본값: baseStrokeColor)
|
|
92
|
+
* @param selectedLineWidth - 선택된 폴리곤 테두리 두께 (선택, 기본값: baseLineWidth)
|
|
93
|
+
* @param activeFillColor - 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
94
|
+
* @param activeStrokeColor - 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
95
|
+
* @param activeLineWidth - 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
96
|
+
* @param hoveredFillColor - Hover 시 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
97
|
+
* @param hoveredStrokeColor - Hover 시 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
98
|
+
* @param hoveredLineWidth - Hover 시 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
49
99
|
* @returns Event Layer 렌더링 함수
|
|
50
100
|
*
|
|
101
|
+
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
102
|
+
*
|
|
51
103
|
* @example
|
|
104
|
+
* ```typescript
|
|
52
105
|
* const renderEvent = renderPolygonEvent(
|
|
53
106
|
* 'rgba(255, 100, 100, 0.5)', // baseFillColor
|
|
54
107
|
* 'rgba(200, 50, 50, 0.8)', // baseStrokeColor
|
|
@@ -57,5 +110,6 @@ export declare const renderPolygonBase: <T = any>(baseFillColor: string, baseStr
|
|
|
57
110
|
* 'rgba(255, 152, 0, 1)', // selectedStrokeColor
|
|
58
111
|
* 4 // selectedLineWidth
|
|
59
112
|
* );
|
|
113
|
+
* ```
|
|
60
114
|
*/
|
|
61
115
|
export declare const renderPolygonEvent: <T = any>(baseFillColor: string, baseStrokeColor: string, baseLineWidth: number, selectedFillColor?: string, selectedStrokeColor?: string, selectedLineWidth?: number, activeFillColor?: string, activeStrokeColor?: string, activeLineWidth?: number, hoveredFillColor?: string, hoveredStrokeColor?: string, hoveredLineWidth?: number) => CustomRenderEvent<KonvaCanvasData<T>>;
|
|
@@ -3,13 +3,47 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* 폴리곤
|
|
6
|
+
* @fileoverview 폴리곤 렌더링을 위한 유틸리티 및 팩토리 함수
|
|
7
7
|
*
|
|
8
|
-
* 이 파일은
|
|
8
|
+
* 이 파일은 WoongCanvasLayer의 POLYGON 모드에서 사용하는 폴리곤 렌더링
|
|
9
|
+
* 함수들을 제공합니다. 다양한 상태(기본, 선택, 호버)에 따른 렌더링과
|
|
10
|
+
* 도넛 폴리곤(구멍이 있는 폴리곤) 지원을 포함합니다.
|
|
11
|
+
*
|
|
12
|
+
* ## 주요 기능
|
|
13
|
+
* - **폴리곤 그리기**: Canvas 2D API를 사용한 폴리곤 렌더링
|
|
14
|
+
* - **도넛 폴리곤 지원**: evenodd fill rule을 사용한 구멍 처리
|
|
15
|
+
* - **상태별 렌더링**: 기본/선택/호버 상태에 따른 색상 및 스타일 적용
|
|
16
|
+
* - **팩토리 함수**: 렌더링 함수를 쉽게 생성할 수 있는 헬퍼
|
|
17
|
+
*
|
|
18
|
+
* @version 2.2.1
|
|
19
|
+
* @since 2.0.0
|
|
20
|
+
* @author 박건웅
|
|
9
21
|
*/
|
|
10
22
|
|
|
11
23
|
/**
|
|
12
|
-
* 폴리곤 그리기 헬퍼 함수
|
|
24
|
+
* 폴리곤 그리기 헬퍼 함수
|
|
25
|
+
*
|
|
26
|
+
* Canvas 2D API를 사용하여 폴리곤을 그리는 핵심 함수입니다.
|
|
27
|
+
* 도넛 폴리곤(구멍이 있는 폴리곤)도 지원합니다.
|
|
28
|
+
*
|
|
29
|
+
* @param ctx - Canvas 2D 렌더링 컨텍스트
|
|
30
|
+
* @param polygonOffsets - 변환된 폴리곤 좌표 배열
|
|
31
|
+
* @param isDonutPolygon - 도넛 폴리곤 여부
|
|
32
|
+
* @param fillColor - 채우기 색상
|
|
33
|
+
* @param strokeColor - 테두리 색상
|
|
34
|
+
* @param lineWidth - 테두리 두께
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* drawPolygon({
|
|
39
|
+
* ctx,
|
|
40
|
+
* polygonOffsets: [[[[100, 200], [200, 200], [200, 300], [100, 300]]]],
|
|
41
|
+
* isDonutPolygon: false,
|
|
42
|
+
* fillColor: 'rgba(255, 0, 0, 0.5)',
|
|
43
|
+
* strokeColor: 'rgba(255, 0, 0, 1)',
|
|
44
|
+
* lineWidth: 2
|
|
45
|
+
* });
|
|
46
|
+
* ```
|
|
13
47
|
*/
|
|
14
48
|
var drawPolygon = function (_a) {
|
|
15
49
|
var ctx = _a.ctx,
|
|
@@ -80,19 +114,26 @@ var drawPolygon = function (_a) {
|
|
|
80
114
|
}
|
|
81
115
|
};
|
|
82
116
|
/**
|
|
83
|
-
* 폴리곤 Base 렌더링 함수
|
|
117
|
+
* 폴리곤 Base Layer 렌더링 함수 팩토리
|
|
84
118
|
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
119
|
+
* 기본 상태의 폴리곤들을 렌더링하는 함수를 생성합니다.
|
|
120
|
+
* 선택된 폴리곤들은 Event Layer에서 렌더링되므로 제외됩니다.
|
|
121
|
+
*
|
|
122
|
+
* @param baseFillColor - 기본 폴리곤 채우기 색상
|
|
123
|
+
* @param baseStrokeColor - 기본 폴리곤 테두리 색상
|
|
124
|
+
* @param baseLineWidth - 기본 폴리곤 테두리 두께
|
|
88
125
|
* @returns Base Layer 렌더링 함수
|
|
89
126
|
*
|
|
127
|
+
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
128
|
+
*
|
|
90
129
|
* @example
|
|
130
|
+
* ```typescript
|
|
91
131
|
* const renderBase = renderPolygonBase(
|
|
92
|
-
* 'rgba(255, 100, 100, 0.5)',
|
|
93
|
-
* 'rgba(200, 50, 50, 0.8)',
|
|
94
|
-
* 2
|
|
132
|
+
* 'rgba(255, 100, 100, 0.5)', // 기본 채우기 색상
|
|
133
|
+
* 'rgba(200, 50, 50, 0.8)', // 기본 테두리 색상
|
|
134
|
+
* 2 // 기본 테두리 두께
|
|
95
135
|
* );
|
|
136
|
+
* ```
|
|
96
137
|
*/
|
|
97
138
|
|
|
98
139
|
var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth) {
|
|
@@ -121,23 +162,35 @@ var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth)
|
|
|
121
162
|
};
|
|
122
163
|
};
|
|
123
164
|
/**
|
|
124
|
-
* 폴리곤 Event 렌더링 함수
|
|
165
|
+
* 폴리곤 Event Layer 렌더링 함수 팩토리
|
|
166
|
+
*
|
|
167
|
+
* 선택, 호버, 활성 상태의 폴리곤들을 렌더링하는 함수를 생성합니다.
|
|
168
|
+
* 다양한 상태에 따른 색상과 스타일을 지원하며, fallback 메커니즘을 제공합니다.
|
|
125
169
|
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
* @param
|
|
133
|
-
* @param
|
|
134
|
-
* @param
|
|
135
|
-
* @param
|
|
136
|
-
* @param
|
|
137
|
-
* @param
|
|
170
|
+
* ## 상태별 렌더링 우선순위
|
|
171
|
+
* 1. **Hovered**: 마우스가 올라간 폴리곤 (최우선)
|
|
172
|
+
* 2. **Active**: 마지막으로 선택된 폴리곤
|
|
173
|
+
* 3. **Selected**: 선택된 폴리곤들
|
|
174
|
+
* 4. **Base**: 기본 상태 (fallback)
|
|
175
|
+
*
|
|
176
|
+
* @param baseFillColor - 기본 폴리곤 채우기 색상 (필수, fallback용)
|
|
177
|
+
* @param baseStrokeColor - 기본 폴리곤 테두리 색상 (필수, fallback용)
|
|
178
|
+
* @param baseLineWidth - 기본 폴리곤 테두리 두께 (필수, fallback용)
|
|
179
|
+
* @param selectedFillColor - 선택된 폴리곤 채우기 색상 (선택, 기본값: baseFillColor)
|
|
180
|
+
* @param selectedStrokeColor - 선택된 폴리곤 테두리 색상 (선택, 기본값: baseStrokeColor)
|
|
181
|
+
* @param selectedLineWidth - 선택된 폴리곤 테두리 두께 (선택, 기본값: baseLineWidth)
|
|
182
|
+
* @param activeFillColor - 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
183
|
+
* @param activeStrokeColor - 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
184
|
+
* @param activeLineWidth - 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
185
|
+
* @param hoveredFillColor - Hover 시 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
186
|
+
* @param hoveredStrokeColor - Hover 시 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
187
|
+
* @param hoveredLineWidth - Hover 시 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
138
188
|
* @returns Event Layer 렌더링 함수
|
|
139
189
|
*
|
|
190
|
+
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
191
|
+
*
|
|
140
192
|
* @example
|
|
193
|
+
* ```typescript
|
|
141
194
|
* const renderEvent = renderPolygonEvent(
|
|
142
195
|
* 'rgba(255, 100, 100, 0.5)', // baseFillColor
|
|
143
196
|
* 'rgba(200, 50, 50, 0.8)', // baseStrokeColor
|
|
@@ -146,6 +199,7 @@ var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth)
|
|
|
146
199
|
* 'rgba(255, 152, 0, 1)', // selectedStrokeColor
|
|
147
200
|
* 4 // selectedLineWidth
|
|
148
201
|
* );
|
|
202
|
+
* ```
|
|
149
203
|
*/
|
|
150
204
|
|
|
151
205
|
var renderPolygonEvent = function (baseFillColor, baseStrokeColor, baseLineWidth, selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
|
|
@@ -1,49 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview WoongCanvasLayer를 위한 유틸리티 함수들
|
|
3
|
+
*
|
|
4
|
+
* 이 파일은 좌표 변환, 히트 테스트, 색상 변환 등 WoongCanvasLayer에서
|
|
5
|
+
* 사용하는 다양한 유틸리티 함수들을 제공합니다.
|
|
6
|
+
*
|
|
7
|
+
* ## 주요 기능
|
|
8
|
+
* - **좌표 변환**: 지도 좌표(위경도) ↔ 화면 좌표(픽셀) 변환
|
|
9
|
+
* - **히트 테스트**: 마우스 클릭/호버 시 어떤 마커/폴리곤인지 찾기
|
|
10
|
+
* - **색상 변환**: 다양한 색상 형식 간 변환
|
|
11
|
+
* - **바운딩 박스**: 폴리곤의 경계 영역 계산
|
|
12
|
+
*
|
|
13
|
+
* @version 2.2.1
|
|
14
|
+
* @since 2.0.0
|
|
15
|
+
* @author 박건웅
|
|
16
|
+
*/
|
|
1
17
|
import { Offset } from "../../../../types";
|
|
2
18
|
import { MintMapController } from "../../../MintMapController";
|
|
3
19
|
import { KonvaCanvasData } from "./types";
|
|
4
20
|
/**
|
|
5
|
-
* 폴리곤
|
|
21
|
+
* 폴리곤 좌표를 화면 좌표로 변환
|
|
22
|
+
*
|
|
23
|
+
* GeoJSON MultiPolygon 형식의 폴리곤 데이터를 Canvas에서 그릴 수 있는
|
|
24
|
+
* 화면 좌표 배열로 변환합니다.
|
|
25
|
+
*
|
|
26
|
+
* @param polygonData - 변환할 폴리곤 데이터
|
|
27
|
+
* @param controller - 지도 컨트롤러 (좌표 변환용)
|
|
28
|
+
* @returns 변환된 좌표 배열 또는 null (변환 실패 시)
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const offsets = computePolygonOffsets(polygonData, controller);
|
|
33
|
+
* if (offsets) {
|
|
34
|
+
* // offsets[0][0][0] = [x, y] - 첫 번째 MultiPolygon의 첫 번째 Polygon의 첫 번째 점
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
6
37
|
*/
|
|
7
38
|
export declare const computePolygonOffsets: (polygonData: KonvaCanvasData<any>, controller: MintMapController) => number[][][][] | null;
|
|
8
39
|
/**
|
|
9
|
-
* 마커
|
|
40
|
+
* 마커 좌표를 화면 좌표로 변환
|
|
41
|
+
*
|
|
42
|
+
* 마커의 지도 좌표(위경도)를 Canvas에서 그릴 수 있는 화면 좌표로 변환합니다.
|
|
43
|
+
*
|
|
44
|
+
* @param markerData - 변환할 마커 데이터
|
|
45
|
+
* @param controller - 지도 컨트롤러 (좌표 변환용)
|
|
46
|
+
* @returns 변환된 화면 좌표 또는 null (변환 실패 시)
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const offset = computeMarkerOffset(markerData, controller);
|
|
51
|
+
* if (offset) {
|
|
52
|
+
* console.log(`마커 위치: (${offset.x}, ${offset.y})`);
|
|
53
|
+
* }
|
|
54
|
+
* ```
|
|
10
55
|
*/
|
|
11
56
|
export declare const computeMarkerOffset: (markerData: KonvaCanvasData<any>, controller: MintMapController) => Offset | null;
|
|
12
57
|
/**
|
|
13
|
-
* Point-in-Polygon 알고리즘
|
|
58
|
+
* Point-in-Polygon 알고리즘 (Ray Casting)
|
|
59
|
+
*
|
|
60
|
+
* 주어진 점이 폴리곤 내부에 있는지 확인하는 알고리즘입니다.
|
|
61
|
+
* Ray Casting 방식을 사용하여 홀수 번 교차하면 내부, 짝수 번 교차하면 외부로 판단합니다.
|
|
62
|
+
*
|
|
63
|
+
* @param point - 확인할 점의 좌표
|
|
64
|
+
* @param polygon - 폴리곤의 좌표 배열 (순서대로 연결된 점들)
|
|
65
|
+
* @returns 점이 폴리곤 내부에 있으면 true, 외부에 있으면 false
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const point = { x: 100, y: 100 };
|
|
70
|
+
* const polygon = [[0, 0], [200, 0], [200, 200], [0, 200]];
|
|
71
|
+
* const isInside = isPointInPolygon(point, polygon); // true
|
|
72
|
+
* ```
|
|
14
73
|
*/
|
|
15
74
|
export declare const isPointInPolygon: (point: Offset, polygon: number[][]) => boolean;
|
|
16
75
|
/**
|
|
17
76
|
* 폴리곤 히트 테스트 (도넛 폴리곤 지원)
|
|
18
77
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* 2. 내부 구멍들(나머지): 내부에 있으면 안 됨 (evenodd 규칙)
|
|
78
|
+
* 클릭된 좌표가 폴리곤 내부에 있는지 확인합니다.
|
|
79
|
+
* 도넛 폴리곤(구멍이 있는 폴리곤)도 지원합니다.
|
|
22
80
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
81
|
+
* ## 도넛 폴리곤 처리 로직
|
|
82
|
+
* 1. **외부 폴리곤(첫 번째)**: 내부에 있어야 함
|
|
83
|
+
* 2. **내부 구멍들(나머지)**: 내부에 있으면 안 됨 (evenodd 규칙)
|
|
84
|
+
*
|
|
85
|
+
* ## 중요 사항
|
|
86
|
+
* 도넛 폴리곤과 내부 폴리곤은 별개의 polygonData로 처리됩니다:
|
|
87
|
+
* - 도넛 폴리곤 A: `isDonutPolygon=true`
|
|
88
|
+
* - 내부 폴리곤 B: `isDonutPolygon=false` (별도 데이터)
|
|
89
|
+
*
|
|
90
|
+
* @param clickedOffset - 클릭된 좌표
|
|
91
|
+
* @param polygonData - 확인할 폴리곤 데이터
|
|
92
|
+
* @param getPolygonOffsets - 폴리곤 좌표를 가져오는 함수
|
|
93
|
+
* @returns 클릭된 좌표가 폴리곤 내부에 있으면 true, 외부에 있으면 false
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```typescript
|
|
97
|
+
* const isHit = isPointInPolygonData(
|
|
98
|
+
* { x: 100, y: 100 },
|
|
99
|
+
* polygonData,
|
|
100
|
+
* (data) => computePolygonOffsets(data, controller)
|
|
101
|
+
* );
|
|
102
|
+
* ```
|
|
26
103
|
*/
|
|
27
104
|
export declare const isPointInPolygonData: (clickedOffset: Offset, polygonData: KonvaCanvasData<any>, getPolygonOffsets: (data: KonvaCanvasData<any>) => number[][][][] | null) => boolean;
|
|
28
105
|
/**
|
|
29
106
|
* 마커 히트 테스트 (클릭/hover 영역 체크)
|
|
30
107
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
108
|
+
* 클릭된 좌표가 마커의 클릭 가능한 영역 내부에 있는지 확인합니다.
|
|
109
|
+
*
|
|
110
|
+
* ## 중요 사항
|
|
111
|
+
* **꼬리(tail)는 Hit Test 영역에서 제외됩니다!**
|
|
112
|
+
* - `markerOffset.y`는 마커 최하단(꼬리 끝) 좌표
|
|
113
|
+
* - `boxHeight`는 마커 본체만 포함 (꼬리 제외)
|
|
114
|
+
* - `tailHeight`만큼 위로 올려서 본체만 Hit Test 영역으로 사용
|
|
115
|
+
*
|
|
116
|
+
* @param clickedOffset - 클릭된 좌표
|
|
117
|
+
* @param markerData - 확인할 마커 데이터
|
|
118
|
+
* @param getMarkerOffset - 마커 좌표를 가져오는 함수
|
|
119
|
+
* @returns 클릭된 좌표가 마커 내부에 있으면 true, 외부에 있으면 false
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* const isHit = isPointInMarkerData(
|
|
124
|
+
* { x: 100, y: 100 },
|
|
125
|
+
* markerData,
|
|
126
|
+
* (data) => computeMarkerOffset(data, controller)
|
|
127
|
+
* );
|
|
128
|
+
* ```
|
|
35
129
|
*/
|
|
36
130
|
export declare const isPointInMarkerData: (clickedOffset: Offset, markerData: KonvaCanvasData<any>, getMarkerOffset: (data: KonvaCanvasData<any>) => Offset | null) => boolean;
|
|
131
|
+
/**
|
|
132
|
+
* HEX 색상을 RGBA 색상으로 변환
|
|
133
|
+
*
|
|
134
|
+
* 16진수 색상 코드를 RGBA 형식으로 변환합니다.
|
|
135
|
+
*
|
|
136
|
+
* @param hexColor - 변환할 HEX 색상 (예: "#FF0000" 또는 "FF0000")
|
|
137
|
+
* @param alpha - 알파 값 (0~1, 기본값: 1)
|
|
138
|
+
* @returns RGBA 형식의 색상 문자열
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```typescript
|
|
142
|
+
* const rgba = hexToRgba('#FF0000', 0.5); // "rgba(255, 0, 0, 0.5)"
|
|
143
|
+
* const rgba2 = hexToRgba('FF0000', 1); // "rgba(255, 0, 0, 1)"
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
37
146
|
export declare const hexToRgba: (hexColor: string, alpha?: number) => string;
|
|
38
147
|
/**
|
|
39
|
-
* 텍스트 박스의 너비를
|
|
148
|
+
* 텍스트 박스의 너비를 계산
|
|
149
|
+
*
|
|
150
|
+
* Canvas 2D API의 measureText()를 사용하여 텍스트의 실제 너비를 측정하고,
|
|
151
|
+
* 패딩과 최소 너비를 고려하여 최종 박스 너비를 계산합니다.
|
|
152
|
+
*
|
|
153
|
+
* @param params - 파라미터 객체
|
|
154
|
+
* @param params.text - 측정할 텍스트
|
|
155
|
+
* @param params.fontConfig - 폰트 설정 (예: 'bold 16px Arial')
|
|
156
|
+
* @param params.padding - 텍스트 박스에 적용할 패딩 값
|
|
157
|
+
* @param params.minWidth - 최소 너비
|
|
158
|
+
* @returns 계산된 텍스트 박스의 너비
|
|
40
159
|
*
|
|
41
|
-
* @
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```typescript
|
|
162
|
+
* const width = calculateTextBoxWidth({
|
|
163
|
+
* text: 'Hello World',
|
|
164
|
+
* fontConfig: 'bold 16px Arial',
|
|
165
|
+
* padding: 10,
|
|
166
|
+
* minWidth: 50
|
|
167
|
+
* });
|
|
168
|
+
* ```
|
|
47
169
|
*/
|
|
48
170
|
export declare const calculateTextBoxWidth: ({ text, fontConfig, padding, minWidth, }: {
|
|
49
171
|
text: string;
|