@fleet-frontend/mower-maps 0.2.5-beta.20 → 0.2.5-beta.21

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.
@@ -29,6 +29,10 @@ interface CommonContextType {
29
29
  overlayLayout?: Record<string, any> | null;
30
30
  bounds?: any;
31
31
  googleMapStaticApiKey?: string;
32
+ /** Maps Static API URL 签名密钥,见 signGoogleStaticMapUrl 工具 */
33
+ googleMapStaticUrlSigningSecret?: string;
34
+ /** 宿主服务端签名回调(优先于 googleMapStaticUrlSigningSecret) */
35
+ signGoogleStaticMapUrl?: (unsignedUrl: string) => Promise<string> | string;
32
36
  onH5FirstSelectObstaclePoint?: () => void;
33
37
  }
34
38
  export declare const CommonContext: import("react").Context<{
@@ -57,6 +61,8 @@ export declare const CommonContext: import("react").Context<{
57
61
  overlayScale: number;
58
62
  showStraddleBoundaryBorder: boolean;
59
63
  googleMapStaticApiKey: string;
64
+ googleMapStaticUrlSigningSecret: string;
65
+ signGoogleStaticMapUrl: any;
60
66
  onH5FirstSelectObstaclePoint: any;
61
67
  }>;
62
68
  export declare const CommonContextProvider: import("react").Provider<{
@@ -85,6 +91,8 @@ export declare const CommonContextProvider: import("react").Provider<{
85
91
  overlayScale: number;
86
92
  showStraddleBoundaryBorder: boolean;
87
93
  googleMapStaticApiKey: string;
94
+ googleMapStaticUrlSigningSecret: string;
95
+ signGoogleStaticMapUrl: any;
88
96
  onH5FirstSelectObstaclePoint: any;
89
97
  }>;
90
98
  export declare const useCommonContext: () => CommonContextType;
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/context/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,QAAQ,EAAE,SAAS,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,MAAM,EAAE,GAAG,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAC3C,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,4BAA4B,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3C;AAED,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBxB,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAyB,CAAC;AAE5D,eAAO,MAAM,gBAAgB,yBAAqD,CAAC"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/context/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,UAAU,iBAAiB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,QAAQ,EAAE,SAAS,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,MAAM,EAAE,GAAG,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAC3C,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,2DAA2D;IAC3D,+BAA+B,CAAC,EAAE,MAAM,CAAC;IACzC,qDAAqD;IACrD,sBAAsB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAC3E,4BAA4B,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3C;AAED,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwBxB,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAyB,CAAC;AAE5D,eAAO,MAAM,gBAAgB,yBAAqD,CAAC"}
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ export type { PathConfig as DataPathConfig } from './processor';
12
12
  export * from './processor';
13
13
  export { calculateMapGpsCenter, estimateGpsFromMapBounds, getValidGpsBounds, } from './utils/mapBounds';
14
14
  export { restorePointsFormat } from './utils/coordinates';
15
+ export { signGoogleStaticMapUrl, signGoogleStaticMapUrlSync } from './utils/googleStaticMapSign';
15
16
  export { SvgParserNative } from './utils/svgParserNative';
16
17
  export { SCALE_FACTOR } from './config';
17
18
  export { ALL_DIRECTION_SELECTED, MAX_DIRECTION_ANGLE, MIN_DIRECTION_ANGLE } from './config';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAG1E,YAAY,EACV,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,SAAS,EACT,aAAa,GACd,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,YAAY,EACZ,OAAO,EACP,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,YAAY,EACV,OAAO,EACP,MAAM,EACN,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,UAAU,EACV,UAAU,GACX,MAAM,SAAS,CAAC;AAGjB,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtD,YAAY,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhE,cAAc,aAAa,CAAC;AAG5B,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAExE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAG1E,YAAY,EACV,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,SAAS,EACT,aAAa,GACd,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,YAAY,EACZ,OAAO,EACP,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAG1E,YAAY,EACV,OAAO,EACP,MAAM,EACN,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,UAAU,EACV,UAAU,GACX,MAAM,SAAS,CAAC;AAGjB,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtD,YAAY,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhE,cAAc,aAAa,CAAC;AAG5B,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC"}
package/dist/index.esm.js CHANGED
@@ -22691,6 +22691,8 @@ const CommonContext = createContext({
22691
22691
  overlayScale: 1,
22692
22692
  showStraddleBoundaryBorder: true,
22693
22693
  googleMapStaticApiKey: '',
22694
+ googleMapStaticUrlSigningSecret: '',
22695
+ signGoogleStaticMapUrl: undefined,
22694
22696
  onH5FirstSelectObstaclePoint: undefined,
22695
22697
  });
22696
22698
  const CommonContextProvider = CommonContext.Provider;
@@ -23172,6 +23174,167 @@ const MapEditContext = createContext({
23172
23174
  const MapEditContextProvider = MapEditContext.Provider;
23173
23175
  const useMapEditContext = () => useContext(MapEditContext);
23174
23176
 
23177
+ /**
23178
+ * Google Maps Static API 数字签名
23179
+ * @see https://developers.google.com/maps/documentation/maps-static/digital-signature
23180
+ *
23181
+ * 使用纯 JS HMAC-SHA1,兼容 H5 WebView / 非 HTTPS 等无 crypto.subtle 的环境。
23182
+ */
23183
+ /// <reference lib="dom" />
23184
+ function removeWebSafe(encoded) {
23185
+ return encoded.replace(/-/g, '+').replace(/_/g, '/');
23186
+ }
23187
+ function makeWebSafe(encoded) {
23188
+ return encoded.replace(/\+/g, '-').replace(/\//g, '_');
23189
+ }
23190
+ function decodeUrlSigningSecret(secret) {
23191
+ let base64 = removeWebSafe(secret);
23192
+ const remainder = base64.length % 4;
23193
+ if (remainder) {
23194
+ base64 += '='.repeat(4 - remainder);
23195
+ }
23196
+ const binary = globalThis.atob(base64);
23197
+ const bytes = new Uint8Array(binary.length);
23198
+ for (let i = 0; i < binary.length; i++) {
23199
+ bytes[i] = binary.charCodeAt(i);
23200
+ }
23201
+ return bytes;
23202
+ }
23203
+ function bytesToWebSafeBase64(bytes) {
23204
+ let binary = '';
23205
+ for (let i = 0; i < bytes.length; i++) {
23206
+ binary += String.fromCharCode(bytes[i]);
23207
+ }
23208
+ return makeWebSafe(globalThis.btoa(binary));
23209
+ }
23210
+ function utf8Encode(text) {
23211
+ return new globalThis.TextEncoder().encode(text);
23212
+ }
23213
+ function concatBytes(...parts) {
23214
+ const total = parts.reduce((sum, part) => sum + part.length, 0);
23215
+ const out = new Uint8Array(total);
23216
+ let offset = 0;
23217
+ for (const part of parts) {
23218
+ out.set(part, offset);
23219
+ offset += part.length;
23220
+ }
23221
+ return out;
23222
+ }
23223
+ function leftRotate(value, amount) {
23224
+ return ((value << amount) | (value >>> (32 - amount))) >>> 0;
23225
+ }
23226
+ function sha1(message) {
23227
+ const originalLength = message.length;
23228
+ const bitLength = originalLength * 8;
23229
+ const paddedLength = Math.ceil((originalLength + 9) / 64) * 64;
23230
+ const padded = new Uint8Array(paddedLength);
23231
+ padded.set(message);
23232
+ padded[originalLength] = 0x80;
23233
+ const view = new DataView(padded.buffer);
23234
+ view.setUint32(paddedLength - 4, bitLength >>> 0, false);
23235
+ view.setUint32(paddedLength - 8, Math.floor(bitLength / 0x100000000), false);
23236
+ let h0 = 0x67452301;
23237
+ let h1 = 0xefcdab89;
23238
+ let h2 = 0x98badcfe;
23239
+ let h3 = 0x10325476;
23240
+ let h4 = 0xc3d2e1f0;
23241
+ const w = new Uint32Array(80);
23242
+ for (let offset = 0; offset < paddedLength; offset += 64) {
23243
+ for (let i = 0; i < 16; i++) {
23244
+ w[i] = view.getUint32(offset + i * 4, false);
23245
+ }
23246
+ for (let i = 16; i < 80; i++) {
23247
+ w[i] = leftRotate(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 1);
23248
+ }
23249
+ let a = h0;
23250
+ let b = h1;
23251
+ let c = h2;
23252
+ let d = h3;
23253
+ let e = h4;
23254
+ for (let i = 0; i < 80; i++) {
23255
+ let f;
23256
+ let k;
23257
+ if (i < 20) {
23258
+ f = (b & c) | (~b & d);
23259
+ k = 0x5a827999;
23260
+ }
23261
+ else if (i < 40) {
23262
+ f = b ^ c ^ d;
23263
+ k = 0x6ed9eba1;
23264
+ }
23265
+ else if (i < 60) {
23266
+ f = (b & c) | (b & d) | (c & d);
23267
+ k = 0x8f1bbcdc;
23268
+ }
23269
+ else {
23270
+ f = b ^ c ^ d;
23271
+ k = 0xca62c1d6;
23272
+ }
23273
+ const temp = (leftRotate(a, 5) + f + e + k + w[i]) >>> 0;
23274
+ e = d;
23275
+ d = c;
23276
+ c = leftRotate(b, 30);
23277
+ b = a;
23278
+ a = temp;
23279
+ }
23280
+ h0 = (h0 + a) >>> 0;
23281
+ h1 = (h1 + b) >>> 0;
23282
+ h2 = (h2 + c) >>> 0;
23283
+ h3 = (h3 + d) >>> 0;
23284
+ h4 = (h4 + e) >>> 0;
23285
+ }
23286
+ const digest = new Uint8Array(20);
23287
+ const digestView = new DataView(digest.buffer);
23288
+ digestView.setUint32(0, h0, false);
23289
+ digestView.setUint32(4, h1, false);
23290
+ digestView.setUint32(8, h2, false);
23291
+ digestView.setUint32(12, h3, false);
23292
+ digestView.setUint32(16, h4, false);
23293
+ return digest;
23294
+ }
23295
+ function hmacSha1(key, message) {
23296
+ const blockSize = 64;
23297
+ let normalizedKey = key;
23298
+ if (normalizedKey.length > blockSize) {
23299
+ normalizedKey = sha1(normalizedKey);
23300
+ }
23301
+ const paddedKey = new Uint8Array(blockSize);
23302
+ paddedKey.set(normalizedKey);
23303
+ const innerPad = new Uint8Array(blockSize);
23304
+ const outerPad = new Uint8Array(blockSize);
23305
+ for (let i = 0; i < blockSize; i++) {
23306
+ innerPad[i] = paddedKey[i] ^ 0x36;
23307
+ outerPad[i] = paddedKey[i] ^ 0x5c;
23308
+ }
23309
+ return sha1(concatBytes(outerPad, sha1(concatBytes(innerPad, message))));
23310
+ }
23311
+ function signUrlToSign(urlToSign, urlSigningSecret) {
23312
+ const keyBytes = decodeUrlSigningSecret(urlSigningSecret);
23313
+ const signatureBytes = hmacSha1(keyBytes, utf8Encode(urlToSign));
23314
+ return bytesToWebSafeBase64(signatureBytes);
23315
+ }
23316
+ /**
23317
+ * 对 Maps Static API 请求 URL 追加 `signature` 参数。
23318
+ * 签名内容为 pathname + search(不含 scheme/host),算法 HMAC-SHA1 + URL-safe Base64。
23319
+ *
23320
+ * @param inputUrl 完整未签名 URL(须已包含 key 等 query 参数)
23321
+ * @param urlSigningSecret Cloud Console「URL 签名密钥」(URL-safe Base64)
23322
+ */
23323
+ function signGoogleStaticMapUrlSync(inputUrl, urlSigningSecret) {
23324
+ if (!inputUrl || !urlSigningSecret) {
23325
+ throw new Error('signGoogleStaticMapUrl: inputUrl and urlSigningSecret are required');
23326
+ }
23327
+ const url = new globalThis.URL(inputUrl);
23328
+ url.searchParams.delete('signature');
23329
+ const urlToSign = `${url.pathname}${url.search}`;
23330
+ const signature = signUrlToSign(urlToSign, urlSigningSecret);
23331
+ return `${url.origin}${urlToSign}&signature=${signature}`;
23332
+ }
23333
+ /** 异步包装,便于与宿主 signGoogleStaticMapUrl 回调统一 Promise 接口 */
23334
+ async function signGoogleStaticMapUrl(inputUrl, urlSigningSecret) {
23335
+ return signGoogleStaticMapUrlSync(inputUrl, urlSigningSecret);
23336
+ }
23337
+
23175
23338
  var chargingPileImage = "data:image/png;base64,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";
23176
23339
 
23177
23340
  const useChargingPile = ({ viewBox, rotation = 0 }) => {
@@ -23249,7 +23412,7 @@ const STATIC_MAP_RETRY_COOLDOWN_MS = 5000;
23249
23412
  /** 放大镜内充电桩屏幕像素下限,避免过小导致通道与桩视觉错位 */
23250
23413
  const MAGNIFIER_CHARGING_PILE_MIN_DISPLAY_PX = 20;
23251
23414
  const Magnifier = ({ visible, dragState, polygonPoints, fillColor = 'rgba(255, 122, 51, 0.1)', strokeColor = 'rgba(255, 122, 51, 1)', strokeWidth = 2, zoom = 3, size = 200, }) => {
23252
- const { svgViewBox, mapRef, googleMapStaticApiKey, drag } = useCommonContext();
23415
+ const { svgViewBox, mapRef, googleMapStaticApiKey, googleMapStaticUrlSigningSecret, signGoogleStaticMapUrl: signGoogleStaticMapUrl$1, drag, } = useCommonContext();
23253
23416
  const { svgElementDatas, svgRef } = useSvgEditContext();
23254
23417
  const { editMapInfo } = useMapEditContext();
23255
23418
  const [magnifierPosition, setMagnifierPosition] = useState({ x: 0, y: 0 });
@@ -23337,76 +23500,107 @@ const Magnifier = ({ visible, dragState, polygonPoints, fillColor = 'rgba(255, 1
23337
23500
  const svgPoint = svgRef.createSVGPoint();
23338
23501
  // 只要有 key 就尝试 static api;请求失败时不截图,直接回退灰色背景
23339
23502
  if (googleMapStaticApiKey) {
23340
- // console.log('[Magnifier] Background source: static api viewport snapshot');
23341
- const mapBounds = mapRef.getBounds?.();
23342
- if (!mapBounds) {
23343
- // console.log('[Magnifier] Skip static map effect: mapBounds missing');
23344
- setMapImageFrame(null);
23345
- return;
23346
- }
23347
- const screenToSvg = (screenX, screenY) => {
23348
- svgPoint.x = screenX;
23349
- svgPoint.y = screenY;
23350
- const p = svgPoint.matrixTransform(inverseCtm);
23351
- return { x: p.x, y: p.y };
23503
+ let cancelled = false;
23504
+ (async () => {
23505
+ // console.log('[Magnifier] Background source: static api viewport snapshot');
23506
+ const mapBounds = mapRef.getBounds?.();
23507
+ if (!mapBounds) {
23508
+ // console.log('[Magnifier] Skip static map effect: mapBounds missing');
23509
+ if (!cancelled) {
23510
+ setMapImageFrame(null);
23511
+ }
23512
+ return;
23513
+ }
23514
+ const screenToSvg = (screenX, screenY) => {
23515
+ svgPoint.x = screenX;
23516
+ svgPoint.y = screenY;
23517
+ const p = svgPoint.matrixTransform(inverseCtm);
23518
+ return { x: p.x, y: p.y };
23519
+ };
23520
+ // 使用当前地图视口矩形四角,将屏幕坐标映射到 SVG 坐标,确保底图与主视口对齐
23521
+ const topLeftSvg = screenToSvg(mapRect.left, mapRect.top);
23522
+ const topRightSvg = screenToSvg(mapRect.right, mapRect.top);
23523
+ const bottomLeftSvg = screenToSvg(mapRect.left, mapRect.bottom);
23524
+ if (!topLeftSvg || !topRightSvg || !bottomLeftSvg) {
23525
+ if (!cancelled) {
23526
+ setMapImageFrame(null);
23527
+ }
23528
+ return;
23529
+ }
23530
+ // 把当前主地图可视区域尺寸,按比例压到 Static API 允许的最大尺寸以内(受 Static API 640 上限约束)),同时不改变宽高比。
23531
+ const mapWidth = Math.max(1, Math.round(mapRect.width));
23532
+ const mapHeight = Math.max(1, Math.round(mapRect.height));
23533
+ const shrinkRatio = Math.min(1, MAX_STATIC_SIZE / Math.max(mapWidth, mapHeight));
23534
+ const staticWidth = Math.max(1, Math.round(mapWidth * shrinkRatio));
23535
+ const staticHeight = Math.max(1, Math.round(mapHeight * shrinkRatio));
23536
+ const center = mapBounds.getCenter();
23537
+ const currentZoom = mapRef.getZoom() || 20;
23538
+ // 尺寸缩小后同步补偿 zoom,保持与当前主图一致的地理覆盖范围
23539
+ const zoomCompensation = Math.log2(shrinkRatio);
23540
+ const adjustedZoom = currentZoom + zoomCompensation;
23541
+ const staticZoom = Math.max(0, Math.min(Math.floor(adjustedZoom), 22));
23542
+ const unsignedStaticMapUrl = `https://maps.googleapis.com/maps/api/staticmap?center=${center.lat()},${center.lng()}&zoom=${staticZoom}&size=${staticWidth}x${staticHeight}&maptype=satellite&key=${googleMapStaticApiKey}`;
23543
+ // 可选:对 Static Map URL 做 Google 数字签名(宿主回调优先,其次客户端 signing secret)
23544
+ let staticMapUrl = unsignedStaticMapUrl;
23545
+ try {
23546
+ if (signGoogleStaticMapUrl$1) {
23547
+ staticMapUrl = await Promise.resolve(signGoogleStaticMapUrl$1(unsignedStaticMapUrl));
23548
+ }
23549
+ else if (googleMapStaticUrlSigningSecret) {
23550
+ staticMapUrl = await signGoogleStaticMapUrl(unsignedStaticMapUrl, googleMapStaticUrlSigningSecret);
23551
+ console.log('[Magnifier] staticMapUrl', staticMapUrl);
23552
+ }
23553
+ }
23554
+ catch (error) {
23555
+ console.warn('[Magnifier] Static map URL signing failed', error);
23556
+ if (!cancelled) {
23557
+ setMapImageFrame(null);
23558
+ }
23559
+ return;
23560
+ }
23561
+ // 通过三角点推导静态图在 SVG 中的宽高和旋转角
23562
+ // Math.hypot(x, y) 等价于 sqrt(x*x + y*y),计算两点之间的距离
23563
+ const width = Math.hypot(topRightSvg.x - topLeftSvg.x, topRightSvg.y - topLeftSvg.y);
23564
+ const height = Math.hypot(bottomLeftSvg.x - topLeftSvg.x, bottomLeftSvg.y - topLeftSvg.y);
23565
+ // Math.atan2(y, x) 计算反正切值,返回 [-π, π] 弧度,*180/π 转换为角度
23566
+ const rotationDeg = (Math.atan2(topRightSvg.y - topLeftSvg.y, topRightSvg.x - topLeftSvg.x) * 180) / Math.PI;
23567
+ // Static API zoom 只能取整;额外补偿小数部分,避免底图视觉偏小
23568
+ // 在有旋转的坐标系里,做“以中心为锚点”的等比放大补偿。
23569
+ const fractionalZoomScale = Math.pow(2, adjustedZoom - staticZoom); //算出“还差多少缩放比例”。例子:adjustedZoom=19.6,staticZoom=19,差 0.6,比例是 2^0.6 ≈ 1.515。
23570
+ //把原始 width/height 乘这个比例,得到补偿后的尺寸。
23571
+ const compensatedWidth = width * fractionalZoomScale;
23572
+ const compensatedHeight = height * fractionalZoomScale;
23573
+ //尺寸变大后,多出来的宽/高的一半(要从两边均匀扩张)。
23574
+ const offsetAlongX = (compensatedWidth - width) / 2;
23575
+ const offsetAlongY = (compensatedHeight - height) / 2;
23576
+ //“右方向”单位向量(从左上指向右上),因为图可能旋转了,不能只按水平 x 轴算。
23577
+ const unitX = width > 0 ? (topRightSvg.x - topLeftSvg.x) / width : 1;
23578
+ const unitY = width > 0 ? (topRightSvg.y - topLeftSvg.y) / width : 0;
23579
+ //“下方向”单位向量(从左上指向左下),同理用于旋转场景。
23580
+ const unitDownX = height > 0 ? (bottomLeftSvg.x - topLeftSvg.x) / height : 0;
23581
+ const unitDownY = height > 0 ? (bottomLeftSvg.y - topLeftSvg.y) / height : 0;
23582
+ /**
23583
+ * 计算补偿后的新左上角:
23584
+ * 从原左上角沿“右方向”回退半个扩展量,再沿“下方向”回退半个扩展量。
23585
+ * 这样放大后仍以原区域中心为中心,不会放大后位置偏移。
23586
+ */
23587
+ const compensatedTopLeftX = topLeftSvg.x - unitX * offsetAlongX - unitDownX * offsetAlongY;
23588
+ const compensatedTopLeftY = topLeftSvg.y - unitY * offsetAlongX - unitDownY * offsetAlongY;
23589
+ if (cancelled) {
23590
+ return;
23591
+ }
23592
+ setMapImageFrame({
23593
+ url: staticMapUrl,
23594
+ x: compensatedTopLeftX,
23595
+ y: compensatedTopLeftY,
23596
+ width: compensatedWidth,
23597
+ height: compensatedHeight,
23598
+ transform: `rotate(${rotationDeg} ${compensatedTopLeftX} ${compensatedTopLeftY})`,
23599
+ });
23600
+ })();
23601
+ return () => {
23602
+ cancelled = true;
23352
23603
  };
23353
- // 使用当前地图视口矩形四角,将屏幕坐标映射到 SVG 坐标,确保底图与主视口对齐
23354
- const topLeftSvg = screenToSvg(mapRect.left, mapRect.top);
23355
- const topRightSvg = screenToSvg(mapRect.right, mapRect.top);
23356
- const bottomLeftSvg = screenToSvg(mapRect.left, mapRect.bottom);
23357
- if (!topLeftSvg || !topRightSvg || !bottomLeftSvg) {
23358
- setMapImageFrame(null);
23359
- return;
23360
- }
23361
- // 把当前主地图可视区域尺寸,按比例压到 Static API 允许的最大尺寸以内(受 Static API 640 上限约束)),同时不改变宽高比。
23362
- const mapWidth = Math.max(1, Math.round(mapRect.width));
23363
- const mapHeight = Math.max(1, Math.round(mapRect.height));
23364
- const shrinkRatio = Math.min(1, MAX_STATIC_SIZE / Math.max(mapWidth, mapHeight));
23365
- const staticWidth = Math.max(1, Math.round(mapWidth * shrinkRatio));
23366
- const staticHeight = Math.max(1, Math.round(mapHeight * shrinkRatio));
23367
- const center = mapBounds.getCenter();
23368
- const currentZoom = mapRef.getZoom() || 20;
23369
- // 尺寸缩小后同步补偿 zoom,保持与当前主图一致的地理覆盖范围
23370
- const zoomCompensation = Math.log2(shrinkRatio);
23371
- const adjustedZoom = currentZoom + zoomCompensation;
23372
- const staticZoom = Math.max(0, Math.min(Math.floor(adjustedZoom), 22));
23373
- const staticMapUrl = `https://maps.googleapis.com/maps/api/staticmap?center=${center.lat()},${center.lng()}&zoom=${staticZoom}&size=${staticWidth}x${staticHeight}&maptype=satellite&key=${googleMapStaticApiKey}`;
23374
- // 通过三角点推导静态图在 SVG 中的宽高和旋转角
23375
- // Math.hypot(x, y) 等价于 sqrt(x*x + y*y),计算两点之间的距离
23376
- const width = Math.hypot(topRightSvg.x - topLeftSvg.x, topRightSvg.y - topLeftSvg.y);
23377
- const height = Math.hypot(bottomLeftSvg.x - topLeftSvg.x, bottomLeftSvg.y - topLeftSvg.y);
23378
- // Math.atan2(y, x) 计算反正切值,返回 [-π, π] 弧度,*180/π 转换为角度
23379
- const rotationDeg = (Math.atan2(topRightSvg.y - topLeftSvg.y, topRightSvg.x - topLeftSvg.x) * 180) / Math.PI;
23380
- // Static API zoom 只能取整;额外补偿小数部分,避免底图视觉偏小
23381
- // 在有旋转的坐标系里,做“以中心为锚点”的等比放大补偿。
23382
- const fractionalZoomScale = Math.pow(2, adjustedZoom - staticZoom); //算出“还差多少缩放比例”。例子:adjustedZoom=19.6,staticZoom=19,差 0.6,比例是 2^0.6 ≈ 1.515。
23383
- //把原始 width/height 乘这个比例,得到补偿后的尺寸。
23384
- const compensatedWidth = width * fractionalZoomScale;
23385
- const compensatedHeight = height * fractionalZoomScale;
23386
- //尺寸变大后,多出来的宽/高的一半(要从两边均匀扩张)。
23387
- const offsetAlongX = (compensatedWidth - width) / 2;
23388
- const offsetAlongY = (compensatedHeight - height) / 2;
23389
- //“右方向”单位向量(从左上指向右上),因为图可能旋转了,不能只按水平 x 轴算。
23390
- const unitX = width > 0 ? (topRightSvg.x - topLeftSvg.x) / width : 1;
23391
- const unitY = width > 0 ? (topRightSvg.y - topLeftSvg.y) / width : 0;
23392
- //“下方向”单位向量(从左上指向左下),同理用于旋转场景。
23393
- const unitDownX = height > 0 ? (bottomLeftSvg.x - topLeftSvg.x) / height : 0;
23394
- const unitDownY = height > 0 ? (bottomLeftSvg.y - topLeftSvg.y) / height : 1;
23395
- /**
23396
- * 计算补偿后的新左上角:
23397
- * 从原左上角沿“右方向”回退半个扩展量,再沿“下方向”回退半个扩展量。
23398
- * 这样放大后仍以原区域中心为中心,不会放大后位置偏移。
23399
- */
23400
- const compensatedTopLeftX = topLeftSvg.x - unitX * offsetAlongX - unitDownX * offsetAlongY;
23401
- const compensatedTopLeftY = topLeftSvg.y - unitY * offsetAlongX - unitDownY * offsetAlongY;
23402
- setMapImageFrame({
23403
- url: staticMapUrl,
23404
- x: compensatedTopLeftX,
23405
- y: compensatedTopLeftY,
23406
- width: compensatedWidth,
23407
- height: compensatedHeight,
23408
- transform: `rotate(${rotationDeg} ${compensatedTopLeftX} ${compensatedTopLeftY})`,
23409
- });
23410
23604
  }
23411
23605
  else {
23412
23606
  setMapImageFrame(null);
@@ -23426,6 +23620,8 @@ const Magnifier = ({ visible, dragState, polygonPoints, fillColor = 'rgba(255, 1
23426
23620
  size,
23427
23621
  zoom,
23428
23622
  googleMapStaticApiKey,
23623
+ googleMapStaticUrlSigningSecret,
23624
+ signGoogleStaticMapUrl$1,
23429
23625
  staticMapRetryCount,
23430
23626
  staticMapBlockedUntil,
23431
23627
  ]);
@@ -29564,7 +29760,7 @@ const defaultMapConfig$1 = DEFAULT_STYLES;
29564
29760
  // 地图渲染器组件
29565
29761
  const MowerMapRenderer = forwardRef(({ sn, mowerIconConfig = {}, platform = PlatformType.WEB, mapType = MapType.NORMAL, edger = false, unitType = UnitsType.Imperial, language = 'en', onlyRead = false, isHighlight = true, mapConfig,
29566
29762
  // pathConfig,
29567
- modelType, showStraddleBoundaryBorder = true, mapRef, mapJson, pathJson, realTimeData, antennaConfig, onError, className, style, zIndex, googleMapInstance: _googleMapInstance, dragMap = false, canRotateMap = false, dragCallbacks, defaultTransform, debug: _debug = false, doodleList = [], editMap = false, unStructMapData, disabledObstacles = false, onHandleEnterRecord, onHandleCompleteRecord, onHandleStopRecord, onHandleDeleteElement, onSaveBoundaryData, onSaveMap, onEditInfoMapChange, onUpdateBoundary, heightOptions, globalHeight, googleMapStaticApiKey, onHandleEvent, onSelectElement, onH5FirstSelectObstaclePoint, }, ref) => {
29763
+ modelType, showStraddleBoundaryBorder = true, mapRef, mapJson, pathJson, realTimeData, antennaConfig, onError, className, style, zIndex, googleMapInstance: _googleMapInstance, dragMap = false, canRotateMap = false, dragCallbacks, defaultTransform, debug: _debug = false, doodleList = [], editMap = false, unStructMapData, disabledObstacles = false, onHandleEnterRecord, onHandleCompleteRecord, onHandleStopRecord, onHandleDeleteElement, onSaveBoundaryData, onSaveMap, onEditInfoMapChange, onUpdateBoundary, heightOptions, globalHeight, googleMapStaticApiKey, googleMapStaticUrlSigningSecret, signGoogleStaticMapUrl, onHandleEvent, onSelectElement, onH5FirstSelectObstaclePoint, }, ref) => {
29568
29764
  const [currentError, setCurrentError] = useState(null);
29569
29765
  // const mapRef = useMap();
29570
29766
  const [processStateIsMowing, setProcessStateIsMowing] = useState(false);
@@ -29810,6 +30006,8 @@ modelType, showStraddleBoundaryBorder = true, mapRef, mapJson, pathJson, realTim
29810
30006
  showStraddleBoundaryBorder,
29811
30007
  overlayLayout,
29812
30008
  googleMapStaticApiKey,
30009
+ googleMapStaticUrlSigningSecret,
30010
+ signGoogleStaticMapUrl,
29813
30011
  onH5FirstSelectObstaclePoint,
29814
30012
  };
29815
30013
  }, [
@@ -29833,6 +30031,8 @@ modelType, showStraddleBoundaryBorder = true, mapRef, mapJson, pathJson, realTim
29833
30031
  showStraddleBoundaryBorder,
29834
30032
  overlayLayout,
29835
30033
  googleMapStaticApiKey,
30034
+ googleMapStaticUrlSigningSecret,
30035
+ signGoogleStaticMapUrl,
29836
30036
  onH5FirstSelectObstaclePoint,
29837
30037
  ]);
29838
30038
  /**
@@ -30281,4 +30481,4 @@ const BoundarySvgRender = React__default.memo(({ mapJson, unStructMapData, id, m
30281
30481
  }) }), jsx(CharginPile, { viewBox: boundaryViewBox || null, rotation: 0 })] }) }) }));
30282
30482
  });
30283
30483
 
30284
- export { ALL_DIRECTION_SELECTED, AntennaData, BaseData, BoundaryData, BoundarySvgRender, ChannelData, ChargingPileData, CheckDoodleErrorType, CheckObstaclePointErrorType, ClickEventType, CreateStatus, DataType, DoodleData, MAX_DIRECTION_ANGLE, MIN_DIRECTION_ANGLE, MapType, MobileEditMode, MowGateData, MowerMapRenderer, ObstacleData, PathData, PlatformType, RecordFunctionEnum, RecordTypeEnum, RenderType, SCALE_FACTOR, SvgParserNative, UnifiedMapDataProcessor, VisionOffData, calculateMapGpsCenter, estimateGpsFromMapBounds, getValidGpsBounds, initBoundary, initChannel, initDoodle, initObstacle, initVisionOff, restorePointsFormat };
30484
+ export { ALL_DIRECTION_SELECTED, AntennaData, BaseData, BoundaryData, BoundarySvgRender, ChannelData, ChargingPileData, CheckDoodleErrorType, CheckObstaclePointErrorType, ClickEventType, CreateStatus, DataType, DoodleData, MAX_DIRECTION_ANGLE, MIN_DIRECTION_ANGLE, MapType, MobileEditMode, MowGateData, MowerMapRenderer, ObstacleData, PathData, PlatformType, RecordFunctionEnum, RecordTypeEnum, RenderType, SCALE_FACTOR, SvgParserNative, UnifiedMapDataProcessor, VisionOffData, calculateMapGpsCenter, estimateGpsFromMapBounds, getValidGpsBounds, initBoundary, initChannel, initDoodle, initObstacle, initVisionOff, restorePointsFormat, signGoogleStaticMapUrl, signGoogleStaticMapUrlSync };
package/dist/index.js CHANGED
@@ -22711,6 +22711,8 @@ const CommonContext = React.createContext({
22711
22711
  overlayScale: 1,
22712
22712
  showStraddleBoundaryBorder: true,
22713
22713
  googleMapStaticApiKey: '',
22714
+ googleMapStaticUrlSigningSecret: '',
22715
+ signGoogleStaticMapUrl: undefined,
22714
22716
  onH5FirstSelectObstaclePoint: undefined,
22715
22717
  });
22716
22718
  const CommonContextProvider = CommonContext.Provider;
@@ -23192,6 +23194,167 @@ const MapEditContext = React.createContext({
23192
23194
  const MapEditContextProvider = MapEditContext.Provider;
23193
23195
  const useMapEditContext = () => React.useContext(MapEditContext);
23194
23196
 
23197
+ /**
23198
+ * Google Maps Static API 数字签名
23199
+ * @see https://developers.google.com/maps/documentation/maps-static/digital-signature
23200
+ *
23201
+ * 使用纯 JS HMAC-SHA1,兼容 H5 WebView / 非 HTTPS 等无 crypto.subtle 的环境。
23202
+ */
23203
+ /// <reference lib="dom" />
23204
+ function removeWebSafe(encoded) {
23205
+ return encoded.replace(/-/g, '+').replace(/_/g, '/');
23206
+ }
23207
+ function makeWebSafe(encoded) {
23208
+ return encoded.replace(/\+/g, '-').replace(/\//g, '_');
23209
+ }
23210
+ function decodeUrlSigningSecret(secret) {
23211
+ let base64 = removeWebSafe(secret);
23212
+ const remainder = base64.length % 4;
23213
+ if (remainder) {
23214
+ base64 += '='.repeat(4 - remainder);
23215
+ }
23216
+ const binary = globalThis.atob(base64);
23217
+ const bytes = new Uint8Array(binary.length);
23218
+ for (let i = 0; i < binary.length; i++) {
23219
+ bytes[i] = binary.charCodeAt(i);
23220
+ }
23221
+ return bytes;
23222
+ }
23223
+ function bytesToWebSafeBase64(bytes) {
23224
+ let binary = '';
23225
+ for (let i = 0; i < bytes.length; i++) {
23226
+ binary += String.fromCharCode(bytes[i]);
23227
+ }
23228
+ return makeWebSafe(globalThis.btoa(binary));
23229
+ }
23230
+ function utf8Encode(text) {
23231
+ return new globalThis.TextEncoder().encode(text);
23232
+ }
23233
+ function concatBytes(...parts) {
23234
+ const total = parts.reduce((sum, part) => sum + part.length, 0);
23235
+ const out = new Uint8Array(total);
23236
+ let offset = 0;
23237
+ for (const part of parts) {
23238
+ out.set(part, offset);
23239
+ offset += part.length;
23240
+ }
23241
+ return out;
23242
+ }
23243
+ function leftRotate(value, amount) {
23244
+ return ((value << amount) | (value >>> (32 - amount))) >>> 0;
23245
+ }
23246
+ function sha1(message) {
23247
+ const originalLength = message.length;
23248
+ const bitLength = originalLength * 8;
23249
+ const paddedLength = Math.ceil((originalLength + 9) / 64) * 64;
23250
+ const padded = new Uint8Array(paddedLength);
23251
+ padded.set(message);
23252
+ padded[originalLength] = 0x80;
23253
+ const view = new DataView(padded.buffer);
23254
+ view.setUint32(paddedLength - 4, bitLength >>> 0, false);
23255
+ view.setUint32(paddedLength - 8, Math.floor(bitLength / 0x100000000), false);
23256
+ let h0 = 0x67452301;
23257
+ let h1 = 0xefcdab89;
23258
+ let h2 = 0x98badcfe;
23259
+ let h3 = 0x10325476;
23260
+ let h4 = 0xc3d2e1f0;
23261
+ const w = new Uint32Array(80);
23262
+ for (let offset = 0; offset < paddedLength; offset += 64) {
23263
+ for (let i = 0; i < 16; i++) {
23264
+ w[i] = view.getUint32(offset + i * 4, false);
23265
+ }
23266
+ for (let i = 16; i < 80; i++) {
23267
+ w[i] = leftRotate(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 1);
23268
+ }
23269
+ let a = h0;
23270
+ let b = h1;
23271
+ let c = h2;
23272
+ let d = h3;
23273
+ let e = h4;
23274
+ for (let i = 0; i < 80; i++) {
23275
+ let f;
23276
+ let k;
23277
+ if (i < 20) {
23278
+ f = (b & c) | (~b & d);
23279
+ k = 0x5a827999;
23280
+ }
23281
+ else if (i < 40) {
23282
+ f = b ^ c ^ d;
23283
+ k = 0x6ed9eba1;
23284
+ }
23285
+ else if (i < 60) {
23286
+ f = (b & c) | (b & d) | (c & d);
23287
+ k = 0x8f1bbcdc;
23288
+ }
23289
+ else {
23290
+ f = b ^ c ^ d;
23291
+ k = 0xca62c1d6;
23292
+ }
23293
+ const temp = (leftRotate(a, 5) + f + e + k + w[i]) >>> 0;
23294
+ e = d;
23295
+ d = c;
23296
+ c = leftRotate(b, 30);
23297
+ b = a;
23298
+ a = temp;
23299
+ }
23300
+ h0 = (h0 + a) >>> 0;
23301
+ h1 = (h1 + b) >>> 0;
23302
+ h2 = (h2 + c) >>> 0;
23303
+ h3 = (h3 + d) >>> 0;
23304
+ h4 = (h4 + e) >>> 0;
23305
+ }
23306
+ const digest = new Uint8Array(20);
23307
+ const digestView = new DataView(digest.buffer);
23308
+ digestView.setUint32(0, h0, false);
23309
+ digestView.setUint32(4, h1, false);
23310
+ digestView.setUint32(8, h2, false);
23311
+ digestView.setUint32(12, h3, false);
23312
+ digestView.setUint32(16, h4, false);
23313
+ return digest;
23314
+ }
23315
+ function hmacSha1(key, message) {
23316
+ const blockSize = 64;
23317
+ let normalizedKey = key;
23318
+ if (normalizedKey.length > blockSize) {
23319
+ normalizedKey = sha1(normalizedKey);
23320
+ }
23321
+ const paddedKey = new Uint8Array(blockSize);
23322
+ paddedKey.set(normalizedKey);
23323
+ const innerPad = new Uint8Array(blockSize);
23324
+ const outerPad = new Uint8Array(blockSize);
23325
+ for (let i = 0; i < blockSize; i++) {
23326
+ innerPad[i] = paddedKey[i] ^ 0x36;
23327
+ outerPad[i] = paddedKey[i] ^ 0x5c;
23328
+ }
23329
+ return sha1(concatBytes(outerPad, sha1(concatBytes(innerPad, message))));
23330
+ }
23331
+ function signUrlToSign(urlToSign, urlSigningSecret) {
23332
+ const keyBytes = decodeUrlSigningSecret(urlSigningSecret);
23333
+ const signatureBytes = hmacSha1(keyBytes, utf8Encode(urlToSign));
23334
+ return bytesToWebSafeBase64(signatureBytes);
23335
+ }
23336
+ /**
23337
+ * 对 Maps Static API 请求 URL 追加 `signature` 参数。
23338
+ * 签名内容为 pathname + search(不含 scheme/host),算法 HMAC-SHA1 + URL-safe Base64。
23339
+ *
23340
+ * @param inputUrl 完整未签名 URL(须已包含 key 等 query 参数)
23341
+ * @param urlSigningSecret Cloud Console「URL 签名密钥」(URL-safe Base64)
23342
+ */
23343
+ function signGoogleStaticMapUrlSync(inputUrl, urlSigningSecret) {
23344
+ if (!inputUrl || !urlSigningSecret) {
23345
+ throw new Error('signGoogleStaticMapUrl: inputUrl and urlSigningSecret are required');
23346
+ }
23347
+ const url = new globalThis.URL(inputUrl);
23348
+ url.searchParams.delete('signature');
23349
+ const urlToSign = `${url.pathname}${url.search}`;
23350
+ const signature = signUrlToSign(urlToSign, urlSigningSecret);
23351
+ return `${url.origin}${urlToSign}&signature=${signature}`;
23352
+ }
23353
+ /** 异步包装,便于与宿主 signGoogleStaticMapUrl 回调统一 Promise 接口 */
23354
+ async function signGoogleStaticMapUrl(inputUrl, urlSigningSecret) {
23355
+ return signGoogleStaticMapUrlSync(inputUrl, urlSigningSecret);
23356
+ }
23357
+
23195
23358
  var chargingPileImage = "data:image/png;base64,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";
23196
23359
 
23197
23360
  const useChargingPile = ({ viewBox, rotation = 0 }) => {
@@ -23269,7 +23432,7 @@ const STATIC_MAP_RETRY_COOLDOWN_MS = 5000;
23269
23432
  /** 放大镜内充电桩屏幕像素下限,避免过小导致通道与桩视觉错位 */
23270
23433
  const MAGNIFIER_CHARGING_PILE_MIN_DISPLAY_PX = 20;
23271
23434
  const Magnifier = ({ visible, dragState, polygonPoints, fillColor = 'rgba(255, 122, 51, 0.1)', strokeColor = 'rgba(255, 122, 51, 1)', strokeWidth = 2, zoom = 3, size = 200, }) => {
23272
- const { svgViewBox, mapRef, googleMapStaticApiKey, drag } = useCommonContext();
23435
+ const { svgViewBox, mapRef, googleMapStaticApiKey, googleMapStaticUrlSigningSecret, signGoogleStaticMapUrl: signGoogleStaticMapUrl$1, drag, } = useCommonContext();
23273
23436
  const { svgElementDatas, svgRef } = useSvgEditContext();
23274
23437
  const { editMapInfo } = useMapEditContext();
23275
23438
  const [magnifierPosition, setMagnifierPosition] = React.useState({ x: 0, y: 0 });
@@ -23357,76 +23520,107 @@ const Magnifier = ({ visible, dragState, polygonPoints, fillColor = 'rgba(255, 1
23357
23520
  const svgPoint = svgRef.createSVGPoint();
23358
23521
  // 只要有 key 就尝试 static api;请求失败时不截图,直接回退灰色背景
23359
23522
  if (googleMapStaticApiKey) {
23360
- // console.log('[Magnifier] Background source: static api viewport snapshot');
23361
- const mapBounds = mapRef.getBounds?.();
23362
- if (!mapBounds) {
23363
- // console.log('[Magnifier] Skip static map effect: mapBounds missing');
23364
- setMapImageFrame(null);
23365
- return;
23366
- }
23367
- const screenToSvg = (screenX, screenY) => {
23368
- svgPoint.x = screenX;
23369
- svgPoint.y = screenY;
23370
- const p = svgPoint.matrixTransform(inverseCtm);
23371
- return { x: p.x, y: p.y };
23523
+ let cancelled = false;
23524
+ (async () => {
23525
+ // console.log('[Magnifier] Background source: static api viewport snapshot');
23526
+ const mapBounds = mapRef.getBounds?.();
23527
+ if (!mapBounds) {
23528
+ // console.log('[Magnifier] Skip static map effect: mapBounds missing');
23529
+ if (!cancelled) {
23530
+ setMapImageFrame(null);
23531
+ }
23532
+ return;
23533
+ }
23534
+ const screenToSvg = (screenX, screenY) => {
23535
+ svgPoint.x = screenX;
23536
+ svgPoint.y = screenY;
23537
+ const p = svgPoint.matrixTransform(inverseCtm);
23538
+ return { x: p.x, y: p.y };
23539
+ };
23540
+ // 使用当前地图视口矩形四角,将屏幕坐标映射到 SVG 坐标,确保底图与主视口对齐
23541
+ const topLeftSvg = screenToSvg(mapRect.left, mapRect.top);
23542
+ const topRightSvg = screenToSvg(mapRect.right, mapRect.top);
23543
+ const bottomLeftSvg = screenToSvg(mapRect.left, mapRect.bottom);
23544
+ if (!topLeftSvg || !topRightSvg || !bottomLeftSvg) {
23545
+ if (!cancelled) {
23546
+ setMapImageFrame(null);
23547
+ }
23548
+ return;
23549
+ }
23550
+ // 把当前主地图可视区域尺寸,按比例压到 Static API 允许的最大尺寸以内(受 Static API 640 上限约束)),同时不改变宽高比。
23551
+ const mapWidth = Math.max(1, Math.round(mapRect.width));
23552
+ const mapHeight = Math.max(1, Math.round(mapRect.height));
23553
+ const shrinkRatio = Math.min(1, MAX_STATIC_SIZE / Math.max(mapWidth, mapHeight));
23554
+ const staticWidth = Math.max(1, Math.round(mapWidth * shrinkRatio));
23555
+ const staticHeight = Math.max(1, Math.round(mapHeight * shrinkRatio));
23556
+ const center = mapBounds.getCenter();
23557
+ const currentZoom = mapRef.getZoom() || 20;
23558
+ // 尺寸缩小后同步补偿 zoom,保持与当前主图一致的地理覆盖范围
23559
+ const zoomCompensation = Math.log2(shrinkRatio);
23560
+ const adjustedZoom = currentZoom + zoomCompensation;
23561
+ const staticZoom = Math.max(0, Math.min(Math.floor(adjustedZoom), 22));
23562
+ const unsignedStaticMapUrl = `https://maps.googleapis.com/maps/api/staticmap?center=${center.lat()},${center.lng()}&zoom=${staticZoom}&size=${staticWidth}x${staticHeight}&maptype=satellite&key=${googleMapStaticApiKey}`;
23563
+ // 可选:对 Static Map URL 做 Google 数字签名(宿主回调优先,其次客户端 signing secret)
23564
+ let staticMapUrl = unsignedStaticMapUrl;
23565
+ try {
23566
+ if (signGoogleStaticMapUrl$1) {
23567
+ staticMapUrl = await Promise.resolve(signGoogleStaticMapUrl$1(unsignedStaticMapUrl));
23568
+ }
23569
+ else if (googleMapStaticUrlSigningSecret) {
23570
+ staticMapUrl = await signGoogleStaticMapUrl(unsignedStaticMapUrl, googleMapStaticUrlSigningSecret);
23571
+ console.log('[Magnifier] staticMapUrl', staticMapUrl);
23572
+ }
23573
+ }
23574
+ catch (error) {
23575
+ console.warn('[Magnifier] Static map URL signing failed', error);
23576
+ if (!cancelled) {
23577
+ setMapImageFrame(null);
23578
+ }
23579
+ return;
23580
+ }
23581
+ // 通过三角点推导静态图在 SVG 中的宽高和旋转角
23582
+ // Math.hypot(x, y) 等价于 sqrt(x*x + y*y),计算两点之间的距离
23583
+ const width = Math.hypot(topRightSvg.x - topLeftSvg.x, topRightSvg.y - topLeftSvg.y);
23584
+ const height = Math.hypot(bottomLeftSvg.x - topLeftSvg.x, bottomLeftSvg.y - topLeftSvg.y);
23585
+ // Math.atan2(y, x) 计算反正切值,返回 [-π, π] 弧度,*180/π 转换为角度
23586
+ const rotationDeg = (Math.atan2(topRightSvg.y - topLeftSvg.y, topRightSvg.x - topLeftSvg.x) * 180) / Math.PI;
23587
+ // Static API zoom 只能取整;额外补偿小数部分,避免底图视觉偏小
23588
+ // 在有旋转的坐标系里,做“以中心为锚点”的等比放大补偿。
23589
+ const fractionalZoomScale = Math.pow(2, adjustedZoom - staticZoom); //算出“还差多少缩放比例”。例子:adjustedZoom=19.6,staticZoom=19,差 0.6,比例是 2^0.6 ≈ 1.515。
23590
+ //把原始 width/height 乘这个比例,得到补偿后的尺寸。
23591
+ const compensatedWidth = width * fractionalZoomScale;
23592
+ const compensatedHeight = height * fractionalZoomScale;
23593
+ //尺寸变大后,多出来的宽/高的一半(要从两边均匀扩张)。
23594
+ const offsetAlongX = (compensatedWidth - width) / 2;
23595
+ const offsetAlongY = (compensatedHeight - height) / 2;
23596
+ //“右方向”单位向量(从左上指向右上),因为图可能旋转了,不能只按水平 x 轴算。
23597
+ const unitX = width > 0 ? (topRightSvg.x - topLeftSvg.x) / width : 1;
23598
+ const unitY = width > 0 ? (topRightSvg.y - topLeftSvg.y) / width : 0;
23599
+ //“下方向”单位向量(从左上指向左下),同理用于旋转场景。
23600
+ const unitDownX = height > 0 ? (bottomLeftSvg.x - topLeftSvg.x) / height : 0;
23601
+ const unitDownY = height > 0 ? (bottomLeftSvg.y - topLeftSvg.y) / height : 0;
23602
+ /**
23603
+ * 计算补偿后的新左上角:
23604
+ * 从原左上角沿“右方向”回退半个扩展量,再沿“下方向”回退半个扩展量。
23605
+ * 这样放大后仍以原区域中心为中心,不会放大后位置偏移。
23606
+ */
23607
+ const compensatedTopLeftX = topLeftSvg.x - unitX * offsetAlongX - unitDownX * offsetAlongY;
23608
+ const compensatedTopLeftY = topLeftSvg.y - unitY * offsetAlongX - unitDownY * offsetAlongY;
23609
+ if (cancelled) {
23610
+ return;
23611
+ }
23612
+ setMapImageFrame({
23613
+ url: staticMapUrl,
23614
+ x: compensatedTopLeftX,
23615
+ y: compensatedTopLeftY,
23616
+ width: compensatedWidth,
23617
+ height: compensatedHeight,
23618
+ transform: `rotate(${rotationDeg} ${compensatedTopLeftX} ${compensatedTopLeftY})`,
23619
+ });
23620
+ })();
23621
+ return () => {
23622
+ cancelled = true;
23372
23623
  };
23373
- // 使用当前地图视口矩形四角,将屏幕坐标映射到 SVG 坐标,确保底图与主视口对齐
23374
- const topLeftSvg = screenToSvg(mapRect.left, mapRect.top);
23375
- const topRightSvg = screenToSvg(mapRect.right, mapRect.top);
23376
- const bottomLeftSvg = screenToSvg(mapRect.left, mapRect.bottom);
23377
- if (!topLeftSvg || !topRightSvg || !bottomLeftSvg) {
23378
- setMapImageFrame(null);
23379
- return;
23380
- }
23381
- // 把当前主地图可视区域尺寸,按比例压到 Static API 允许的最大尺寸以内(受 Static API 640 上限约束)),同时不改变宽高比。
23382
- const mapWidth = Math.max(1, Math.round(mapRect.width));
23383
- const mapHeight = Math.max(1, Math.round(mapRect.height));
23384
- const shrinkRatio = Math.min(1, MAX_STATIC_SIZE / Math.max(mapWidth, mapHeight));
23385
- const staticWidth = Math.max(1, Math.round(mapWidth * shrinkRatio));
23386
- const staticHeight = Math.max(1, Math.round(mapHeight * shrinkRatio));
23387
- const center = mapBounds.getCenter();
23388
- const currentZoom = mapRef.getZoom() || 20;
23389
- // 尺寸缩小后同步补偿 zoom,保持与当前主图一致的地理覆盖范围
23390
- const zoomCompensation = Math.log2(shrinkRatio);
23391
- const adjustedZoom = currentZoom + zoomCompensation;
23392
- const staticZoom = Math.max(0, Math.min(Math.floor(adjustedZoom), 22));
23393
- const staticMapUrl = `https://maps.googleapis.com/maps/api/staticmap?center=${center.lat()},${center.lng()}&zoom=${staticZoom}&size=${staticWidth}x${staticHeight}&maptype=satellite&key=${googleMapStaticApiKey}`;
23394
- // 通过三角点推导静态图在 SVG 中的宽高和旋转角
23395
- // Math.hypot(x, y) 等价于 sqrt(x*x + y*y),计算两点之间的距离
23396
- const width = Math.hypot(topRightSvg.x - topLeftSvg.x, topRightSvg.y - topLeftSvg.y);
23397
- const height = Math.hypot(bottomLeftSvg.x - topLeftSvg.x, bottomLeftSvg.y - topLeftSvg.y);
23398
- // Math.atan2(y, x) 计算反正切值,返回 [-π, π] 弧度,*180/π 转换为角度
23399
- const rotationDeg = (Math.atan2(topRightSvg.y - topLeftSvg.y, topRightSvg.x - topLeftSvg.x) * 180) / Math.PI;
23400
- // Static API zoom 只能取整;额外补偿小数部分,避免底图视觉偏小
23401
- // 在有旋转的坐标系里,做“以中心为锚点”的等比放大补偿。
23402
- const fractionalZoomScale = Math.pow(2, adjustedZoom - staticZoom); //算出“还差多少缩放比例”。例子:adjustedZoom=19.6,staticZoom=19,差 0.6,比例是 2^0.6 ≈ 1.515。
23403
- //把原始 width/height 乘这个比例,得到补偿后的尺寸。
23404
- const compensatedWidth = width * fractionalZoomScale;
23405
- const compensatedHeight = height * fractionalZoomScale;
23406
- //尺寸变大后,多出来的宽/高的一半(要从两边均匀扩张)。
23407
- const offsetAlongX = (compensatedWidth - width) / 2;
23408
- const offsetAlongY = (compensatedHeight - height) / 2;
23409
- //“右方向”单位向量(从左上指向右上),因为图可能旋转了,不能只按水平 x 轴算。
23410
- const unitX = width > 0 ? (topRightSvg.x - topLeftSvg.x) / width : 1;
23411
- const unitY = width > 0 ? (topRightSvg.y - topLeftSvg.y) / width : 0;
23412
- //“下方向”单位向量(从左上指向左下),同理用于旋转场景。
23413
- const unitDownX = height > 0 ? (bottomLeftSvg.x - topLeftSvg.x) / height : 0;
23414
- const unitDownY = height > 0 ? (bottomLeftSvg.y - topLeftSvg.y) / height : 1;
23415
- /**
23416
- * 计算补偿后的新左上角:
23417
- * 从原左上角沿“右方向”回退半个扩展量,再沿“下方向”回退半个扩展量。
23418
- * 这样放大后仍以原区域中心为中心,不会放大后位置偏移。
23419
- */
23420
- const compensatedTopLeftX = topLeftSvg.x - unitX * offsetAlongX - unitDownX * offsetAlongY;
23421
- const compensatedTopLeftY = topLeftSvg.y - unitY * offsetAlongX - unitDownY * offsetAlongY;
23422
- setMapImageFrame({
23423
- url: staticMapUrl,
23424
- x: compensatedTopLeftX,
23425
- y: compensatedTopLeftY,
23426
- width: compensatedWidth,
23427
- height: compensatedHeight,
23428
- transform: `rotate(${rotationDeg} ${compensatedTopLeftX} ${compensatedTopLeftY})`,
23429
- });
23430
23624
  }
23431
23625
  else {
23432
23626
  setMapImageFrame(null);
@@ -23446,6 +23640,8 @@ const Magnifier = ({ visible, dragState, polygonPoints, fillColor = 'rgba(255, 1
23446
23640
  size,
23447
23641
  zoom,
23448
23642
  googleMapStaticApiKey,
23643
+ googleMapStaticUrlSigningSecret,
23644
+ signGoogleStaticMapUrl$1,
23449
23645
  staticMapRetryCount,
23450
23646
  staticMapBlockedUntil,
23451
23647
  ]);
@@ -29584,7 +29780,7 @@ const defaultMapConfig$1 = DEFAULT_STYLES;
29584
29780
  // 地图渲染器组件
29585
29781
  const MowerMapRenderer = React.forwardRef(({ sn, mowerIconConfig = {}, platform = exports.PlatformType.WEB, mapType = exports.MapType.NORMAL, edger = false, unitType = UnitsType.Imperial, language = 'en', onlyRead = false, isHighlight = true, mapConfig,
29586
29782
  // pathConfig,
29587
- modelType, showStraddleBoundaryBorder = true, mapRef, mapJson, pathJson, realTimeData, antennaConfig, onError, className, style, zIndex, googleMapInstance: _googleMapInstance, dragMap = false, canRotateMap = false, dragCallbacks, defaultTransform, debug: _debug = false, doodleList = [], editMap = false, unStructMapData, disabledObstacles = false, onHandleEnterRecord, onHandleCompleteRecord, onHandleStopRecord, onHandleDeleteElement, onSaveBoundaryData, onSaveMap, onEditInfoMapChange, onUpdateBoundary, heightOptions, globalHeight, googleMapStaticApiKey, onHandleEvent, onSelectElement, onH5FirstSelectObstaclePoint, }, ref) => {
29783
+ modelType, showStraddleBoundaryBorder = true, mapRef, mapJson, pathJson, realTimeData, antennaConfig, onError, className, style, zIndex, googleMapInstance: _googleMapInstance, dragMap = false, canRotateMap = false, dragCallbacks, defaultTransform, debug: _debug = false, doodleList = [], editMap = false, unStructMapData, disabledObstacles = false, onHandleEnterRecord, onHandleCompleteRecord, onHandleStopRecord, onHandleDeleteElement, onSaveBoundaryData, onSaveMap, onEditInfoMapChange, onUpdateBoundary, heightOptions, globalHeight, googleMapStaticApiKey, googleMapStaticUrlSigningSecret, signGoogleStaticMapUrl, onHandleEvent, onSelectElement, onH5FirstSelectObstaclePoint, }, ref) => {
29588
29784
  const [currentError, setCurrentError] = React.useState(null);
29589
29785
  // const mapRef = useMap();
29590
29786
  const [processStateIsMowing, setProcessStateIsMowing] = React.useState(false);
@@ -29830,6 +30026,8 @@ modelType, showStraddleBoundaryBorder = true, mapRef, mapJson, pathJson, realTim
29830
30026
  showStraddleBoundaryBorder,
29831
30027
  overlayLayout,
29832
30028
  googleMapStaticApiKey,
30029
+ googleMapStaticUrlSigningSecret,
30030
+ signGoogleStaticMapUrl,
29833
30031
  onH5FirstSelectObstaclePoint,
29834
30032
  };
29835
30033
  }, [
@@ -29853,6 +30051,8 @@ modelType, showStraddleBoundaryBorder = true, mapRef, mapJson, pathJson, realTim
29853
30051
  showStraddleBoundaryBorder,
29854
30052
  overlayLayout,
29855
30053
  googleMapStaticApiKey,
30054
+ googleMapStaticUrlSigningSecret,
30055
+ signGoogleStaticMapUrl,
29856
30056
  onH5FirstSelectObstaclePoint,
29857
30057
  ]);
29858
30058
  /**
@@ -30328,3 +30528,5 @@ exports.initDoodle = initDoodle;
30328
30528
  exports.initObstacle = initObstacle;
30329
30529
  exports.initVisionOff = initVisionOff;
30330
30530
  exports.restorePointsFormat = restorePointsFormat;
30531
+ exports.signGoogleStaticMapUrl = signGoogleStaticMapUrl;
30532
+ exports.signGoogleStaticMapUrlSync = signGoogleStaticMapUrlSync;
@@ -1 +1 @@
1
- {"version":3,"file":"MowerMapRenderer.d.ts","sourceRoot":"","sources":["../../src/render/MowerMapRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AAwBf,OAAO,EAGL,qBAAqB,EACrB,mBAAmB,EAEpB,MAAM,mBAAmB,CAAC;AA0B3B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,MAAM,EAAE,GAAG,CAAC;KACb;CACF;AAMD,eAAO,MAAM,gBAAgB,mGAq0B5B,CAAC;AAIF,eAAe,gBAAgB,CAAC;AAChC,YAAY,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"MowerMapRenderer.d.ts","sourceRoot":"","sources":["../../src/render/MowerMapRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAQN,MAAM,OAAO,CAAC;AAwBf,OAAO,EAGL,qBAAqB,EACrB,mBAAmB,EAEpB,MAAM,mBAAmB,CAAC;AA0B3B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,MAAM,EAAE,GAAG,CAAC;KACb;CACF;AAMD,eAAO,MAAM,gBAAgB,mGA20B5B,CAAC;AAIF,eAAe,gBAAgB,CAAC;AAChC,YAAY,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/render/svgElement/PolygonELement/components/Magnifier/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAuD,MAAM,OAAO,CAAC;AAiB5E,UAAU,SAAS;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE;QACR,UAAU,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACrC,QAAQ,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACnC,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;IACT,QAAQ,EAAE,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC;CACrC;AAED,UAAU,cAAc;IACtB,cAAc;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW;IACX,SAAS,EAAE,SAAS,CAAC;IACrB,iBAAiB;IACjB,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;IAC1B,WAAW;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA2evC,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/render/svgElement/PolygonELement/components/Magnifier/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAuD,MAAM,OAAO,CAAC;AAkB5E,UAAU,SAAS;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE;QACR,UAAU,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACrC,QAAQ,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACnC,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;IACT,QAAQ,EAAE,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC;CACrC;AAED,UAAU,cAAc;IACtB,cAAc;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW;IACX,SAAS,EAAE,SAAS,CAAC;IACrB,iBAAiB;IACjB,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;IAC1B,WAAW;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAuhBvC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -193,6 +193,15 @@ export interface MowerMapRendererProps {
193
193
  heightOptions?: number[];
194
194
  globalHeight?: number;
195
195
  googleMapStaticApiKey?: string;
196
+ /**
197
+ * Maps Static API URL 签名密钥(Cloud Console 中的 URL signing secret)。
198
+ * 会随 H5 请求暴露在客户端,生产环境更推荐 signGoogleStaticMapUrl 走服务端签名。
199
+ */
200
+ googleMapStaticUrlSigningSecret?: string;
201
+ /**
202
+ * 由宿主在服务端完成 Static Map URL 签名后返回完整 URL(推荐生产使用)
203
+ */
204
+ signGoogleStaticMapUrl?: (unsignedUrl: string) => Promise<string> | string;
196
205
  onHandleEvent?: (type: ClickEventType, data: any) => void;
197
206
  onSelectElement?: (type: DataType) => void;
198
207
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/types/renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/types/renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Google Maps Static API 数字签名
3
+ * @see https://developers.google.com/maps/documentation/maps-static/digital-signature
4
+ *
5
+ * 使用纯 JS HMAC-SHA1,兼容 H5 WebView / 非 HTTPS 等无 crypto.subtle 的环境。
6
+ */
7
+ /**
8
+ * 对 Maps Static API 请求 URL 追加 `signature` 参数。
9
+ * 签名内容为 pathname + search(不含 scheme/host),算法 HMAC-SHA1 + URL-safe Base64。
10
+ *
11
+ * @param inputUrl 完整未签名 URL(须已包含 key 等 query 参数)
12
+ * @param urlSigningSecret Cloud Console「URL 签名密钥」(URL-safe Base64)
13
+ */
14
+ export declare function signGoogleStaticMapUrlSync(inputUrl: string, urlSigningSecret: string): string;
15
+ /** 异步包装,便于与宿主 signGoogleStaticMapUrl 回调统一 Promise 接口 */
16
+ export declare function signGoogleStaticMapUrl(inputUrl: string, urlSigningSecret: string): Promise<string>;
17
+ //# sourceMappingURL=googleStaticMapSign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"googleStaticMapSign.d.ts","sourceRoot":"","sources":["../../src/utils/googleStaticMapSign.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4JH;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAU7F;AAED,wDAAwD;AACxD,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CAEjB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fleet-frontend/mower-maps",
3
- "version": "0.2.5-beta.20",
3
+ "version": "0.2.5-beta.21",
4
4
  "type": "module",
5
5
  "description": "a mower maps in google maps",
6
6
  "main": "dist/index.js",