@zurigo/maps 1.0.0 → 1.0.1
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/error-display.d.ts +33 -0
- package/dist/components/error-display.d.ts.map +1 -0
- package/dist/components/error-display.js +188 -0
- package/dist/components/error-display.js.map +1 -0
- package/dist/components/google-maps.d.ts +31 -0
- package/dist/components/google-maps.d.ts.map +1 -0
- package/dist/components/google-maps.js +1763 -0
- package/dist/components/google-maps.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/google-maps/china-fallback.d.ts +64 -0
- package/dist/lib/google-maps/china-fallback.d.ts.map +1 -0
- package/dist/lib/google-maps/china-fallback.js +212 -0
- package/dist/lib/google-maps/china-fallback.js.map +1 -0
- package/dist/lib/google-maps/config.d.ts +51 -0
- package/dist/lib/google-maps/config.d.ts.map +1 -0
- package/dist/lib/google-maps/config.js +73 -0
- package/dist/lib/google-maps/config.js.map +1 -0
- package/dist/lib/google-maps/error-handler.d.ts +30 -0
- package/dist/lib/google-maps/error-handler.d.ts.map +1 -0
- package/dist/lib/google-maps/error-handler.js +224 -0
- package/dist/lib/google-maps/error-handler.js.map +1 -0
- package/dist/lib/google-maps/geocoding-service.d.ts +47 -0
- package/dist/lib/google-maps/geocoding-service.d.ts.map +1 -0
- package/dist/lib/google-maps/geocoding-service.js +224 -0
- package/dist/lib/google-maps/geocoding-service.js.map +1 -0
- package/dist/lib/google-maps/hooks.d.ts +35 -0
- package/dist/lib/google-maps/hooks.d.ts.map +1 -0
- package/dist/lib/google-maps/hooks.js +207 -0
- package/dist/lib/google-maps/hooks.js.map +1 -0
- package/dist/lib/google-maps/index.d.ts +7 -0
- package/dist/lib/google-maps/index.d.ts.map +1 -0
- package/dist/lib/google-maps/index.js +23 -0
- package/dist/lib/google-maps/index.js.map +1 -0
- package/dist/lib/google-maps/types.d.ts +96 -0
- package/dist/lib/google-maps/types.d.ts.map +1 -0
- package/dist/lib/google-maps/types.js +41 -0
- package/dist/lib/google-maps/types.js.map +1 -0
- package/dist/lib/google-maps/utils.d.ts +20 -0
- package/dist/lib/google-maps/utils.d.ts.map +1 -0
- package/dist/lib/google-maps/utils.js +176 -0
- package/dist/lib/google-maps/utils.js.map +1 -0
- package/dist/lib/solar-panel/constraints.d.ts +62 -0
- package/dist/lib/solar-panel/constraints.d.ts.map +1 -0
- package/dist/lib/solar-panel/constraints.js +166 -0
- package/dist/lib/solar-panel/constraints.js.map +1 -0
- package/dist/lib/solar-panel/orientation.d.ts +56 -0
- package/dist/lib/solar-panel/orientation.d.ts.map +1 -0
- package/dist/lib/solar-panel/orientation.js +255 -0
- package/dist/lib/solar-panel/orientation.js.map +1 -0
- package/dist/lib/solar-panel-calculator.d.ts +126 -0
- package/dist/lib/solar-panel-calculator.d.ts.map +1 -0
- package/dist/lib/solar-panel-calculator.js +450 -0
- package/dist/lib/solar-panel-calculator.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface MapError {
|
|
2
|
+
type: 'MAPS_LOAD_ERROR' | 'GEOCODING_ERROR' | 'API_KEY_ERROR' | 'NETWORK_ERROR' | 'RATE_LIMIT_ERROR' | 'UNKNOWN_ERROR';
|
|
3
|
+
message: string;
|
|
4
|
+
code?: string;
|
|
5
|
+
details?: any;
|
|
6
|
+
retryable: boolean;
|
|
7
|
+
userMessage: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class GoogleMapsErrorHandler {
|
|
10
|
+
private static errorMap;
|
|
11
|
+
static handleError(error: any): MapError;
|
|
12
|
+
private static isGeocodingError;
|
|
13
|
+
static getRetryDelay(attemptNumber: number): number;
|
|
14
|
+
static shouldRetry(error: MapError, attemptNumber: number, maxRetries?: number): boolean;
|
|
15
|
+
static formatErrorForLogging(error: MapError): Record<string, any>;
|
|
16
|
+
}
|
|
17
|
+
export declare class RetryableGeocodingService {
|
|
18
|
+
private maxRetries;
|
|
19
|
+
private baseDelay;
|
|
20
|
+
constructor(maxRetries?: number, baseDelay?: number);
|
|
21
|
+
executeWithRetry<T>(operation: () => Promise<T>, onRetry?: (error: MapError, attempt: number) => void): Promise<T>;
|
|
22
|
+
}
|
|
23
|
+
export declare const withErrorHandling: <T extends any[], R>(fn: (...args: T) => Promise<R>, options?: {
|
|
24
|
+
maxRetries?: number;
|
|
25
|
+
onError?: (error: MapError) => void;
|
|
26
|
+
onRetry?: (error: MapError, attempt: number) => void;
|
|
27
|
+
}) => (...args: T) => Promise<R>;
|
|
28
|
+
export declare const isRetryableError: (error: any) => boolean;
|
|
29
|
+
export declare const getErrorUserMessage: (error: any) => string;
|
|
30
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../../src/lib/google-maps/error-handler.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,IAAI,EACA,iBAAiB,GACjB,iBAAiB,GACjB,eAAe,GACf,eAAe,GACf,kBAAkB,GAClB,eAAe,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,GAAG,CAAA;IACb,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAwEtB;IAED,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,QAAQ;IAmFxC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAQ/B,MAAM,CAAC,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAKnD,MAAM,CAAC,WAAW,CAChB,KAAK,EAAE,QAAQ,EACf,aAAa,EAAE,MAAM,EACrB,UAAU,GAAE,MAAU,GACrB,OAAO;IAIV,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAgBnE;AAED,qBAAa,yBAAyB;IACpC,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,SAAS,CAAQ;gBAEb,UAAU,GAAE,MAAU,EAAE,SAAS,GAAE,MAAa;IAKtD,gBAAgB,CAAC,CAAC,EACtB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GACnD,OAAO,CAAC,CAAC,CAAC;CAqCd;AAGD,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EAClD,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAC9B,UAAS;IACP,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAChD,MAIQ,GAAG,MAAM,CAAC,KAAG,OAAO,CAAC,CAAC,CAYrC,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,OAAO,GAAG,KAAG,OAG7C,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,OAAO,GAAG,KAAG,MAGhD,CAAA"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getErrorUserMessage = exports.isRetryableError = exports.withErrorHandling = exports.RetryableGeocodingService = exports.GoogleMapsErrorHandler = void 0;
|
|
4
|
+
class GoogleMapsErrorHandler {
|
|
5
|
+
static handleError(error) {
|
|
6
|
+
// Handle Google Maps API errors
|
|
7
|
+
if (typeof error === 'string' && this.errorMap[error]) {
|
|
8
|
+
return Object.assign({ type: 'UNKNOWN_ERROR', message: error, retryable: false, userMessage: '发生未知错误' }, this.errorMap[error]);
|
|
9
|
+
}
|
|
10
|
+
// Handle Error objects
|
|
11
|
+
if (error instanceof Error) {
|
|
12
|
+
const errorName = error.name || error.constructor.name;
|
|
13
|
+
const errorMessage = error.message || 'Unknown error';
|
|
14
|
+
// Check if it's a known error type
|
|
15
|
+
if (this.errorMap[errorName]) {
|
|
16
|
+
return Object.assign(Object.assign({ type: 'UNKNOWN_ERROR', message: errorMessage, retryable: false, userMessage: '发生未知错误' }, this.errorMap[errorName]), { details: error });
|
|
17
|
+
}
|
|
18
|
+
// Check message for common patterns
|
|
19
|
+
if (errorMessage.includes('API key')) {
|
|
20
|
+
return {
|
|
21
|
+
type: 'API_KEY_ERROR',
|
|
22
|
+
message: errorMessage,
|
|
23
|
+
userMessage: 'API密钥配置问题',
|
|
24
|
+
retryable: false,
|
|
25
|
+
details: error,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (errorMessage.includes('network') || errorMessage.includes('fetch')) {
|
|
29
|
+
return {
|
|
30
|
+
type: 'NETWORK_ERROR',
|
|
31
|
+
message: errorMessage,
|
|
32
|
+
userMessage: '网络连接问题,请重试',
|
|
33
|
+
retryable: true,
|
|
34
|
+
details: error,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (errorMessage.includes('quota') || errorMessage.includes('limit')) {
|
|
38
|
+
return {
|
|
39
|
+
type: 'RATE_LIMIT_ERROR',
|
|
40
|
+
message: errorMessage,
|
|
41
|
+
userMessage: '请求频率过高,请稍后重试',
|
|
42
|
+
retryable: true,
|
|
43
|
+
details: error,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Handle GeocodingError
|
|
48
|
+
if (this.isGeocodingError(error)) {
|
|
49
|
+
return {
|
|
50
|
+
type: 'GEOCODING_ERROR',
|
|
51
|
+
message: error.message,
|
|
52
|
+
code: error.code,
|
|
53
|
+
userMessage: error.message, // GeocodingError already has Chinese messages
|
|
54
|
+
retryable: error.code === 'OVER_QUERY_LIMIT',
|
|
55
|
+
details: error,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Default unknown error
|
|
59
|
+
return {
|
|
60
|
+
type: 'UNKNOWN_ERROR',
|
|
61
|
+
message: typeof error === 'string' ? error : 'Unknown error occurred',
|
|
62
|
+
userMessage: '发生未知错误,请重试',
|
|
63
|
+
retryable: false,
|
|
64
|
+
details: error,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
static isGeocodingError(error) {
|
|
68
|
+
return (error &&
|
|
69
|
+
typeof error.code === 'string' &&
|
|
70
|
+
typeof error.status !== 'undefined');
|
|
71
|
+
}
|
|
72
|
+
static getRetryDelay(attemptNumber) {
|
|
73
|
+
// Exponential backoff: 1s, 2s, 4s, 8s, 16s
|
|
74
|
+
return Math.min(1000 * Math.pow(2, attemptNumber), 16000);
|
|
75
|
+
}
|
|
76
|
+
static shouldRetry(error, attemptNumber, maxRetries = 3) {
|
|
77
|
+
return error.retryable && attemptNumber < maxRetries;
|
|
78
|
+
}
|
|
79
|
+
static formatErrorForLogging(error) {
|
|
80
|
+
return {
|
|
81
|
+
type: error.type,
|
|
82
|
+
message: error.message,
|
|
83
|
+
code: error.code,
|
|
84
|
+
retryable: error.retryable,
|
|
85
|
+
timestamp: new Date().toISOString(),
|
|
86
|
+
details: error.details
|
|
87
|
+
? {
|
|
88
|
+
name: error.details.name,
|
|
89
|
+
message: error.details.message,
|
|
90
|
+
stack: error.details.stack,
|
|
91
|
+
}
|
|
92
|
+
: undefined,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.GoogleMapsErrorHandler = GoogleMapsErrorHandler;
|
|
97
|
+
GoogleMapsErrorHandler.errorMap = {
|
|
98
|
+
// Google Maps loading errors
|
|
99
|
+
InvalidKeyMapError: {
|
|
100
|
+
type: 'API_KEY_ERROR',
|
|
101
|
+
message: 'Google Maps API key is invalid',
|
|
102
|
+
userMessage: 'API密钥配置错误,请联系系统管理员',
|
|
103
|
+
retryable: false,
|
|
104
|
+
},
|
|
105
|
+
RefererNotAllowedMapError: {
|
|
106
|
+
type: 'API_KEY_ERROR',
|
|
107
|
+
message: 'Current domain is not authorized for this API key',
|
|
108
|
+
userMessage: '当前域名未授权使用此API密钥',
|
|
109
|
+
retryable: false,
|
|
110
|
+
},
|
|
111
|
+
ProjectDeniedMapError: {
|
|
112
|
+
type: 'API_KEY_ERROR',
|
|
113
|
+
message: 'Project denied access to Google Maps API',
|
|
114
|
+
userMessage: '项目无权访问Google Maps API',
|
|
115
|
+
retryable: false,
|
|
116
|
+
},
|
|
117
|
+
BillingNotEnabledMapError: {
|
|
118
|
+
type: 'API_KEY_ERROR',
|
|
119
|
+
message: 'Billing must be enabled on the Google Cloud Project',
|
|
120
|
+
userMessage: '需要启用Google Cloud项目的账单功能',
|
|
121
|
+
retryable: false,
|
|
122
|
+
},
|
|
123
|
+
ApiNotActivatedMapError: {
|
|
124
|
+
type: 'API_KEY_ERROR',
|
|
125
|
+
message: 'Google Maps API is not activated',
|
|
126
|
+
userMessage: 'Google Maps API未激活',
|
|
127
|
+
retryable: false,
|
|
128
|
+
},
|
|
129
|
+
// Network and loading errors
|
|
130
|
+
NetworkError: {
|
|
131
|
+
type: 'NETWORK_ERROR',
|
|
132
|
+
message: 'Network connection failed',
|
|
133
|
+
userMessage: '网络连接失败,请检查网络连接',
|
|
134
|
+
retryable: true,
|
|
135
|
+
},
|
|
136
|
+
TimeoutError: {
|
|
137
|
+
type: 'NETWORK_ERROR',
|
|
138
|
+
message: 'Request timed out',
|
|
139
|
+
userMessage: '请求超时,请重试',
|
|
140
|
+
retryable: true,
|
|
141
|
+
},
|
|
142
|
+
// Geocoding specific errors
|
|
143
|
+
ZERO_RESULTS: {
|
|
144
|
+
type: 'GEOCODING_ERROR',
|
|
145
|
+
message: 'No results found',
|
|
146
|
+
userMessage: '未找到匹配的地址,请尝试更详细的地址',
|
|
147
|
+
retryable: false,
|
|
148
|
+
},
|
|
149
|
+
OVER_QUERY_LIMIT: {
|
|
150
|
+
type: 'RATE_LIMIT_ERROR',
|
|
151
|
+
message: 'Query limit exceeded',
|
|
152
|
+
userMessage: '查询次数超过限制,请稍后重试',
|
|
153
|
+
retryable: true,
|
|
154
|
+
},
|
|
155
|
+
REQUEST_DENIED: {
|
|
156
|
+
type: 'API_KEY_ERROR',
|
|
157
|
+
message: 'Request denied',
|
|
158
|
+
userMessage: '请求被拒绝,请检查API配置',
|
|
159
|
+
retryable: false,
|
|
160
|
+
},
|
|
161
|
+
INVALID_REQUEST: {
|
|
162
|
+
type: 'GEOCODING_ERROR',
|
|
163
|
+
message: 'Invalid request',
|
|
164
|
+
userMessage: '请求格式无效,请检查输入',
|
|
165
|
+
retryable: false,
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
class RetryableGeocodingService {
|
|
169
|
+
constructor(maxRetries = 3, baseDelay = 1000) {
|
|
170
|
+
this.maxRetries = maxRetries;
|
|
171
|
+
this.baseDelay = baseDelay;
|
|
172
|
+
}
|
|
173
|
+
async executeWithRetry(operation, onRetry) {
|
|
174
|
+
let lastError = null;
|
|
175
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
176
|
+
try {
|
|
177
|
+
return await operation();
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
const mappedError = GoogleMapsErrorHandler.handleError(error);
|
|
181
|
+
lastError = mappedError;
|
|
182
|
+
// Log error for debugging
|
|
183
|
+
console.error('Operation failed:', GoogleMapsErrorHandler.formatErrorForLogging(mappedError));
|
|
184
|
+
if (!GoogleMapsErrorHandler.shouldRetry(mappedError, attempt, this.maxRetries)) {
|
|
185
|
+
throw mappedError;
|
|
186
|
+
}
|
|
187
|
+
if (attempt < this.maxRetries) {
|
|
188
|
+
const delay = GoogleMapsErrorHandler.getRetryDelay(attempt);
|
|
189
|
+
onRetry === null || onRetry === void 0 ? void 0 : onRetry(mappedError, attempt + 1);
|
|
190
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
throw lastError || new Error('Maximum retries exceeded');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.RetryableGeocodingService = RetryableGeocodingService;
|
|
198
|
+
// Utility functions for common error handling patterns
|
|
199
|
+
const withErrorHandling = (fn, options = {}) => {
|
|
200
|
+
const retryService = new RetryableGeocodingService(options.maxRetries);
|
|
201
|
+
return async (...args) => {
|
|
202
|
+
var _a;
|
|
203
|
+
try {
|
|
204
|
+
return await retryService.executeWithRetry(() => fn(...args), options.onRetry);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
const mappedError = GoogleMapsErrorHandler.handleError(error);
|
|
208
|
+
(_a = options.onError) === null || _a === void 0 ? void 0 : _a.call(options, mappedError);
|
|
209
|
+
throw mappedError;
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
};
|
|
213
|
+
exports.withErrorHandling = withErrorHandling;
|
|
214
|
+
const isRetryableError = (error) => {
|
|
215
|
+
const mappedError = GoogleMapsErrorHandler.handleError(error);
|
|
216
|
+
return mappedError.retryable;
|
|
217
|
+
};
|
|
218
|
+
exports.isRetryableError = isRetryableError;
|
|
219
|
+
const getErrorUserMessage = (error) => {
|
|
220
|
+
const mappedError = GoogleMapsErrorHandler.handleError(error);
|
|
221
|
+
return mappedError.userMessage;
|
|
222
|
+
};
|
|
223
|
+
exports.getErrorUserMessage = getErrorUserMessage;
|
|
224
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../src/lib/google-maps/error-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { GeocodeResult } from './types';
|
|
2
|
+
interface BatchGeocodeRequest {
|
|
3
|
+
addresses: string[];
|
|
4
|
+
onProgress?: (completed: number, total: number) => void;
|
|
5
|
+
maxConcurrent?: number;
|
|
6
|
+
}
|
|
7
|
+
interface BatchGeocodeResult {
|
|
8
|
+
successful: Array<{
|
|
9
|
+
address: string;
|
|
10
|
+
result: GeocodeResult;
|
|
11
|
+
}>;
|
|
12
|
+
failed: Array<{
|
|
13
|
+
address: string;
|
|
14
|
+
error: string;
|
|
15
|
+
}>;
|
|
16
|
+
}
|
|
17
|
+
export declare class GeocodingService {
|
|
18
|
+
private geocoder;
|
|
19
|
+
private cache;
|
|
20
|
+
private readonly cacheTTL;
|
|
21
|
+
constructor();
|
|
22
|
+
private ensureGeocoder;
|
|
23
|
+
private generateCacheKey;
|
|
24
|
+
private getCachedResult;
|
|
25
|
+
private setCachedResult;
|
|
26
|
+
private convertGeocoderError;
|
|
27
|
+
geocodeAddress(address: string, options?: {
|
|
28
|
+
useCache?: boolean;
|
|
29
|
+
region?: string;
|
|
30
|
+
language?: string;
|
|
31
|
+
}): Promise<GeocodeResult[]>;
|
|
32
|
+
reverseGeocode(lat: number, lng: number, options?: {
|
|
33
|
+
useCache?: boolean;
|
|
34
|
+
language?: string;
|
|
35
|
+
}): Promise<GeocodeResult[]>;
|
|
36
|
+
batchGeocode({ addresses, onProgress, maxConcurrent, }: BatchGeocodeRequest): Promise<BatchGeocodeResult>;
|
|
37
|
+
clearCache(): void;
|
|
38
|
+
getCacheSize(): number;
|
|
39
|
+
getCacheStats(): {
|
|
40
|
+
size: number;
|
|
41
|
+
hits: number;
|
|
42
|
+
misses: number;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export declare const geocodingService: GeocodingService;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=geocoding-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geocoding-service.d.ts","sourceRoot":"","sources":["../../../src/lib/google-maps/geocoding-service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,SAAS,CAAA;AAE5D,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvD,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,UAAU,kBAAkB;IAC1B,UAAU,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC,CAAA;IAC7D,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAClD;AAQD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;;IAQ/C,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,oBAAoB;IA6CtB,cAAc,CAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAA;KACb,GACL,OAAO,CAAC,aAAa,EAAE,CAAC;IA0DrB,cAAc,CAClB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;KACb,GACL,OAAO,CAAC,aAAa,EAAE,CAAC;IAoDrB,YAAY,CAAC,EACjB,SAAS,EACT,UAAU,EACV,aAAiB,GAClB,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAoCpD,UAAU,IAAI,IAAI;IAIlB,YAAY,IAAI,MAAM;IAItB,aAAa,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAShE;AAGD,eAAO,MAAM,gBAAgB,kBAAyB,CAAA"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.geocodingService = exports.GeocodingService = void 0;
|
|
5
|
+
const config_1 = require("./config");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
class GeocodingService {
|
|
8
|
+
constructor() {
|
|
9
|
+
var _a;
|
|
10
|
+
this.geocoder = null;
|
|
11
|
+
this.cache = new Map();
|
|
12
|
+
this.cacheTTL = 24 * 60 * 60 * 1000; // 24 hours in milliseconds
|
|
13
|
+
if (typeof window !== 'undefined' && ((_a = window.google) === null || _a === void 0 ? void 0 : _a.maps)) {
|
|
14
|
+
this.geocoder = new google.maps.Geocoder();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
ensureGeocoder() {
|
|
18
|
+
var _a;
|
|
19
|
+
if (!this.geocoder && ((_a = window.google) === null || _a === void 0 ? void 0 : _a.maps)) {
|
|
20
|
+
this.geocoder = new google.maps.Geocoder();
|
|
21
|
+
}
|
|
22
|
+
if (!this.geocoder) {
|
|
23
|
+
throw new Error('Google Maps Geocoder not available');
|
|
24
|
+
}
|
|
25
|
+
return this.geocoder;
|
|
26
|
+
}
|
|
27
|
+
generateCacheKey(address) {
|
|
28
|
+
return `geocode:${address.trim().toLowerCase()}`;
|
|
29
|
+
}
|
|
30
|
+
getCachedResult(address) {
|
|
31
|
+
const cacheKey = this.generateCacheKey(address);
|
|
32
|
+
const cached = this.cache.get(cacheKey);
|
|
33
|
+
if (!cached)
|
|
34
|
+
return null;
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
if (now - cached.timestamp > cached.ttl) {
|
|
37
|
+
this.cache.delete(cacheKey);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
return cached.result;
|
|
41
|
+
}
|
|
42
|
+
setCachedResult(address, result) {
|
|
43
|
+
const cacheKey = this.generateCacheKey(address);
|
|
44
|
+
this.cache.set(cacheKey, {
|
|
45
|
+
result,
|
|
46
|
+
timestamp: Date.now(),
|
|
47
|
+
ttl: this.cacheTTL,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
convertGeocoderError(status) {
|
|
51
|
+
const errorMap = {
|
|
52
|
+
[google.maps.GeocoderStatus.ZERO_RESULTS]: {
|
|
53
|
+
code: 'ZERO_RESULTS',
|
|
54
|
+
message: '未找到匹配的地址结果',
|
|
55
|
+
},
|
|
56
|
+
[google.maps.GeocoderStatus.OVER_QUERY_LIMIT]: {
|
|
57
|
+
code: 'OVER_QUERY_LIMIT',
|
|
58
|
+
message: '查询次数超过限制,请稍后重试',
|
|
59
|
+
},
|
|
60
|
+
[google.maps.GeocoderStatus.REQUEST_DENIED]: {
|
|
61
|
+
code: 'REQUEST_DENIED',
|
|
62
|
+
message: '请求被拒绝,请检查API密钥配置',
|
|
63
|
+
},
|
|
64
|
+
[google.maps.GeocoderStatus.INVALID_REQUEST]: {
|
|
65
|
+
code: 'INVALID_REQUEST',
|
|
66
|
+
message: '请求格式无效',
|
|
67
|
+
},
|
|
68
|
+
[google.maps.GeocoderStatus.UNKNOWN_ERROR]: {
|
|
69
|
+
code: 'UNKNOWN_ERROR',
|
|
70
|
+
message: '发生未知错误,请重试',
|
|
71
|
+
},
|
|
72
|
+
[google.maps.GeocoderStatus.ERROR]: {
|
|
73
|
+
code: 'UNKNOWN_ERROR',
|
|
74
|
+
message: '服务器错误,请重试',
|
|
75
|
+
},
|
|
76
|
+
[google.maps.GeocoderStatus.OK]: {
|
|
77
|
+
code: 'UNKNOWN_ERROR',
|
|
78
|
+
message: '成功',
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
const error = errorMap[status] || errorMap[google.maps.GeocoderStatus.UNKNOWN_ERROR];
|
|
82
|
+
return Object.assign(Object.assign({}, error), { status });
|
|
83
|
+
}
|
|
84
|
+
async geocodeAddress(address, options = {}) {
|
|
85
|
+
if (!(0, config_1.validateApiKey)()) {
|
|
86
|
+
throw new Error('Google Maps API key is not configured');
|
|
87
|
+
}
|
|
88
|
+
if (!address || !address.trim()) {
|
|
89
|
+
throw new Error('Address is required for geocoding');
|
|
90
|
+
}
|
|
91
|
+
const { useCache = true, region = 'cn', language = 'en' } = options;
|
|
92
|
+
// Check cache first
|
|
93
|
+
if (useCache) {
|
|
94
|
+
const cached = this.getCachedResult(address);
|
|
95
|
+
if (cached) {
|
|
96
|
+
return [cached];
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const geocoder = this.ensureGeocoder();
|
|
100
|
+
try {
|
|
101
|
+
const response = await geocoder.geocode({
|
|
102
|
+
address: address.trim(),
|
|
103
|
+
region,
|
|
104
|
+
language,
|
|
105
|
+
});
|
|
106
|
+
if (response.results.length === 0) {
|
|
107
|
+
throw this.convertGeocoderError(google.maps.GeocoderStatus.ZERO_RESULTS);
|
|
108
|
+
}
|
|
109
|
+
// Filter results to China mainland if specified
|
|
110
|
+
const filteredResults = response.results.filter((result) => {
|
|
111
|
+
const location = result.geometry.location;
|
|
112
|
+
return (0, utils_1.isWithinChinaBounds)(location.lat(), location.lng());
|
|
113
|
+
});
|
|
114
|
+
if (filteredResults.length === 0) {
|
|
115
|
+
throw new Error('No results found within China mainland bounds');
|
|
116
|
+
}
|
|
117
|
+
const geocodeResults = filteredResults.map(utils_1.parseGoogleGeocoderResult);
|
|
118
|
+
// Cache the first result
|
|
119
|
+
if (useCache && geocodeResults.length > 0) {
|
|
120
|
+
this.setCachedResult(address, geocodeResults[0]);
|
|
121
|
+
}
|
|
122
|
+
return geocodeResults;
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (error instanceof Error) {
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
throw this.convertGeocoderError(google.maps.GeocoderStatus.UNKNOWN_ERROR);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async reverseGeocode(lat, lng, options = {}) {
|
|
132
|
+
if (!(0, config_1.validateApiKey)()) {
|
|
133
|
+
throw new Error('Google Maps API key is not configured');
|
|
134
|
+
}
|
|
135
|
+
if (!(0, utils_1.isWithinChinaBounds)(lat, lng)) {
|
|
136
|
+
throw new Error('Coordinates are outside China mainland bounds');
|
|
137
|
+
}
|
|
138
|
+
const { useCache = true, language = 'en' } = options;
|
|
139
|
+
const cacheKey = `reverse:${lat.toFixed(6)},${lng.toFixed(6)}`;
|
|
140
|
+
// Check cache first
|
|
141
|
+
if (useCache) {
|
|
142
|
+
const cached = this.cache.get(cacheKey);
|
|
143
|
+
if (cached && Date.now() - cached.timestamp <= cached.ttl) {
|
|
144
|
+
return [cached.result];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const geocoder = this.ensureGeocoder();
|
|
148
|
+
try {
|
|
149
|
+
const response = await geocoder.geocode({
|
|
150
|
+
location: { lat, lng },
|
|
151
|
+
language,
|
|
152
|
+
});
|
|
153
|
+
if (response.results.length === 0) {
|
|
154
|
+
throw this.convertGeocoderError(google.maps.GeocoderStatus.ZERO_RESULTS);
|
|
155
|
+
}
|
|
156
|
+
const geocodeResults = response.results.map(utils_1.parseGoogleGeocoderResult);
|
|
157
|
+
// Cache the first result
|
|
158
|
+
if (useCache && geocodeResults.length > 0) {
|
|
159
|
+
this.cache.set(cacheKey, {
|
|
160
|
+
result: geocodeResults[0],
|
|
161
|
+
timestamp: Date.now(),
|
|
162
|
+
ttl: this.cacheTTL,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
return geocodeResults;
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (error instanceof Error) {
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
throw this.convertGeocoderError(google.maps.GeocoderStatus.UNKNOWN_ERROR);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async batchGeocode({ addresses, onProgress, maxConcurrent = 5, }) {
|
|
175
|
+
const successful = [];
|
|
176
|
+
const failed = [];
|
|
177
|
+
const processAddress = async (address) => {
|
|
178
|
+
try {
|
|
179
|
+
const results = await this.geocodeAddress(address);
|
|
180
|
+
if (results.length > 0) {
|
|
181
|
+
successful.push({ address, result: results[0] });
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
failed.push({ address, error: 'No results found' });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
189
|
+
failed.push({ address, error: errorMessage });
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
// Process addresses in batches
|
|
193
|
+
const batches = [];
|
|
194
|
+
for (let i = 0; i < addresses.length; i += maxConcurrent) {
|
|
195
|
+
batches.push(addresses.slice(i, i + maxConcurrent));
|
|
196
|
+
}
|
|
197
|
+
let completed = 0;
|
|
198
|
+
for (const batch of batches) {
|
|
199
|
+
await Promise.all(batch.map(processAddress));
|
|
200
|
+
completed += batch.length;
|
|
201
|
+
onProgress === null || onProgress === void 0 ? void 0 : onProgress(completed, addresses.length);
|
|
202
|
+
}
|
|
203
|
+
return { successful, failed };
|
|
204
|
+
}
|
|
205
|
+
clearCache() {
|
|
206
|
+
this.cache.clear();
|
|
207
|
+
}
|
|
208
|
+
getCacheSize() {
|
|
209
|
+
return this.cache.size;
|
|
210
|
+
}
|
|
211
|
+
getCacheStats() {
|
|
212
|
+
// This is a simplified version - in a real implementation,
|
|
213
|
+
// you'd track hits and misses
|
|
214
|
+
return {
|
|
215
|
+
size: this.cache.size,
|
|
216
|
+
hits: 0,
|
|
217
|
+
misses: 0,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
exports.GeocodingService = GeocodingService;
|
|
222
|
+
// Export a singleton instance
|
|
223
|
+
exports.geocodingService = new GeocodingService();
|
|
224
|
+
//# sourceMappingURL=geocoding-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geocoding-service.js","sourceRoot":"","sources":["../../../src/lib/google-maps/geocoding-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Loader } from '@googlemaps/js-api-loader';
|
|
2
|
+
import { type GoogleMapsLibrary } from './config';
|
|
3
|
+
interface UseGoogleMapsOptions {
|
|
4
|
+
libraries?: GoogleMapsLibrary[];
|
|
5
|
+
onLoad?: () => void;
|
|
6
|
+
onError?: (error: Error) => void;
|
|
7
|
+
}
|
|
8
|
+
interface UseGoogleMapsReturn {
|
|
9
|
+
isLoaded: boolean;
|
|
10
|
+
isLoading: boolean;
|
|
11
|
+
error: Error | null;
|
|
12
|
+
loader: Loader | null;
|
|
13
|
+
}
|
|
14
|
+
export declare const useGoogleMaps: (options?: UseGoogleMapsOptions) => UseGoogleMapsReturn;
|
|
15
|
+
interface UseGoogleMapOptions extends google.maps.MapOptions {
|
|
16
|
+
onMapLoad?: (map: google.maps.Map) => void;
|
|
17
|
+
onMapError?: (error: Error) => void;
|
|
18
|
+
}
|
|
19
|
+
export declare const useGoogleMap: (containerRef: React.RefObject<HTMLElement | null>, options?: UseGoogleMapOptions) => {
|
|
20
|
+
map: google.maps.Map | null;
|
|
21
|
+
isLoaded: boolean;
|
|
22
|
+
error: Error | null;
|
|
23
|
+
};
|
|
24
|
+
export declare const useGeocode: () => {
|
|
25
|
+
geocodeAddress: (address: string, options?: {
|
|
26
|
+
useCache?: boolean;
|
|
27
|
+
}) => Promise<google.maps.GeocoderResult[]>;
|
|
28
|
+
reverseGeocode: (lat: number, lng: number) => Promise<google.maps.GeocoderResult[]>;
|
|
29
|
+
isGeocoding: boolean;
|
|
30
|
+
isReady: boolean;
|
|
31
|
+
error: Error | null;
|
|
32
|
+
clearError: () => void;
|
|
33
|
+
};
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/lib/google-maps/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAElD,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,UAAU,CAAA;AAYjB,UAAU,oBAAoB;IAC5B,SAAS,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAC/B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAoBD,eAAO,MAAM,aAAa,GACxB,UAAS,oBAAyB,KACjC,mBA0EF,CAAA;AAED,UAAU,mBAAoB,SAAQ,MAAM,CAAC,IAAI,CAAC,UAAU;IAC1D,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAA;IAC1C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACpC;AAED,eAAO,MAAM,YAAY,GACvB,cAAc,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACjD,UAAS,mBAAwB;;;;CAkClC,CAAA;AAED,eAAO,MAAM,UAAU;8BAOR,MAAM,YACL;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,KAC/B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;0BAqC5B,MAAM,OAAO,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;;;;;CA4C1E,CAAA"}
|