@mint-ui/map 1.2.0-test.16 → 1.2.0-test.17
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.d.ts +7 -7
- package/dist/components/mint-map/core/advanced/woongCanvas/WoongCanvasLayer.js +75 -219
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.d.ts +13 -11
- package/dist/components/mint-map/core/advanced/woongCanvas/shared/renderer.js +29 -21
- package/dist/components/mint-map/google/GoogleMintMapController.js +1 -1
- package/dist/components/mint-map/kakao/KakaoMintMapController.js +1 -1
- package/dist/components/mint-map/naver/NaverMintMapController.js +1 -1
- package/dist/index.es.js +104 -240
- package/dist/index.umd.js +104 -240
- package/package.json +1 -1
package/dist/index.es.js
CHANGED
|
@@ -5535,9 +5535,12 @@ var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth)
|
|
|
5535
5535
|
/**
|
|
5536
5536
|
* 폴리곤 Event 렌더링 함수
|
|
5537
5537
|
*
|
|
5538
|
-
* @param
|
|
5539
|
-
* @param
|
|
5540
|
-
* @param
|
|
5538
|
+
* @param baseFillColor 기본 폴리곤 채우기 색상 (필수, fallback용)
|
|
5539
|
+
* @param baseStrokeColor 기본 폴리곤 테두리 색상 (필수, fallback용)
|
|
5540
|
+
* @param baseLineWidth 기본 폴리곤 테두리 두께 (필수, fallback용)
|
|
5541
|
+
* @param selectedFillColor 선택된 폴리곤 채우기 색상 (선택, 기본값: baseFillColor)
|
|
5542
|
+
* @param selectedStrokeColor 선택된 폴리곤 테두리 색상 (선택, 기본값: baseStrokeColor)
|
|
5543
|
+
* @param selectedLineWidth 선택된 폴리곤 테두리 두께 (선택, 기본값: baseLineWidth)
|
|
5541
5544
|
* @param activeFillColor 마지막 선택된 폴리곤 채우기 색상 (선택, 기본값: selectedFillColor)
|
|
5542
5545
|
* @param activeStrokeColor 마지막 선택된 폴리곤 테두리 색상 (선택, 기본값: selectedStrokeColor)
|
|
5543
5546
|
* @param activeLineWidth 마지막 선택된 폴리곤 테두리 두께 (선택, 기본값: selectedLineWidth)
|
|
@@ -5548,29 +5551,34 @@ var renderPolygonBase = function (baseFillColor, baseStrokeColor, baseLineWidth)
|
|
|
5548
5551
|
*
|
|
5549
5552
|
* @example
|
|
5550
5553
|
* const renderEvent = renderPolygonEvent(
|
|
5551
|
-
* 'rgba(255,
|
|
5552
|
-
* 'rgba(
|
|
5553
|
-
*
|
|
5554
|
-
* 'rgba(255,
|
|
5555
|
-
*
|
|
5556
|
-
*
|
|
5557
|
-
* 'rgba(100, 150, 255, 0.8)'
|
|
5554
|
+
* 'rgba(255, 100, 100, 0.5)', // baseFillColor
|
|
5555
|
+
* 'rgba(200, 50, 50, 0.8)', // baseStrokeColor
|
|
5556
|
+
* 2, // baseLineWidth
|
|
5557
|
+
* 'rgba(255, 193, 7, 0.7)', // selectedFillColor
|
|
5558
|
+
* 'rgba(255, 152, 0, 1)', // selectedStrokeColor
|
|
5559
|
+
* 4 // selectedLineWidth
|
|
5558
5560
|
* );
|
|
5559
5561
|
*/
|
|
5560
5562
|
|
|
5561
|
-
var renderPolygonEvent = function (selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
|
|
5562
|
-
// 기본값 설정 (
|
|
5563
|
-
var
|
|
5563
|
+
var renderPolygonEvent = function (baseFillColor, baseStrokeColor, baseLineWidth, selectedFillColor, selectedStrokeColor, selectedLineWidth, activeFillColor, activeStrokeColor, activeLineWidth, hoveredFillColor, hoveredStrokeColor, hoveredLineWidth) {
|
|
5564
|
+
// 기본값 설정 (base 기준)
|
|
5565
|
+
var _selectedFillColor = selectedFillColor || baseFillColor;
|
|
5564
5566
|
|
|
5565
|
-
var
|
|
5567
|
+
var _selectedStrokeColor = selectedStrokeColor || baseStrokeColor;
|
|
5566
5568
|
|
|
5567
|
-
var
|
|
5569
|
+
var _selectedLineWidth = selectedLineWidth || baseLineWidth;
|
|
5568
5570
|
|
|
5569
|
-
var
|
|
5571
|
+
var _activeFillColor = activeFillColor || _selectedFillColor;
|
|
5570
5572
|
|
|
5571
|
-
var
|
|
5573
|
+
var _activeStrokeColor = activeStrokeColor || _selectedStrokeColor;
|
|
5572
5574
|
|
|
5573
|
-
var
|
|
5575
|
+
var _activeLineWidth = activeLineWidth || _selectedLineWidth;
|
|
5576
|
+
|
|
5577
|
+
var _hoveredFillColor = hoveredFillColor || _selectedFillColor;
|
|
5578
|
+
|
|
5579
|
+
var _hoveredStrokeColor = hoveredStrokeColor || _selectedStrokeColor;
|
|
5580
|
+
|
|
5581
|
+
var _hoveredLineWidth = hoveredLineWidth || _selectedLineWidth;
|
|
5574
5582
|
|
|
5575
5583
|
return function (_a) {
|
|
5576
5584
|
var ctx = _a.ctx,
|
|
@@ -5591,9 +5599,9 @@ var renderPolygonEvent = function (selectedFillColor, selectedStrokeColor, selec
|
|
|
5591
5599
|
ctx: ctx,
|
|
5592
5600
|
polygonOffsets: polygonOffsets,
|
|
5593
5601
|
isDonutPolygon: item.isDonutPolygon || false,
|
|
5594
|
-
fillColor:
|
|
5595
|
-
strokeColor:
|
|
5596
|
-
lineWidth:
|
|
5602
|
+
fillColor: _selectedFillColor,
|
|
5603
|
+
strokeColor: _selectedStrokeColor,
|
|
5604
|
+
lineWidth: _selectedLineWidth
|
|
5597
5605
|
});
|
|
5598
5606
|
}
|
|
5599
5607
|
} // 2. 마지막 선택된 항목 그리기 (호버되지 않은 경우)
|
|
@@ -5636,7 +5644,7 @@ var renderPolygonEvent = function (selectedFillColor, selectedStrokeColor, selec
|
|
|
5636
5644
|
// 메인 컴포넌트
|
|
5637
5645
|
// ============================================================================
|
|
5638
5646
|
|
|
5639
|
-
var
|
|
5647
|
+
var WoongCanvasLayer = function (props) {
|
|
5640
5648
|
var data = props.data,
|
|
5641
5649
|
dataType = props.dataType,
|
|
5642
5650
|
onClick = props.onClick,
|
|
@@ -5778,55 +5786,11 @@ var WoongCanvasLayerComponent = function (props) {
|
|
|
5778
5786
|
var bbox = boundingBoxCacheRef.current.get(item.id);
|
|
5779
5787
|
|
|
5780
5788
|
if (!bbox) {
|
|
5781
|
-
//
|
|
5782
|
-
|
|
5783
|
-
|
|
5784
|
-
|
|
5785
|
-
|
|
5786
|
-
var minX = Infinity,
|
|
5787
|
-
minY = Infinity,
|
|
5788
|
-
maxX = -Infinity,
|
|
5789
|
-
maxY = -Infinity;
|
|
5790
|
-
|
|
5791
|
-
for (var _i = 0, offsets_1 = offsets; _i < offsets_1.length; _i++) {
|
|
5792
|
-
var multiPolygon = offsets_1[_i];
|
|
5793
|
-
|
|
5794
|
-
for (var _a = 0, multiPolygon_1 = multiPolygon; _a < multiPolygon_1.length; _a++) {
|
|
5795
|
-
var polygonGroup = multiPolygon_1[_a];
|
|
5796
|
-
|
|
5797
|
-
for (var _b = 0, polygonGroup_1 = polygonGroup; _b < polygonGroup_1.length; _b++) {
|
|
5798
|
-
var _c = polygonGroup_1[_b],
|
|
5799
|
-
x = _c[0],
|
|
5800
|
-
y = _c[1];
|
|
5801
|
-
if (x < minX) minX = x;
|
|
5802
|
-
if (y < minY) minY = y;
|
|
5803
|
-
if (x > maxX) maxX = x;
|
|
5804
|
-
if (y > maxY) maxY = y;
|
|
5805
|
-
}
|
|
5806
|
-
}
|
|
5807
|
-
}
|
|
5808
|
-
|
|
5809
|
-
bbox = {
|
|
5810
|
-
minX: minX,
|
|
5811
|
-
minY: minY,
|
|
5812
|
-
maxX: maxX,
|
|
5813
|
-
maxY: maxY
|
|
5814
|
-
};
|
|
5815
|
-
boundingBoxCacheRef.current.set(item.id, bbox);
|
|
5816
|
-
} // 마커인 경우
|
|
5817
|
-
else {
|
|
5818
|
-
var offset = getOrComputeMarkerOffset(item);
|
|
5819
|
-
if (!offset) return false;
|
|
5820
|
-
var boxWidth = item.boxWidth || 50;
|
|
5821
|
-
var boxHeight = item.boxHeight || 28;
|
|
5822
|
-
bbox = {
|
|
5823
|
-
minX: offset.x - boxWidth / 2,
|
|
5824
|
-
minY: offset.y - boxHeight - 6,
|
|
5825
|
-
maxX: offset.x + boxWidth / 2,
|
|
5826
|
-
maxY: offset.y
|
|
5827
|
-
};
|
|
5828
|
-
boundingBoxCacheRef.current.set(item.id, bbox);
|
|
5829
|
-
}
|
|
5789
|
+
// 바운딩 박스 계산 (공통 함수 사용)
|
|
5790
|
+
var computed = computeBoundingBox(item);
|
|
5791
|
+
if (!computed) return false;
|
|
5792
|
+
bbox = computed;
|
|
5793
|
+
boundingBoxCacheRef.current.set(item.id, bbox);
|
|
5830
5794
|
} // 바운딩 박스와 viewport 교차 체크
|
|
5831
5795
|
|
|
5832
5796
|
|
|
@@ -5872,6 +5836,65 @@ var WoongCanvasLayerComponent = function (props) {
|
|
|
5872
5836
|
|
|
5873
5837
|
return result;
|
|
5874
5838
|
}; // --------------------------------------------------------------------------
|
|
5839
|
+
// 유틸리티 함수: 바운딩 박스 계산
|
|
5840
|
+
// --------------------------------------------------------------------------
|
|
5841
|
+
|
|
5842
|
+
/**
|
|
5843
|
+
* 아이템의 바운딩 박스 계산 (폴리곤/마커 공통)
|
|
5844
|
+
*
|
|
5845
|
+
* @param item 마커 또는 폴리곤 데이터
|
|
5846
|
+
* @returns 바운딩 박스 또는 null
|
|
5847
|
+
*/
|
|
5848
|
+
|
|
5849
|
+
|
|
5850
|
+
var computeBoundingBox = function (item) {
|
|
5851
|
+
if (dataType === CanvasDataType.POLYGON) {
|
|
5852
|
+
// 폴리곤: 모든 좌표의 최소/최대값 계산
|
|
5853
|
+
var offsets = getOrComputePolygonOffsets(item);
|
|
5854
|
+
if (!offsets) return null;
|
|
5855
|
+
var minX = Infinity,
|
|
5856
|
+
minY = Infinity,
|
|
5857
|
+
maxX = -Infinity,
|
|
5858
|
+
maxY = -Infinity;
|
|
5859
|
+
|
|
5860
|
+
for (var _i = 0, offsets_1 = offsets; _i < offsets_1.length; _i++) {
|
|
5861
|
+
var multiPolygon = offsets_1[_i];
|
|
5862
|
+
|
|
5863
|
+
for (var _a = 0, multiPolygon_1 = multiPolygon; _a < multiPolygon_1.length; _a++) {
|
|
5864
|
+
var polygonGroup = multiPolygon_1[_a];
|
|
5865
|
+
|
|
5866
|
+
for (var _b = 0, polygonGroup_1 = polygonGroup; _b < polygonGroup_1.length; _b++) {
|
|
5867
|
+
var _c = polygonGroup_1[_b],
|
|
5868
|
+
x = _c[0],
|
|
5869
|
+
y = _c[1];
|
|
5870
|
+
if (x < minX) minX = x;
|
|
5871
|
+
if (y < minY) minY = y;
|
|
5872
|
+
if (x > maxX) maxX = x;
|
|
5873
|
+
if (y > maxY) maxY = y;
|
|
5874
|
+
}
|
|
5875
|
+
}
|
|
5876
|
+
}
|
|
5877
|
+
|
|
5878
|
+
return {
|
|
5879
|
+
minX: minX,
|
|
5880
|
+
minY: minY,
|
|
5881
|
+
maxX: maxX,
|
|
5882
|
+
maxY: maxY
|
|
5883
|
+
};
|
|
5884
|
+
} else {
|
|
5885
|
+
// 마커: 중심점 기준 박스 크기 계산
|
|
5886
|
+
var offset = getOrComputeMarkerOffset(item);
|
|
5887
|
+
if (!offset) return null;
|
|
5888
|
+
var boxWidth = item.boxWidth || 50;
|
|
5889
|
+
var boxHeight = item.boxHeight || 28;
|
|
5890
|
+
return {
|
|
5891
|
+
minX: offset.x - boxWidth / 2,
|
|
5892
|
+
minY: offset.y - boxHeight - 6,
|
|
5893
|
+
maxX: offset.x + boxWidth / 2,
|
|
5894
|
+
maxY: offset.y
|
|
5895
|
+
};
|
|
5896
|
+
}
|
|
5897
|
+
}; // --------------------------------------------------------------------------
|
|
5875
5898
|
// 유틸리티 함수: 공간 인덱싱
|
|
5876
5899
|
// --------------------------------------------------------------------------
|
|
5877
5900
|
|
|
@@ -5886,52 +5909,12 @@ var WoongCanvasLayerComponent = function (props) {
|
|
|
5886
5909
|
var currentMarkers = markersRef.current;
|
|
5887
5910
|
|
|
5888
5911
|
for (var _i = 0, currentMarkers_1 = currentMarkers; _i < currentMarkers_1.length; _i++) {
|
|
5889
|
-
var item = currentMarkers_1[_i];
|
|
5912
|
+
var item = currentMarkers_1[_i]; // 바운딩 박스 계산 (공통 함수 사용)
|
|
5890
5913
|
|
|
5891
|
-
|
|
5892
|
-
// 폴리곤: 바운딩 박스 계산 (최적화: 직접 비교)
|
|
5893
|
-
var offsets = getOrComputePolygonOffsets(item);
|
|
5894
|
-
|
|
5895
|
-
if (offsets) {
|
|
5896
|
-
var minX = Infinity,
|
|
5897
|
-
minY = Infinity,
|
|
5898
|
-
maxX = -Infinity,
|
|
5899
|
-
maxY = -Infinity;
|
|
5900
|
-
|
|
5901
|
-
for (var _a = 0, offsets_2 = offsets; _a < offsets_2.length; _a++) {
|
|
5902
|
-
var multiPolygon = offsets_2[_a];
|
|
5903
|
-
|
|
5904
|
-
for (var _b = 0, multiPolygon_2 = multiPolygon; _b < multiPolygon_2.length; _b++) {
|
|
5905
|
-
var polygonGroup = multiPolygon_2[_b];
|
|
5906
|
-
|
|
5907
|
-
for (var _c = 0, polygonGroup_2 = polygonGroup; _c < polygonGroup_2.length; _c++) {
|
|
5908
|
-
var _d = polygonGroup_2[_c],
|
|
5909
|
-
x = _d[0],
|
|
5910
|
-
y = _d[1];
|
|
5911
|
-
if (x < minX) minX = x;
|
|
5912
|
-
if (y < minY) minY = y;
|
|
5913
|
-
if (x > maxX) maxX = x;
|
|
5914
|
-
if (y > maxY) maxY = y;
|
|
5915
|
-
}
|
|
5916
|
-
}
|
|
5917
|
-
}
|
|
5914
|
+
var bbox = computeBoundingBox(item);
|
|
5918
5915
|
|
|
5919
|
-
|
|
5920
|
-
|
|
5921
|
-
} else {
|
|
5922
|
-
// 마커: 점 기반 바운딩 박스
|
|
5923
|
-
var offset = getOrComputeMarkerOffset(item);
|
|
5924
|
-
|
|
5925
|
-
if (offset) {
|
|
5926
|
-
var boxWidth = item.boxWidth || 50;
|
|
5927
|
-
var boxHeight = item.boxHeight || 28;
|
|
5928
|
-
var tailHeight = 6;
|
|
5929
|
-
var minX = offset.x - boxWidth / 2;
|
|
5930
|
-
var minY = offset.y - boxHeight - tailHeight;
|
|
5931
|
-
var maxX = offset.x + boxWidth / 2;
|
|
5932
|
-
var maxY = offset.y;
|
|
5933
|
-
spatial.insert(item, minX, minY, maxX, maxY);
|
|
5934
|
-
}
|
|
5916
|
+
if (bbox) {
|
|
5917
|
+
spatial.insert(item, bbox.minX, bbox.minY, bbox.maxX, bbox.maxY);
|
|
5935
5918
|
}
|
|
5936
5919
|
}
|
|
5937
5920
|
}; // --------------------------------------------------------------------------
|
|
@@ -5960,7 +5943,7 @@ var WoongCanvasLayerComponent = function (props) {
|
|
|
5960
5943
|
var renderAnimation = dataType === CanvasDataType.MARKER ? props.renderAnimation : undefined;
|
|
5961
5944
|
var renderEvent = dataType === CanvasDataType.MARKER ? props.renderEvent : function () {
|
|
5962
5945
|
var polygonProps = props;
|
|
5963
|
-
return renderPolygonEvent(polygonProps.selectedFillColor, polygonProps.selectedStrokeColor, polygonProps.selectedLineWidth, polygonProps.activeFillColor, polygonProps.activeStrokeColor, polygonProps.activeLineWidth, polygonProps.hoveredFillColor, polygonProps.hoveredStrokeColor, polygonProps.hoveredLineWidth);
|
|
5946
|
+
return renderPolygonEvent(polygonProps.baseFillColor, polygonProps.baseStrokeColor, polygonProps.baseLineWidth, polygonProps.selectedFillColor, polygonProps.selectedStrokeColor, polygonProps.selectedLineWidth, polygonProps.activeFillColor, polygonProps.activeStrokeColor, polygonProps.activeLineWidth, polygonProps.hoveredFillColor, polygonProps.hoveredStrokeColor, polygonProps.hoveredLineWidth);
|
|
5964
5947
|
}();
|
|
5965
5948
|
/**
|
|
5966
5949
|
* Base 레이어 렌더링 (뷰포트 컬링 적용, 선택된 마커 제외)
|
|
@@ -6038,13 +6021,6 @@ var WoongCanvasLayerComponent = function (props) {
|
|
|
6038
6021
|
var doRenderEvent = function () {
|
|
6039
6022
|
var layer = eventLayerRef.current;
|
|
6040
6023
|
if (!layer) return;
|
|
6041
|
-
|
|
6042
|
-
if (!onClick && !onMouseOver && !onMouseOut) {
|
|
6043
|
-
layer.destroyChildren();
|
|
6044
|
-
layer.batchDraw();
|
|
6045
|
-
return;
|
|
6046
|
-
}
|
|
6047
|
-
|
|
6048
6024
|
if (!renderEvent) return; // 🔥 Shape 재사용: 이미 존재하면 재사용, 없으면 생성
|
|
6049
6025
|
|
|
6050
6026
|
var shape = layer.findOne('.event-render-shape');
|
|
@@ -6243,7 +6219,6 @@ var WoongCanvasLayerComponent = function (props) {
|
|
|
6243
6219
|
|
|
6244
6220
|
|
|
6245
6221
|
var setHovered = function (data) {
|
|
6246
|
-
if (!onMouseOver && !onMouseOut) return;
|
|
6247
6222
|
hoveredItemRef.current = data;
|
|
6248
6223
|
|
|
6249
6224
|
if (draggingRef.current) {
|
|
@@ -6268,8 +6243,7 @@ var WoongCanvasLayerComponent = function (props) {
|
|
|
6268
6243
|
|
|
6269
6244
|
|
|
6270
6245
|
var handleLocalClick = function (data) {
|
|
6271
|
-
|
|
6272
|
-
|
|
6246
|
+
// 1. 선택 상태 업데이트
|
|
6273
6247
|
if (enableMultiSelect) {
|
|
6274
6248
|
// 다중 선택: Set과 Map 동시 업데이트
|
|
6275
6249
|
var newSelected = new Set(selectedIdsRef.current);
|
|
@@ -6321,7 +6295,6 @@ var WoongCanvasLayerComponent = function (props) {
|
|
|
6321
6295
|
|
|
6322
6296
|
if (disableInteractionRef.current) return; // 🚫 상호작용 비활성화 시 즉시 반환
|
|
6323
6297
|
|
|
6324
|
-
if (!onClick) return;
|
|
6325
6298
|
if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
|
|
6326
6299
|
|
|
6327
6300
|
try {
|
|
@@ -6330,7 +6303,10 @@ var WoongCanvasLayerComponent = function (props) {
|
|
|
6330
6303
|
|
|
6331
6304
|
if (data_1) {
|
|
6332
6305
|
handleLocalClick(data_1);
|
|
6333
|
-
|
|
6306
|
+
|
|
6307
|
+
if (onClick) {
|
|
6308
|
+
onClick(data_1, selectedIdsRef.current);
|
|
6309
|
+
}
|
|
6334
6310
|
}
|
|
6335
6311
|
} catch (error) {
|
|
6336
6312
|
console.error('[WoongKonvaMarker] handleClick error:', error);
|
|
@@ -6346,7 +6322,6 @@ var WoongCanvasLayerComponent = function (props) {
|
|
|
6346
6322
|
|
|
6347
6323
|
if (disableInteractionRef.current) return; // 🚫 상호작용 비활성화 시 즉시 반환
|
|
6348
6324
|
|
|
6349
|
-
if (!onMouseOver && !onMouseOut) return;
|
|
6350
6325
|
if (context || !((_a = event === null || event === void 0 ? void 0 : event.param) === null || _a === void 0 ? void 0 : _a.position)) return;
|
|
6351
6326
|
|
|
6352
6327
|
try {
|
|
@@ -6389,7 +6364,6 @@ var WoongCanvasLayerComponent = function (props) {
|
|
|
6389
6364
|
var handleMouseLeave = function () {
|
|
6390
6365
|
if (disableInteractionRef.current) return; // 🚫 상호작용 비활성화 시 즉시 반환
|
|
6391
6366
|
|
|
6392
|
-
if (!onMouseOver && !onMouseOut) return;
|
|
6393
6367
|
var prevHovered = hoveredItemRef.current;
|
|
6394
6368
|
|
|
6395
6369
|
if (prevHovered) {
|
|
@@ -6674,116 +6648,6 @@ var WoongCanvasLayerComponent = function (props) {
|
|
|
6674
6648
|
}
|
|
6675
6649
|
}), divElement);
|
|
6676
6650
|
};
|
|
6677
|
-
/**
|
|
6678
|
-
* 🚀 WoongCanvasLayer - Konva 기반 초고성능 마커/폴리곤 렌더링 컴포넌트
|
|
6679
|
-
*
|
|
6680
|
-
* ## 📌 주요 특징
|
|
6681
|
-
* - **30,000개 이상의 폴리곤/마커를 60fps로 렌더링**
|
|
6682
|
-
* - **Multi-Layer 아키텍처**: Base/Animation/Event 레이어 분리
|
|
6683
|
-
* - **Spatial Hash Grid**: O(1) 수준의 빠른 Hit Test
|
|
6684
|
-
* - **LRU 캐시**: 좌표 변환 결과 캐싱으로 성능 최적화
|
|
6685
|
-
* - **Viewport Culling**: 화면에 보이는 영역만 렌더링
|
|
6686
|
-
* - **Discriminated Union Props**: 타입 안전한 MARKER/POLYGON 모드
|
|
6687
|
-
*
|
|
6688
|
-
* ## 🎯 사용 방법
|
|
6689
|
-
*
|
|
6690
|
-
* ### 1️⃣ POLYGON 모드 (자동 렌더링)
|
|
6691
|
-
* ```tsx
|
|
6692
|
-
* <WoongCanvasLayer
|
|
6693
|
-
* dataType={CanvasDataType.POLYGON}
|
|
6694
|
-
* data={polygons}
|
|
6695
|
-
* baseFillColor="rgba(255, 100, 100, 0.5)"
|
|
6696
|
-
* baseStrokeColor="rgba(200, 50, 50, 0.8)"
|
|
6697
|
-
* baseLineWidth={2}
|
|
6698
|
-
* selectedFillColor="rgba(255, 193, 7, 0.7)"
|
|
6699
|
-
* selectedStrokeColor="rgba(255, 152, 0, 1)"
|
|
6700
|
-
* selectedLineWidth={4}
|
|
6701
|
-
* hoveredFillColor="rgba(100, 150, 255, 0.8)" // optional
|
|
6702
|
-
* hoveredStrokeColor="rgba(0, 100, 200, 1)" // optional
|
|
6703
|
-
* hoveredLineWidth={3} // optional
|
|
6704
|
-
* enableMultiSelect={true}
|
|
6705
|
-
* onClick={handleClick}
|
|
6706
|
-
* />
|
|
6707
|
-
* ```
|
|
6708
|
-
*
|
|
6709
|
-
* ### 2️⃣ MARKER 모드 (커스텀 렌더링)
|
|
6710
|
-
* ```tsx
|
|
6711
|
-
* <WoongCanvasLayer
|
|
6712
|
-
* dataType={CanvasDataType.MARKER}
|
|
6713
|
-
* data={markers}
|
|
6714
|
-
* renderBase={renderMarkerBase} // required
|
|
6715
|
-
* renderAnimation={renderMarkerAnimation} // optional
|
|
6716
|
-
* renderEvent={renderMarkerEvent} // optional
|
|
6717
|
-
* topOnHover={true}
|
|
6718
|
-
* onClick={handleClick}
|
|
6719
|
-
* />
|
|
6720
|
-
* ```
|
|
6721
|
-
*
|
|
6722
|
-
* ## 📊 데이터 형식
|
|
6723
|
-
* ```typescript
|
|
6724
|
-
* const data: KonvaCanvasData<T>[] = [
|
|
6725
|
-
* {
|
|
6726
|
-
* id: 'unique-id',
|
|
6727
|
-
* position: new Position(lat, lng),
|
|
6728
|
-
* // POLYGON: paths 필수
|
|
6729
|
-
* paths: [[[lat, lng], [lat, lng], ...]],
|
|
6730
|
-
* // MARKER: boxWidth/boxHeight 권장 (Hit Test 정확도)
|
|
6731
|
-
* boxWidth: 60,
|
|
6732
|
-
* boxHeight: 75,
|
|
6733
|
-
* // 커스텀 데이터
|
|
6734
|
-
* ...customData
|
|
6735
|
-
* }
|
|
6736
|
-
* ];
|
|
6737
|
-
* ```
|
|
6738
|
-
*
|
|
6739
|
-
* ## ⚡ 성능 최적화 팁
|
|
6740
|
-
* 1. **동적 boxWidth 계산**: `measureText()`로 실제 너비 계산 후 전달
|
|
6741
|
-
* 2. **enableViewportCulling**: 대량 데이터 시 필수 (기본 true)
|
|
6742
|
-
* 3. **selectedItems 외부 관리**: 상태를 외부에서 관리하여 리렌더링 최소화
|
|
6743
|
-
* 4. **React.memo 최적화**: 컴포넌트가 자동으로 불필요한 리렌더링 방지
|
|
6744
|
-
*
|
|
6745
|
-
* @template T 마커/폴리곤 데이터의 추가 속성 타입
|
|
6746
|
-
*
|
|
6747
|
-
* @example
|
|
6748
|
-
* // 동적 boxWidth 계산 예시
|
|
6749
|
-
* const tempCtx = document.createElement('canvas').getContext('2d');
|
|
6750
|
-
* tempCtx.font = 'bold 15px Arial';
|
|
6751
|
-
* const boxWidth = Math.max(60, tempCtx.measureText(text).width + 20);
|
|
6752
|
-
*
|
|
6753
|
-
* @see {@link https://github.com/your-repo/docs/WoongCanvasLayer.md} 전체 문서
|
|
6754
|
-
*/
|
|
6755
|
-
|
|
6756
|
-
|
|
6757
|
-
var WoongCanvasLayer = React.memo(WoongCanvasLayerComponent, function (prevProps, nextProps) {
|
|
6758
|
-
// // 1. data 비교
|
|
6759
|
-
// const prevData = prevProps.data;
|
|
6760
|
-
// const nextData = nextProps.data;
|
|
6761
|
-
// // 참조가 같으면 스킵
|
|
6762
|
-
// if (prevData !== nextData) {
|
|
6763
|
-
// // 길이가 다르면 변경됨
|
|
6764
|
-
// if (prevData.length !== nextData.length) return false;
|
|
6765
|
-
// // 각 데이터의 ID 비교
|
|
6766
|
-
// for (let i = 0; i < prevData.length; i++) {
|
|
6767
|
-
// if (prevData[i].id !== nextData[i].id) {
|
|
6768
|
-
// return false; // 변경됨 → 리렌더링
|
|
6769
|
-
// }
|
|
6770
|
-
// }
|
|
6771
|
-
// }
|
|
6772
|
-
// 2. selectedItems 비교 (참조만 비교)
|
|
6773
|
-
if (prevProps.selectedItems !== nextProps.selectedItems) {
|
|
6774
|
-
return false; // 변경됨 → 리렌더링
|
|
6775
|
-
}
|
|
6776
|
-
|
|
6777
|
-
if (prevProps.selectedItem !== nextProps.selectedItem) {
|
|
6778
|
-
return false; // 변경됨 → 리렌더링
|
|
6779
|
-
}
|
|
6780
|
-
|
|
6781
|
-
if (prevProps.disableInteraction !== nextProps.disableInteraction) {
|
|
6782
|
-
return false; // 변경됨 → 리렌더링
|
|
6783
|
-
}
|
|
6784
|
-
|
|
6785
|
-
return true; // 같음 → 리렌더링 스킵
|
|
6786
|
-
});
|
|
6787
6651
|
|
|
6788
6652
|
var css_248z = ".MintMapWrapper-module_mint-map-control-wrapper-container__DONh7 {\n position: absolute;\n width: 100%;\n height: 100%;\n display: flex;\n pointer-events: none;\n z-index: 101;\n}\n\n.MintMapWrapper-module_mint-map-overlay-wrapper__Jn4wV {\n position: absolute;\n z-index: 1;\n}";
|
|
6789
6653
|
var styles = {"mint-map-control-wrapper-container":"MintMapWrapper-module_mint-map-control-wrapper-container__DONh7","mint-map-overlay-wrapper":"MintMapWrapper-module_mint-map-overlay-wrapper__Jn4wV"};
|