UNPKG

@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
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 } } }