@tslsmart/map_adapter
Version:
an adapter for maps,基于高德JSAPI 2.0,百度JavaScript API GL,arcgis api for javascript 3.23,光辉城市及51world sdk
255 lines (243 loc) • 8.3 kB
JavaScript
import { mapType } from "../js/MapLocalConfig"
import { isLoaded, loadCss, loadScript } from "../scriptLoader/loader"
/**
* @class MapLoader
* @classdesc 地图API加载器,基于高德JSAPI 2.0,百度JavaScript API GL,arcgis api for javascript 3.23,diva sdk 1.2.0,superAPI6.6.0
*/
export class MapLoader {
// url //api url
/**
* 加载地图API
* @param {json} mapconfig
* @returns 成功、失败回调
*/
static load(mapconfig) {
window.mapconfig = mapconfig
var promis
switch (window.mapconfig.mapType) {
case mapType.Gaode:
if (window.mapconfig.apiUrl && window.mapconfig.apiUrl != "") {
this.url = window.mapconfig.apiUrl //本地高德api地址
} else {
this.url =
"https://webapi.amap.com/maps?v=2.0" +
"&key=" +
window.mapconfig.key +
"&plugin=AMap.MouseTool,AMap.PolyEditor"
}
window._AMapSecurityConfig = {
securityJsCode: window.mapconfig.securityCode
}
var options = {
url: this.url,
attributes: [
{ key: "type", value: "text/javascript" },
{ key: "async", value: "sync" }
],
srcKey: "data-gd-loader"
}
promis = loadScript(options)
promis.then(() => {
if (!window.AMap) {
console.log("请配置mapconfig.apiUrl,使用离线API加载高德地图!")
}
})
break
case mapType.BD:
this.url =
"https://api.map.baidu.com/api?v=1.0" +
"&type=webgl&ak=" +
window.mapconfig.key +
"&s=1&callback=onBMapCallback"
promis = this.baiduAPILoadr()
break
case mapType.Esri:
this.url = window.mapconfig.apiUrl
var css = window.mapconfig.mapstyle
promis = this.esriAPILoader(css)
break
case mapType.Diva:
// this.url = 'https://diva.sheencity.cn/docs/_lib/diva-sdk-1.2.0.min.js'
// promis = this.scriptLoader()
promis = new Promise((resolve) => {
resolve()
})
break
case mapType.SuperAPI:
this.url = "https://superapi.51aes.com/dist/superAPI-6.6.0.min.js"
var options = {
url: this.url,
srcKey: "data-super-loader"
}
promis = loadScript(options)
break
case mapType.TacosSDK:
promis = new Promise((resolve) => {
resolve()
})
break
}
return promis
}
static baiduAPILoadr() {
var that = this
var libs = [
"https://mapopen.bj.bcebos.com/github/BMapGLLib/InfoBox/src/InfoBox.min.js", //添加百度BMapGLLib信息窗js
"https://mapopen.bj.bcebos.com/github/BMapGLLib/DrawingManager/src/DrawingManager.min.js", //添加要素编辑器js
// 'https://mapopen.bj.bcebos.com/github/BMapGLLib/Lushu/src/Lushu.min.js', //轨迹动画js
"https://api.map.baidu.com/library/LuShu/gl/src/LuShu_min.js",
"https://mapopen.bj.bcebos.com/github/BMapGLLib/RichMarker/src/RichMarker.min.js" //富文本标记
]
this.libslen = libs.length
this.count = 0
return new Promise((resolve, reject) => {
// // 如果已加载直接返回
// if (typeof window.BMapGL !== 'undefined') {
// resolve(window.BMapGL)
// }
// 插入script脚本
var load = this.addScript()
if (!load) {
resolve(window.BMapGL) // 如果已加载直接返回
}
// 异步加载回调处理
window.onBMapCallback = function () {
that.blibs = []
libs.forEach((lib) => {
that.loadLib(lib, resolve, reject)
})
console.log("API初始化成功...")
}
})
}
static loadLib(src, resolve, reject) {
var sLib = document.createElement("script")
sLib.setAttribute("type", "text/javascript")
sLib.setAttribute("async", "sync")
sLib.src = src
document.body.appendChild(sLib)
this.blibs.push(sLib)
sLib.onerror = function () {
reject("API初始化失败...")
}
var that = this
sLib.onload = function (e) {
that.count += 1
if (that.count === that.libslen) {
// libs全部加载成功才返回
resolve(window.BMapGL, window.BMapGLLib)
}
}
}
static removeScript() {
if (this.scriptElement) {
document.body.removeChild(this.scriptElement)
this.scriptElement = null
}
var css = document.querySelector(`link[href*="baidu.com/"]`)
if (css) {
css.parentElement.removeChild(css)
}
var charset = document.querySelector(`script[src*="baidu.com/"]`)
if (charset) {
charset.parentElement.removeChild(charset)
}
}
static addScript() {
var scripts = document.getElementsByTagName("script")
var add = true
for (var i = 0; i < scripts.length; i++) {
if (scripts[i] && scripts[i].src && scripts[i].src.indexOf(this.url) != -1) {
add = false
}
}
if (add) {
this.scriptElement = document.createElement("script")
this.scriptElement.setAttribute("type", "text/javascript")
this.scriptElement.setAttribute("async", "sync")
this.scriptElement.src = this.url
document.body.appendChild(this.scriptElement)
}
return add
}
static async esriAPILoader(css) {
const options = {
url: this.url,
srcKey: "data-esri-loader"
}
return loadScript(options).then(function () {
loadCss(css)
})
}
static removeLibs() {
this.blibs.forEach((lib) => {
document.body.removeChild(lib)
})
var scripts = document.getElementsByTagName("script")
let arr = Array.from(scripts)
arr.forEach((s) => {
if (s.src.indexOf("BMapGLLib") != -1 || s.src.indexOf("api.map.baidu.com") != -1) {
document.body.removeChild(s)
}
})
this.blibs = []
}
static unLoad(type) {
var unloadType = window.mapconfig.mapType
if (type) {
unloadType = type
}
switch (unloadType) {
case mapType.Gaode:
var script = document.querySelector("script[data-gd-loader]")
if (script) {
script.parentElement.removeChild(script)
}
var style = document.getElementById("AMap_Dynamic_style")
if (style) {
style.parentElement.removeChild(style)
}
break
case mapType.BD:
this.removeScript()
this.removeLibs()
break
case mapType.SuperAPI:
var script = document.querySelector("script[data-super-loader]")
if (script) {
script.parentElement.removeChild(script)
}
break
case mapType.Esri:
// //esriLoader.isLoaded() 通过window.require 判断是否加载。delete后初始化require错误
if (isLoaded()) {
var script = document.querySelector("script[data-esri-loader]")
if (script) {
script.parentElement.removeChild(script)
}
var css = document.querySelector(`link[href*="${window.mapconfig.mapstyle}"]`)
if (css) {
css.parentElement.removeChild(css)
}
var widgetcss = document.querySelector(`link[href*="${window.mapconfig.widgetstyle}"]`)
if (widgetcss) {
widgetcss.parentElement.removeChild(widgetcss)
}
var lastInd = window.mapconfig.apiUrl.lastIndexOf("/")
if (lastInd > -1) {
// 移除module.js
var eles = document.querySelectorAll(`script[src ^='` + window.mapconfig.apiUrl.slice(0, lastInd) + `']`)
eles.forEach((element) => {
element.remove()
})
}
delete window.define //高德api共用此变量,切换时删除
// delete window.$arcgis //无法删除,只读属性
delete window.$arcgis //修改本地api,允许删除
delete window.require //切换3x,移除
delete window.dojoConfig //切换3x,移除
}
break
}
}
}