@zurigo/maps 1.0.0 → 1.0.2

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 (57) hide show
  1. package/dist/components/error-display.d.ts +33 -0
  2. package/dist/components/error-display.d.ts.map +1 -0
  3. package/dist/components/error-display.js +188 -0
  4. package/dist/components/error-display.js.map +1 -0
  5. package/dist/components/google-maps.d.ts +31 -0
  6. package/dist/components/google-maps.d.ts.map +1 -0
  7. package/dist/components/google-maps.js +1709 -0
  8. package/dist/components/google-maps.js.map +1 -0
  9. package/dist/index.d.ts +8 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +35 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/lib/google-maps/china-fallback.d.ts +64 -0
  14. package/dist/lib/google-maps/china-fallback.d.ts.map +1 -0
  15. package/dist/lib/google-maps/china-fallback.js +212 -0
  16. package/dist/lib/google-maps/china-fallback.js.map +1 -0
  17. package/dist/lib/google-maps/config.d.ts +51 -0
  18. package/dist/lib/google-maps/config.d.ts.map +1 -0
  19. package/dist/lib/google-maps/config.js +73 -0
  20. package/dist/lib/google-maps/config.js.map +1 -0
  21. package/dist/lib/google-maps/error-handler.d.ts +30 -0
  22. package/dist/lib/google-maps/error-handler.d.ts.map +1 -0
  23. package/dist/lib/google-maps/error-handler.js +224 -0
  24. package/dist/lib/google-maps/error-handler.js.map +1 -0
  25. package/dist/lib/google-maps/geocoding-service.d.ts +47 -0
  26. package/dist/lib/google-maps/geocoding-service.d.ts.map +1 -0
  27. package/dist/lib/google-maps/geocoding-service.js +224 -0
  28. package/dist/lib/google-maps/geocoding-service.js.map +1 -0
  29. package/dist/lib/google-maps/hooks.d.ts +35 -0
  30. package/dist/lib/google-maps/hooks.d.ts.map +1 -0
  31. package/dist/lib/google-maps/hooks.js +207 -0
  32. package/dist/lib/google-maps/hooks.js.map +1 -0
  33. package/dist/lib/google-maps/index.d.ts +7 -0
  34. package/dist/lib/google-maps/index.d.ts.map +1 -0
  35. package/dist/lib/google-maps/index.js +23 -0
  36. package/dist/lib/google-maps/index.js.map +1 -0
  37. package/dist/lib/google-maps/types.d.ts +96 -0
  38. package/dist/lib/google-maps/types.d.ts.map +1 -0
  39. package/dist/lib/google-maps/types.js +41 -0
  40. package/dist/lib/google-maps/types.js.map +1 -0
  41. package/dist/lib/google-maps/utils.d.ts +20 -0
  42. package/dist/lib/google-maps/utils.d.ts.map +1 -0
  43. package/dist/lib/google-maps/utils.js +176 -0
  44. package/dist/lib/google-maps/utils.js.map +1 -0
  45. package/dist/lib/solar-panel/constraints.d.ts +62 -0
  46. package/dist/lib/solar-panel/constraints.d.ts.map +1 -0
  47. package/dist/lib/solar-panel/constraints.js +166 -0
  48. package/dist/lib/solar-panel/constraints.js.map +1 -0
  49. package/dist/lib/solar-panel/orientation.d.ts +56 -0
  50. package/dist/lib/solar-panel/orientation.d.ts.map +1 -0
  51. package/dist/lib/solar-panel/orientation.js +255 -0
  52. package/dist/lib/solar-panel/orientation.js.map +1 -0
  53. package/dist/lib/solar-panel-calculator.d.ts +126 -0
  54. package/dist/lib/solar-panel-calculator.d.ts.map +1 -0
  55. package/dist/lib/solar-panel-calculator.js +450 -0
  56. package/dist/lib/solar-panel-calculator.js.map +1 -0
  57. package/package.json +2 -2
@@ -0,0 +1,126 @@
1
+ /**
2
+ * 태양광 패널 사양 및 배치 계산 유틸리티
3
+ */
4
+ export declare const SOLAR_PANEL_SPECS: {
5
+ readonly WIDTH_MM: 2380;
6
+ readonly HEIGHT_MM: 1134;
7
+ readonly CAPACITY_W: 635;
8
+ readonly SPACING_FACTOR: 1;
9
+ readonly HORIZONTAL_SPACING_MM: 803;
10
+ };
11
+ /**
12
+ * Google Maps API를 활용하여 정확한 거리 기반으로 패널 개수와 배치 정보를 계산합니다.
13
+ * @param polygon Google Maps Polygon 객체
14
+ * @returns 패널 배치 상세 정보
15
+ */
16
+ export declare const calculatePanelLayoutFromPolygon: (polygon: google.maps.Polygon) => {
17
+ totalPanels: number;
18
+ rows: number;
19
+ columns: number;
20
+ orientation: "landscape";
21
+ capacity: number;
22
+ area: number;
23
+ rotationAngle: number;
24
+ center: null;
25
+ edges: never[];
26
+ dimensions: {
27
+ width: number;
28
+ height: number;
29
+ };
30
+ panelSpacing: {
31
+ x: number;
32
+ y: number;
33
+ };
34
+ isRectangular: boolean;
35
+ efficiency?: undefined;
36
+ gridPoints?: undefined;
37
+ validPanelPositions?: undefined;
38
+ } | {
39
+ totalPanels: number;
40
+ rows: number;
41
+ columns: number;
42
+ orientation: "landscape";
43
+ efficiency: number;
44
+ capacity: number;
45
+ area: number;
46
+ rotationAngle: number;
47
+ center: {
48
+ lat: number;
49
+ lng: number;
50
+ };
51
+ edges: {
52
+ from: {
53
+ lat: number;
54
+ lng: number;
55
+ };
56
+ to: {
57
+ lat: number;
58
+ lng: number;
59
+ };
60
+ distance: number;
61
+ angle: number;
62
+ index: number;
63
+ }[];
64
+ dimensions: {
65
+ width: number;
66
+ height: number;
67
+ };
68
+ panelSpacing: {
69
+ x: number;
70
+ y: number;
71
+ };
72
+ isRectangular: boolean;
73
+ gridPoints: {
74
+ row: number;
75
+ col: number;
76
+ lat: number;
77
+ lng: number;
78
+ relativeX: number;
79
+ relativeY: number;
80
+ }[];
81
+ validPanelPositions: {
82
+ row: number;
83
+ col: number;
84
+ lat: number;
85
+ lng: number;
86
+ relativeX: number;
87
+ relativeY: number;
88
+ }[];
89
+ };
90
+ /**
91
+ * 하위 호환성을 위한 기존 함수
92
+ */
93
+ export declare const calculatePanelCountFromPolygon: (polygon: google.maps.Polygon) => number;
94
+ /**
95
+ * 폴리곤 geometry를 기반으로 실제 배치 가능한 패널 개수를 계산합니다. (하위 호환성 유지)
96
+ * @param polygonGeometry 폴리곤 좌표 배열
97
+ * @returns 배치 가능한 패널 개수 (정수)
98
+ */
99
+ export declare const calculatePanelCountFromGeometry: (polygonGeometry: {
100
+ lat: number;
101
+ lng: number;
102
+ }[]) => number;
103
+ /**
104
+ * 기존 면적 기반 계산 (하위 호환성 유지)
105
+ * @param areaM2 사용 가능한 면적 (m²)
106
+ * @returns 배치 가능한 패널 개수 (정수, 소수점 버림)
107
+ */
108
+ export declare const calculatePanelCount: (areaM2: number) => number;
109
+ /**
110
+ * 패널 개수로부터 총 용량을 계산합니다. (하위 호환성 유지)
111
+ * @param panelCount 패널 개수
112
+ * @returns 총 용량 (kW)
113
+ */
114
+ export declare const calculateTotalCapacity: (panelCount: number) => number;
115
+ /**
116
+ * 면적으로부터 직접 총 용량을 계산합니다.
117
+ * @param areaM2 사용 가능한 면적 (m²)
118
+ * @returns 총 용량 (kW)
119
+ */
120
+ export declare const calculateCapacityFromArea: (areaM2: number) => number;
121
+ /**
122
+ * 패널 1개당 실제 필요한 면적을 반환합니다. (설치 간격 포함)
123
+ * @returns 패널 1개당 필요 면적 (m²)
124
+ */
125
+ export declare const getPanelRequiredArea: () => number;
126
+ //# sourceMappingURL=solar-panel-calculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solar-panel-calculator.d.ts","sourceRoot":"","sources":["../../src/lib/solar-panel-calculator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,iBAAiB;;;;;;CAQpB,CAAA;AAEV;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,GAC1C,SAAS,MAAM,CAAC,IAAI,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmI7B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,8BAA8B,GACzC,SAAS,MAAM,CAAC,IAAI,CAAC,OAAO,KAC3B,MAEF,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,GAC1C,iBAAiB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,KAC9C,MAWF,CAAA;AA6XD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,KAAG,MAUpD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,YAAY,MAAM,KAAG,MAE3D,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ,MAAM,KAAG,MAG1D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAAO,MAIvC,CAAA"}
@@ -0,0 +1,450 @@
1
+ "use strict";
2
+ /**
3
+ * 태양광 패널 사양 및 배치 계산 유틸리티
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getPanelRequiredArea = exports.calculateCapacityFromArea = exports.calculateTotalCapacity = exports.calculatePanelCount = exports.calculatePanelCountFromGeometry = exports.calculatePanelCountFromPolygon = exports.calculatePanelLayoutFromPolygon = exports.SOLAR_PANEL_SPECS = void 0;
7
+ // 태양광 패널 사양
8
+ exports.SOLAR_PANEL_SPECS = {
9
+ WIDTH_MM: 2380, // 가로 2,380mm
10
+ HEIGHT_MM: 1134, // 세로 1,134mm
11
+ CAPACITY_W: 635, // 용량 635W (0.635kW)
12
+ // 설치 간격 고려 (패널 간 유지보수 공간)
13
+ SPACING_FACTOR: 1.0, // 실제 설치 시 20% 추가 공간 필요
14
+ // 패널 간 이격거리 (landscape 방향 기준)
15
+ HORIZONTAL_SPACING_MM: 803, // 가로 방향 이격거리 803mm
16
+ };
17
+ /**
18
+ * Google Maps API를 활용하여 정확한 거리 기반으로 패널 개수와 배치 정보를 계산합니다.
19
+ * @param polygon Google Maps Polygon 객체
20
+ * @returns 패널 배치 상세 정보
21
+ */
22
+ const calculatePanelLayoutFromPolygon = (polygon) => {
23
+ var _a, _b;
24
+ if (!polygon || !((_b = (_a = window.google) === null || _a === void 0 ? void 0 : _a.maps) === null || _b === void 0 ? void 0 : _b.geometry)) {
25
+ return {
26
+ totalPanels: 0,
27
+ rows: 0,
28
+ columns: 0,
29
+ orientation: 'landscape',
30
+ capacity: 0,
31
+ area: 0,
32
+ rotationAngle: 0,
33
+ center: null,
34
+ edges: [],
35
+ dimensions: { width: 0, height: 0 },
36
+ panelSpacing: { x: 0, y: 0 },
37
+ isRectangular: false,
38
+ };
39
+ }
40
+ const path = polygon.getPath();
41
+ if (path.getLength() < 3) {
42
+ return {
43
+ totalPanels: 0,
44
+ rows: 0,
45
+ columns: 0,
46
+ orientation: 'landscape',
47
+ capacity: 0,
48
+ area: 0,
49
+ rotationAngle: 0,
50
+ center: null,
51
+ edges: [],
52
+ dimensions: { width: 0, height: 0 },
53
+ panelSpacing: { x: 0, y: 0 },
54
+ isRectangular: false,
55
+ };
56
+ }
57
+ // Google Maps API를 사용한 정확한 거리 및 면적 계산
58
+ const area = google.maps.geometry.spherical.computeArea(path); // m²
59
+ // 폴리곤의 바운딩 박스 계산
60
+ const bounds = new google.maps.LatLngBounds();
61
+ const pathArray = [];
62
+ for (let i = 0; i < path.getLength(); i++) {
63
+ const point = path.getAt(i);
64
+ pathArray.push(point);
65
+ bounds.extend(point);
66
+ }
67
+ // 폴리곤 분석 및 최적 배치 계산
68
+ const polygonAnalysis = analyzePolygonForPanelLayout(pathArray, bounds, area);
69
+ let rotationData = {
70
+ rotationAngle: polygonAnalysis.optimalRotation,
71
+ center: polygonAnalysis.center,
72
+ edges: polygonAnalysis.edges,
73
+ dimensions: polygonAnalysis.dimensions,
74
+ isRectangular: polygonAnalysis.isRectangular,
75
+ gridPoints: polygonAnalysis.gridPoints,
76
+ validPanelPositions: polygonAnalysis.validPanelPositions,
77
+ };
78
+ // 패널 크기 (미터 단위)
79
+ const panelWidthM = exports.SOLAR_PANEL_SPECS.WIDTH_MM / 1000;
80
+ const panelHeightM = exports.SOLAR_PANEL_SPECS.HEIGHT_MM / 1000;
81
+ // 새로운 그리드 기반 분석 결과 사용
82
+ const finalTotalPanels = polygonAnalysis.totalValidPanels;
83
+ // 그리드 정보로부터 rows/columns 계산 (근사치)
84
+ const validPositions = polygonAnalysis.validPanelPositions;
85
+ const gridRows = validPositions.length > 0
86
+ ? Math.max(...validPositions.map((p) => p.row)) + 1
87
+ : 0;
88
+ const gridColumns = validPositions.length > 0
89
+ ? Math.max(...validPositions.map((p) => p.col)) + 1
90
+ : 0;
91
+ // 항상 landscape 방향 사용 (실제 설치에서는 landscape가 일반적)
92
+ const orientation = 'landscape';
93
+ // 패널 간격 계산 (가로: 패널 크기 그대로, 세로: 패널크기 + 803mm 이격거리)
94
+ const panelSpacing = {
95
+ x: panelWidthM, // 가로는 패널 크기 그대로 (이격거리 없음)
96
+ y: panelHeightM + exports.SOLAR_PANEL_SPECS.HORIZONTAL_SPACING_MM / 1000, // 패널 크기 + 803mm 이격거리
97
+ };
98
+ // 용량 계산 (kW)
99
+ const capacity = (finalTotalPanels * exports.SOLAR_PANEL_SPECS.CAPACITY_W) / 1000;
100
+ // totalPanels가 0인 경우 rows, columns도 0으로 설정
101
+ if (finalTotalPanels === 0) {
102
+ return {
103
+ totalPanels: 0,
104
+ rows: 0,
105
+ columns: 0,
106
+ orientation,
107
+ efficiency: 1,
108
+ capacity: 0,
109
+ area: area, // 면적 추가 (m²)
110
+ rotationAngle: rotationData.rotationAngle,
111
+ center: rotationData.center,
112
+ edges: rotationData.edges,
113
+ dimensions: rotationData.dimensions,
114
+ panelSpacing,
115
+ isRectangular: rotationData.isRectangular,
116
+ gridPoints: rotationData.gridPoints,
117
+ validPanelPositions: rotationData.validPanelPositions,
118
+ };
119
+ }
120
+ else {
121
+ return {
122
+ totalPanels: finalTotalPanels,
123
+ rows: gridRows,
124
+ columns: gridColumns,
125
+ orientation,
126
+ efficiency: 1,
127
+ capacity,
128
+ area: area, // 면적 추가 (m²)
129
+ rotationAngle: rotationData.rotationAngle,
130
+ center: rotationData.center,
131
+ edges: rotationData.edges,
132
+ dimensions: rotationData.dimensions,
133
+ panelSpacing,
134
+ isRectangular: rotationData.isRectangular,
135
+ gridPoints: rotationData.gridPoints,
136
+ validPanelPositions: rotationData.validPanelPositions,
137
+ };
138
+ }
139
+ };
140
+ exports.calculatePanelLayoutFromPolygon = calculatePanelLayoutFromPolygon;
141
+ /**
142
+ * 하위 호환성을 위한 기존 함수
143
+ */
144
+ const calculatePanelCountFromPolygon = (polygon) => {
145
+ return (0, exports.calculatePanelLayoutFromPolygon)(polygon).totalPanels;
146
+ };
147
+ exports.calculatePanelCountFromPolygon = calculatePanelCountFromPolygon;
148
+ /**
149
+ * 폴리곤 geometry를 기반으로 실제 배치 가능한 패널 개수를 계산합니다. (하위 호환성 유지)
150
+ * @param polygonGeometry 폴리곤 좌표 배열
151
+ * @returns 배치 가능한 패널 개수 (정수)
152
+ */
153
+ const calculatePanelCountFromGeometry = (polygonGeometry) => {
154
+ var _a;
155
+ if (polygonGeometry.length < 3 || !((_a = window.google) === null || _a === void 0 ? void 0 : _a.maps))
156
+ return 0;
157
+ // geometry를 Google Maps Polygon으로 변환
158
+ const path = polygonGeometry.map((point) => new google.maps.LatLng(point.lat, point.lng));
159
+ const polygon = new google.maps.Polygon({ paths: path });
160
+ return (0, exports.calculatePanelCountFromPolygon)(polygon);
161
+ };
162
+ exports.calculatePanelCountFromGeometry = calculatePanelCountFromGeometry;
163
+ /**
164
+ * 주어진 공간에서 상세한 패널 배치 정보를 계산합니다.
165
+ */
166
+ const calculateDetailedPanelLayout = (spaceWidth, spaceHeight, panelWidth, panelHeight) => {
167
+ // 공간이 패널보다 작으면 배치 불가
168
+ if (spaceWidth < panelWidth || spaceHeight < panelHeight) {
169
+ return { totalPanels: 0, rows: 0, columns: 0 };
170
+ }
171
+ const columns = Math.floor(spaceWidth / panelWidth);
172
+ const rows = Math.floor(spaceHeight / panelHeight);
173
+ const totalPanels = columns * rows;
174
+ // 추가 안전장치: 계산된 값이 0 이하인 경우 모두 0으로 처리
175
+ if (totalPanels <= 0 || columns <= 0 || rows <= 0) {
176
+ return { totalPanels: 0, rows: 0, columns: 0 };
177
+ }
178
+ return { totalPanels, rows, columns };
179
+ };
180
+ /**
181
+ * 폴리곤 모양을 분석하여 최적의 패널 배치 정보를 계산합니다.
182
+ */
183
+ const analyzePolygonForPanelLayout = (pathArray, bounds, area) => {
184
+ const vertices = pathArray.map((point) => ({
185
+ lat: point.lat(),
186
+ lng: point.lng(),
187
+ }));
188
+ // 중심점 계산
189
+ const centerLat = vertices.reduce((sum, v) => sum + v.lat, 0) / vertices.length;
190
+ const centerLng = vertices.reduce((sum, v) => sum + v.lng, 0) / vertices.length;
191
+ const center = { lat: centerLat, lng: centerLng };
192
+ // 변(edge) 정보 계산
193
+ const edges = [];
194
+ for (let i = 0; i < vertices.length; i++) {
195
+ const current = vertices[i];
196
+ const next = vertices[(i + 1) % vertices.length];
197
+ const distance = google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(current.lat, current.lng), new google.maps.LatLng(next.lat, next.lng));
198
+ const angle = Math.atan2(next.lat - current.lat, next.lng - current.lng);
199
+ edges.push({ from: current, to: next, distance, angle, index: i });
200
+ }
201
+ // 주요 방향 분석 (가장 긴 변들의 각도)
202
+ const sortedEdges = [...edges].sort((a, b) => b.distance - a.distance);
203
+ const dominantAngles = sortedEdges
204
+ .slice(0, Math.min(2, sortedEdges.length))
205
+ .map((e) => e.angle);
206
+ // 최적 회전 각도 결정 (주요 변에 평행하게)
207
+ let optimalRotation = dominantAngles[0] || 0;
208
+ // 사각형 여부 판단 (4개 꼭짓점이고 대변이 평행한지 확인)
209
+ const isRectangular = vertices.length === 4 && isApproximatelyRectangular(edges);
210
+ // 바운딩 박스 계산
211
+ const ne = bounds.getNorthEast();
212
+ const sw = bounds.getSouthWest();
213
+ const nw = new google.maps.LatLng(ne.lat(), sw.lng());
214
+ const boundingWidth = google.maps.geometry.spherical.computeDistanceBetween(nw, ne);
215
+ const boundingHeight = google.maps.geometry.spherical.computeDistanceBetween(sw, nw);
216
+ // 패널 크기
217
+ const panelWidthM = exports.SOLAR_PANEL_SPECS.WIDTH_MM / 1000;
218
+ const panelHeightM = exports.SOLAR_PANEL_SPECS.HEIGHT_MM / 1000;
219
+ // 최적의 패널 배치를 위한 자유 회전 검색
220
+ let bestAnalysis = null;
221
+ let bestCount = 0;
222
+ let bestRotation = optimalRotation;
223
+ // 자유 회전 각도 검색 (1도 간격으로 정밀하게)
224
+ const searchRanges = [
225
+ { start: 0, end: Math.PI / 4 }, // 0-45도
226
+ { start: (3 * Math.PI) / 4, end: Math.PI }, // 135-180도
227
+ ];
228
+ searchRanges.forEach((range, rangeIndex) => {
229
+ const stepSize = Math.PI / 180; // 1도 간격 (π/180 = 1도)
230
+ const steps = Math.ceil((range.end - range.start) / stepSize);
231
+ for (let i = 0; i <= steps; i++) {
232
+ const testAngle = range.start + i * stepSize;
233
+ // 범위를 벗어나지 않도록 보정
234
+ if (testAngle > range.end)
235
+ continue;
236
+ const analysis = calculateOptimalGridLayout(vertices, center, testAngle, panelWidthM, // 무조건 landscape 방향 (가로가 더 긴 방향)
237
+ panelHeightM, boundingWidth, boundingHeight);
238
+ if (analysis.validPositions.length > bestCount) {
239
+ bestCount = analysis.validPositions.length;
240
+ bestAnalysis = Object.assign(Object.assign({}, analysis), { orientation: 'landscape' });
241
+ bestRotation = testAngle;
242
+ }
243
+ }
244
+ });
245
+ // 원래 계산된 각도도 테스트 (최적 범위 밖에 있을 수 있음)
246
+ const originalAnalysis = calculateOptimalGridLayout(vertices, center, optimalRotation, panelWidthM, panelHeightM, boundingWidth, boundingHeight);
247
+ if (originalAnalysis.validPositions.length > bestCount) {
248
+ bestCount = originalAnalysis.validPositions.length;
249
+ bestAnalysis = Object.assign(Object.assign({}, originalAnalysis), { orientation: 'landscape' });
250
+ bestRotation = optimalRotation;
251
+ }
252
+ // 최적 각도를 찾지 못한 경우 원래 각도 사용
253
+ if (!bestAnalysis) {
254
+ bestAnalysis = Object.assign(Object.assign({}, calculateOptimalGridLayout(vertices, center, optimalRotation, panelWidthM, panelHeightM, boundingWidth, boundingHeight)), { orientation: 'landscape' });
255
+ bestRotation = optimalRotation;
256
+ }
257
+ return {
258
+ center,
259
+ edges,
260
+ dimensions: { width: boundingWidth, height: boundingHeight },
261
+ isRectangular,
262
+ optimalRotation: bestRotation, // 최적화된 회전 각도 사용
263
+ gridPoints: bestAnalysis.gridPoints,
264
+ validPanelPositions: bestAnalysis.validPositions,
265
+ totalValidPanels: bestAnalysis.validPositions.length,
266
+ optimalOrientation: bestAnalysis.orientation,
267
+ };
268
+ };
269
+ /**
270
+ * 사각형인지 대략적으로 판단 (대변의 길이가 비슷하고 인접변이 수직인지)
271
+ */
272
+ const isApproximatelyRectangular = (edges) => {
273
+ if (edges.length !== 4)
274
+ return false;
275
+ // 대변의 길이가 비슷한지 확인 (10% 오차 허용)
276
+ const lengths = edges.map((e) => e.distance);
277
+ const opposite1 = Math.abs(lengths[0] - lengths[2]) / Math.max(lengths[0], lengths[2]);
278
+ const opposite2 = Math.abs(lengths[1] - lengths[3]) / Math.max(lengths[1], lengths[3]);
279
+ return opposite1 < 0.1 && opposite2 < 0.1;
280
+ };
281
+ /**
282
+ * 그리드 기반으로 폴리곤 내부에 배치 가능한 패널 위치를 계산합니다.
283
+ */
284
+ const calculateOptimalGridLayout = (vertices, center, rotation, panelWidth, panelHeight, boundingWidth, boundingHeight) => {
285
+ const validPositions = [];
286
+ const gridPoints = [];
287
+ // 그리드 간격 계산 (가로: 패널 크기 그대로, 세로: 패널크기 + 803mm 이격거리)
288
+ const spacingX = panelWidth; // 가로는 패널 크기 그대로 (이격거리 없음)
289
+ const spacingY = panelHeight + exports.SOLAR_PANEL_SPECS.HORIZONTAL_SPACING_MM / 1000; // 패널 크기 + 803mm 이격거리
290
+ // 그리드 범위 계산
291
+ const cols = Math.floor(boundingWidth / spacingX);
292
+ const rows = Math.floor(boundingHeight / spacingY);
293
+ // 각 그리드 포인트에서 패널이 폴리곤 내부에 완전히 들어가는지 확인
294
+ for (let row = 0; row < rows; row++) {
295
+ for (let col = 0; col < cols; col++) {
296
+ // 그리드상의 패널 중심 좌표
297
+ const relativeX = (col + 0.5) * spacingX - boundingWidth / 2;
298
+ const relativeY = boundingHeight / 2 - (row + 0.5) * spacingY;
299
+ // 회전 적용
300
+ const cos = Math.cos(rotation);
301
+ const sin = Math.sin(rotation);
302
+ const rotatedX = relativeX * cos - relativeY * sin;
303
+ const rotatedY = relativeX * sin + relativeY * cos;
304
+ // 실제 지도 좌표로 변환
305
+ const panelCenterLat = center.lat + rotatedY / 111320;
306
+ const panelCenterLng = center.lng +
307
+ rotatedX / (111320 * Math.cos((center.lat * Math.PI) / 180));
308
+ const gridPoint = {
309
+ row,
310
+ col,
311
+ lat: panelCenterLat,
312
+ lng: panelCenterLng,
313
+ relativeX: rotatedX,
314
+ relativeY: rotatedY,
315
+ };
316
+ gridPoints.push(gridPoint);
317
+ // 패널의 4개 모서리가 모두 폴리곤 내부에 있는지 확인
318
+ if (isPanelCompletelyInsidePolygon(panelCenterLat, panelCenterLng, panelWidth, panelHeight, rotation, vertices)) {
319
+ validPositions.push(gridPoint);
320
+ }
321
+ }
322
+ }
323
+ return { gridPoints, validPositions };
324
+ };
325
+ /**
326
+ * 패널이 폴리곤 내부에 완전히 포함되는지 확인
327
+ */
328
+ const isPanelCompletelyInsidePolygon = (centerLat, centerLng, panelWidth, panelHeight, rotation, vertices) => {
329
+ const halfWidth = panelWidth / 2;
330
+ const halfHeight = panelHeight / 2;
331
+ // 패널의 4개 모서리 계산
332
+ const corners = [
333
+ { x: -halfWidth, y: -halfHeight },
334
+ { x: halfWidth, y: -halfHeight },
335
+ { x: halfWidth, y: halfHeight },
336
+ { x: -halfWidth, y: halfHeight },
337
+ ];
338
+ const cos = Math.cos(rotation);
339
+ const sin = Math.sin(rotation);
340
+ // 모든 모서리가 폴리곤 내부에 있는지 확인
341
+ for (const corner of corners) {
342
+ const rotatedX = corner.x * cos - corner.y * sin;
343
+ const rotatedY = corner.x * sin + corner.y * cos;
344
+ const cornerLat = centerLat + rotatedY / 111320;
345
+ const cornerLng = centerLng + rotatedX / (111320 * Math.cos((centerLat * Math.PI) / 180));
346
+ if (!isPointInsidePolygon(cornerLat, cornerLng, vertices)) {
347
+ return false;
348
+ }
349
+ }
350
+ return true;
351
+ };
352
+ /**
353
+ * 점이 폴리곤 내부에 있는지 확인 (Ray casting algorithm)
354
+ */
355
+ const isPointInsidePolygon = (lat, lng, vertices) => {
356
+ let inside = false;
357
+ const n = vertices.length;
358
+ for (let i = 0, j = n - 1; i < n; j = i++) {
359
+ const xi = vertices[i].lng;
360
+ const yi = vertices[i].lat;
361
+ const xj = vertices[j].lng;
362
+ const yj = vertices[j].lat;
363
+ if (yi > lat !== yj > lat &&
364
+ lng < ((xj - xi) * (lat - yi)) / (yj - yi) + xi) {
365
+ inside = !inside;
366
+ }
367
+ }
368
+ return inside;
369
+ };
370
+ /**
371
+ * Google Maps API를 활용한 폴리곤 형태 효율성 계산
372
+ */
373
+ const calculatePolygonShapeEfficiency = (pathArray, bounds, actualArea) => {
374
+ // 바운딩 박스 면적 계산
375
+ const ne = bounds.getNorthEast();
376
+ const sw = bounds.getSouthWest();
377
+ const nw = new google.maps.LatLng(ne.lat(), sw.lng());
378
+ const se = new google.maps.LatLng(sw.lat(), ne.lng());
379
+ const boundingBoxCorners = [sw, nw, ne, se];
380
+ const boundingBoxArea = google.maps.geometry.spherical.computeArea(boundingBoxCorners);
381
+ // 폴리곤이 바운딩 박스를 채우는 비율
382
+ const fillRatio = actualArea / boundingBoxArea;
383
+ // 폴리곤의 복잡성 계산 (꼭짓점 개수에 따른 복잡성)
384
+ let complexity = 1.0;
385
+ if (pathArray.length === 3) {
386
+ // 삼각형: 효율성 낮음
387
+ complexity = 0.6;
388
+ }
389
+ else if (pathArray.length === 4) {
390
+ // 사각형: 가장 효율적
391
+ complexity = 1.0;
392
+ }
393
+ else if (pathArray.length <= 6) {
394
+ // 5-6각형: 중간 효율성
395
+ complexity = 0.8;
396
+ }
397
+ else {
398
+ // 복잡한 다각형: 효율성 감소
399
+ complexity = 0.7;
400
+ }
401
+ // 종횡비 계산 (정사각형에 가까울수록 효율적)
402
+ const widthM = google.maps.geometry.spherical.computeDistanceBetween(nw, ne);
403
+ const heightM = google.maps.geometry.spherical.computeDistanceBetween(sw, nw);
404
+ const aspectRatio = Math.min(widthM / heightM, heightM / widthM);
405
+ // 최종 효율성 = 채움비율 × 형태복잡성 × 종횡비 × 일반적인 설치 효율성
406
+ return fillRatio * complexity * aspectRatio * 1;
407
+ };
408
+ /**
409
+ * 기존 면적 기반 계산 (하위 호환성 유지)
410
+ * @param areaM2 사용 가능한 면적 (m²)
411
+ * @returns 배치 가능한 패널 개수 (정수, 소수점 버림)
412
+ */
413
+ const calculatePanelCount = (areaM2) => {
414
+ // 패널 1개당 필요한 면적 (mm² → m²)
415
+ const panelAreaM2 = (exports.SOLAR_PANEL_SPECS.WIDTH_MM * exports.SOLAR_PANEL_SPECS.HEIGHT_MM) / 1000000;
416
+ // 설치 간격을 고려한 실제 필요 면적
417
+ const requiredAreaPerPanel = panelAreaM2 * exports.SOLAR_PANEL_SPECS.SPACING_FACTOR;
418
+ // 배치 가능한 패널 개수 (소수점 버림)
419
+ return Math.floor(areaM2 / requiredAreaPerPanel);
420
+ };
421
+ exports.calculatePanelCount = calculatePanelCount;
422
+ /**
423
+ * 패널 개수로부터 총 용량을 계산합니다. (하위 호환성 유지)
424
+ * @param panelCount 패널 개수
425
+ * @returns 총 용량 (kW)
426
+ */
427
+ const calculateTotalCapacity = (panelCount) => {
428
+ return (panelCount * exports.SOLAR_PANEL_SPECS.CAPACITY_W) / 1000; // W → kW 변환
429
+ };
430
+ exports.calculateTotalCapacity = calculateTotalCapacity;
431
+ /**
432
+ * 면적으로부터 직접 총 용량을 계산합니다.
433
+ * @param areaM2 사용 가능한 면적 (m²)
434
+ * @returns 총 용량 (kW)
435
+ */
436
+ const calculateCapacityFromArea = (areaM2) => {
437
+ const panelCount = (0, exports.calculatePanelCount)(areaM2);
438
+ return (0, exports.calculateTotalCapacity)(panelCount);
439
+ };
440
+ exports.calculateCapacityFromArea = calculateCapacityFromArea;
441
+ /**
442
+ * 패널 1개당 실제 필요한 면적을 반환합니다. (설치 간격 포함)
443
+ * @returns 패널 1개당 필요 면적 (m²)
444
+ */
445
+ const getPanelRequiredArea = () => {
446
+ const panelAreaM2 = (exports.SOLAR_PANEL_SPECS.WIDTH_MM * exports.SOLAR_PANEL_SPECS.HEIGHT_MM) / 1000000;
447
+ return panelAreaM2 * exports.SOLAR_PANEL_SPECS.SPACING_FACTOR;
448
+ };
449
+ exports.getPanelRequiredArea = getPanelRequiredArea;
450
+ //# sourceMappingURL=solar-panel-calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solar-panel-calculator.js","sourceRoot":"","sources":["../../src/lib/solar-panel-calculator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zurigo/maps",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Reusable Google Maps components for solar panel projects",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -11,7 +11,7 @@
11
11
  "build": "tsc",
12
12
  "dev": "tsc --watch",
13
13
  "clean": "rm -rf dist",
14
- "prepublishOnly": "npm run clean && npm run build",
14
+ "prepublishOnly": "npm run clean && rm -f tsconfig.tsbuildinfo && npm run build",
15
15
  "test": "echo \"Error: no test specified\" && exit 1"
16
16
  },
17
17
  "keywords": [