'f'
mh-two-thousand-and-two
2024-04-12 26f2711ef9461961fb953e2b497bd314ef95e345
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import {
  MapType,
  getMapInfo,
  IS_AMAP
} from '../../../../helpers/location'
import { createCallout } from './callout'
 
let maps
const callbacksMap = {}
const GOOGLE_MAP_CALLBACKNAME = '__map_callback__'
 
export function loadMaps (libraries, callback) {
  const mapInfo = getMapInfo()
  if (!mapInfo.key) {
    console.error('Map key not configured.')
    return
  }
  const callbacks = (callbacksMap[mapInfo.type] = callbacksMap[mapInfo.type] || [])
  if (maps) {
    callback(maps)
  } else if (
    window[mapInfo.type] &&
    window[mapInfo.type].maps
  ) {
    maps = IS_AMAP ? window[mapInfo.type] : window[mapInfo.type].maps
    maps.Callout = maps.Callout || createCallout(maps)
    callback(maps)
  } else if (callbacks.length) {
    callbacks.push(callback)
  } else {
    callbacks.push(callback)
    const globalExt = window
    const callbackName = GOOGLE_MAP_CALLBACKNAME + mapInfo.type
    globalExt[callbackName] = function () {
      delete globalExt[callbackName]
      maps = IS_AMAP ? window[mapInfo.type] : window[mapInfo.type].maps
      maps.Callout = createCallout(maps)
      callbacks.forEach((callback) => callback(maps))
      callbacks.length = 0
    }
    const script = document.createElement('script')
    let src = getScriptBaseUrl(mapInfo.type)
 
    if (mapInfo.type === MapType.QQ) {
      libraries.push('geometry')
    }
    if (libraries.length) {
      src += `libraries=${libraries.join('%2C')}&`
    }
 
    if (IS_AMAP) {
      handleAMapSecurityPolicy(mapInfo)
    }
    script.src = `${src}key=${mapInfo.key}&callback=${callbackName}`
    script.onerror = function () {
      console.error('Map load failed.')
    }
    document.body.appendChild(script)
  }
}
 
function getScriptBaseUrl (mapType) {
  const urlMap = {
    qq: 'https://map.qq.com/api/js?v=2.exp&',
    google: 'https://maps.googleapis.com/maps/api/js?',
    AMap: 'https://webapi.amap.com/maps?v=2.0&'
  }
 
  return urlMap[mapType]
}
 
function handleAMapSecurityPolicy (mapInfo) {
  window._AMapSecurityConfig = {
    securityJsCode: mapInfo.securityJsCode || '',
    serviceHost: mapInfo.serviceHost || ''
  }
}