@tslsmart/map_adapter
Version:
an adapter for maps,基于高德JSAPI 2.0,百度JavaScript API GL,arcgis api for javascript 3.23,光辉城市及51world sdk
610 lines (598 loc) • 19.5 kB
JavaScript
import { mapType } from "../js/MapLocalConfig"
import SheencityAdapter from "../js/SheencityAdapter"
import WYAdapter from "../js/WYAdapter"
import TacosAdapterV4 from "../js/TacosAdapterV4"
/**
* @class Map3DAdapter
* @classdesc 3d地图接口适配器
* 约定:
* 1、id作为唯一标识
*/
export class Map3DAdapter {
/**
* 构造函数
* @param {string} div 地图容器dom id
*/
constructor(div) {
switch (window.mapconfig.mapType) {
case mapType.Diva:
this.mapInstance = new SheencityAdapter(div, window.mapconfig.url, window.mapconfig.key, window.mapconfig.log)
break
case mapType.SuperAPI:
this.mapInstance = new WYAdapter(div, window.mapconfig.url, window.mapconfig.key)
break
case mapType.TacosSDK:
// if (window.mapconfig.version && window.mapconfig.version == 4) {
this.mapInstance = new TacosAdapterV4(div)
// } else {
// this.mapInstance = new TacosAdapter(div)
// }
break
}
}
// async consFunc(div, callback) {
// switch (window.mapconfig.mapType) {
// case mapType.Diva:
// var mMapAdapter = await import('../js/SheencityAdapter.js')
// this.mapInstance = new mMapAdapter.default(div, window.mapconfig.url, window.mapconfig.key)
// break
// case mapType.SuperAPI:
// var mMapAdapter = await import('../js/WYAdapter.js')
// this.mapInstance = new mMapAdapter.default(div, window.mapconfig.url, window.mapconfig.key)
// break
// case mapType.TacosSDK:
// var mMapAdapter = await import('../js/TacosAdapter.js')
// this.mapInstance = new mMapAdapter.default(
// div,
// window.mapconfig.url,
// window.mapconfig.mapping,
// window.mapconfig.modelPath
// )
// break
// }
// this.mapInstance.initialInstance(function (map) {
// callback(map)
// })
// }
/**
* 加载地图实例
* @param {Event} callback 加载地图实例回调函数
*/
loading(callback) {
// this.consFunc(this.div, callback)
this.mapInstance.initialInstance(function (map) {
callback(map)
})
}
/**
* 加载场景
* @param {object} sceneOpts 场景参数 {name:'',changeCamera:true/false}
* @param {function} callback 回调函数
*/
loadScene(sceneOpts, callback) {
this.mapInstance.loadScene(sceneOpts, function (e) {
callback(e)
})
}
/**
* 设置镜头参数
* @param {CameraInfo} info 镜头参数类
* @returns 成功、失败回调
*/
setCameraInfo(info) {
return this.mapInstance.setCameraInfo(info)
}
/**
* 获得镜头参数
* @returns CameraInfo 镜头参数
*/
async getCameraInfo() {
return await this.mapInstance.getCameraInfo()
}
/**
* 设置镜头绕场景中心点旋转
* @param {number} time 旋转一周所需要的时间,单位秒
* @param {RotateDirection} direction 旋转方向,clockwise:顺时针; anticlockwise:逆时针; stop:停止旋转
* @returns 成功、失败回调
*/
setCameraRotate(options) {
return this.mapInstance.setCameraRotate(options)
}
/**
* 场景镜头限制
* @param {object} options 镜头参数
* @param {number[]} options.pitch 俯仰角范围
* @param {number[]} options.yaw 偏航角范围
* @param {object} options.boundingBox {min:[x1,y1,z1],max:[x2,y2,z2]} 镜头坐标限制范围
* @param {number} options.minDistance 最小镜头距离
* @param {number} options.maxDistance 最大镜头距离
* @param { boolean} options.isGeoData 镜头坐标范围是否为经纬度
*/
setCameraLimit(options) {
return this.mapInstance.setCameraLimit(
options.pitch,
options.yaw,
options.boundingBox,
options.minDistance,
options.maxDistance,
options.isGeoData
)
}
/**
* 设置渲染分辨率(51World和光辉城市支持)
* @param {number} width 宽
* @param {number} height 高
*/
setResolution(width, height) {
return this.mapInstance.setResolution(width, height)
}
/**
* 取消镜头限制
*/
removeCameraLimit() {
return this.mapInstance.removeCameraLimit()
}
/**
* 开启镜头移动
* @param {object} options 镜头移动参数
* @param {number} options.duration 漫游持续时间
* @param {number} options.speed 漫游速度,单位米/秒
* @param {boolean} options.loop 是否循环
* @param {number} options.armDistance 镜头沿视角到路径的距离,单位米
* @param {number} options.roll 翻滚角
* @param {number} options.pitch 俯仰角
* @param {number} options.yaw 偏航角
* @param {number[][]} options.path 路径点
* @param {array} coordinate 路径点(经纬度)
* @returns 成功、失败回调
*/
async startThirdPersonRoaming(options) {
return await this.mapInstance.startThirdPersonRoaming(options)
}
/**
* 暂停镜头移动
* @returns 成功、失败回调
*/
pauseThirdPersonRoaming() {
return this.mapInstance.pauseThirdPersonRoaming()
}
/**
* 继续镜头移动
* @returns 成功、失败回调
*/
continueThirdPersonRoaming() {
return this.mapInstance.continueThirdPersonRoaming()
}
/**
* 停止镜头移动
* @returns 成功、失败回调
*/
stopThirdPersonRoaming() {
return this.mapInstance.stopThirdPersonRoaming()
}
/**
* 开始播放动画(diva,51world,tacos)
* @param {object} options 动画播放参数
* @param {string} objId 实体对象id
* @param {string} name 动画名称
* @param {number} start 起始帧
* @param {number} end 结束帧
* @param {boolean} loop 是否循环
*/
async playAnimation(options) {
return await this.mapInstance.playAnimation(options)
}
/**
* 暂停动画播放
*/
async pauseAnimation(id) {
return await this.mapInstance.pauseAnimation(id)
}
/**
* 继续动画播放
*/
async continueAnimation(id) {
return await this.mapInstance.continueAnimation(id)
}
/**
* 停止动画播放
*/
async stopAnimation(id) {
return await this.mapInstance.stopAnimation(id)
}
/**
* 镜头聚焦实体
* @param {string} id 聚焦目标实体的 id
* @param {number} distance 距离,单位米
* @param {EntityType} type 物体类型
* @returns 成功、失败回调
*/
focusEntity(options) {
return this.mapInstance.focusEntity(options)
}
/**
* 销毁实体
* @param {string} id 需要销毁的实体id
* @param {EntityType} type 物体类型
* @returns 成功、失败回调
*/
async destroyEntity(id, type) {
return await this.mapInstance.destroyEntity(id, type)
}
/**
* 高亮实体
* @param {string} id 高亮实体id
* @param {number[]} borderColor 高亮实体边颜色[r,g,b]
* @param {number[]} color 实体外立面颜色[r,g,b,a] (51,diva)
* @param {number} borderSize 边框宽 (diva)
* @param {object} flashingOpts 描边动效参数(diva)
* @param {boolean} flashingOpts.enabled 是否启动描边动效(diva)
* @param {number[]} flashingOpts.color 实体外表面颜色[r,g,b](diva)
* @param { number} flashingOpts.duration 循环周期,单位s(diva)
* @param {number } flashingOpts.intensity 循环强度(diva)
* @returns 成功、失败回调
*/
highlightEntity(options) {
return this.mapInstance.highlightEntity(
options.id,
options.borderColor,
options.color,
options.borderSize,
options.flashingOpts
)
}
/**
* 取消高亮实体
* @param {string} id 取消高亮实体id
* @returns 成功、失败回调
*/
restoreEntity(id) {
return this.mapInstance.restoreEntity(id)
}
/**
* 隐藏实体
* @param {array} options.ids 隐藏实体id数组
* @param {string} options.path 隐藏实体所在路径(diva)
* @returns 成功、失败回调
*/
hideEntity(options) {
return this.mapInstance.hideEntity(options.ids, options.path)
}
/**
* 显示实体
* @param {array} options.ids 显示实体id数组
* @param {string} options.path 显示实体所在路径(diva)
* @returns 成功、失败回调
*/
showEntity(options) {
return this.mapInstance.showEntity(options.ids, options.path)
}
/**
* 创建POI
* @param {POI} poidata POI点数据类
* @returns 成功、失败回调
*/
addPOI(poidata) {
return this.mapInstance.addPOI(poidata)
}
updatePOI(poidata) {
return this.mapInstance.updatePOI(poidata)
}
/**
* 根据id获取实体信息
* 【注:51world superapi 需要点击对应实体获得id】
* @param {string} id 实体id
* @returns 实体信息
*/
getEntityByID(id) {
return this.mapInstance.getEntityByID(id)
}
/**
* 获取场景内所有实体
* @returns 场景内所有实体信息
*/
getAllEntityIds() {
return this.mapInstance.getAllEntityIds()
}
// getClickPosition () {
// return this.mapInstance.getClickPosition()
// }
/**
* 设置环境时间
* @param {number} datetime 时间戳
* @returns 成功、失败回调
*/
setDateTime(datetime) {
return this.mapInstance.setDateTime(datetime)
}
/**
* 设置天气
* @param {Weather} name 天气
* @returns 成功、失败回调
*/
setWeather(name) {
return this.mapInstance.setWeather(name)
}
/**
* 创建热力图
* @param {object} options 热力图参数
* @param {string} options.id 热力图id
* @param {number} options.radius 热力半径,单位米
* @param {number[]} options.minCoord 区域最小坐标 [x,y,z]
* @param {number[]} options.maxCoord 区域最大坐标 [x,y,z]
* @param {number[][]} options.posvalue 位置与数据,[[x,y,value],..]
* @param { boolean} options.isGeoData 热力数据是否为经纬度
* @returns 成功、失败回调
*/
async createHeatmap(options) {
return await this.mapInstance.createHeatmap(options)
}
/**
* 创建弹窗
* @param {object} options 弹窗参数
* @param {string} options.poiId 需要创建弹窗的实体id
* @param {string} options.windowID 创建弹窗的id
* @param {string} options.windowUrl 弹窗内容html地址
* @param {number} options.width 窗口宽,单位像素
* @param {number} options.height 窗口高,单位像素
* @param {number} options.xoffset 弹窗左上角相对横向偏移量,单位像素
* @param {number} options.yoffset 弹窗左上角相对纵向偏移量,单位像素
* @param {EntityType} options.type 要创建弹窗的实体类型
* @returns 成功、失败回调
*/
async addInfowindow(options) {
return await this.mapInstance.addInfowindow(options)
}
/**
* 销毁弹窗
*【注:51world superapi存在无法取消实体选中状态问题,若再次addInfowindow需要点击两次,第一次取消实体焦点,第二次点击实体出现弹窗】
* @param {string} poiId 绑定弹窗的实体id
* @param {string} windowID 弹窗id
* @param {EntityType} type 绑定弹窗的实体类型
* @returns 成功、失败回调
*/
async destroyInfowindow(poiId, windowID, type) {
return await this.mapInstance.destroyInfowindow(poiId, windowID, type)
}
/**
* 更新弹窗位置(tacos 4)
* @param {*} options
* @returns
*/
async updateInfowindow(options) {
return await this.mapInstance.updateInfowindow(options.id, options.position)
}
/**
* 楼层展开(diva)
* diva 支持两种方式,【1.按楼层id数组展开。2.按楼层目录结构展开】
* @param {object} options 展开楼层参数
* @param {string} options.building 需要展开的建筑id/需要展开的建筑路径(diva,从根目录开始,e.g., 产业园区/楼栋/1#)
* @param {string[]} options.floorIds 需要展开的楼层id/楼层文件路径(tacos)
* @param {number} options.space 展开后楼层间间隔距离,单位米
* @param {string} options.floor 楼层号
* @param {number} options.floorHeight 楼层高度,单位米(diva)
* @returns 成功、失败回调
*/
explodeEntity(options) {
return this.mapInstance.explodeEntity(options)
}
/**
* 楼层还原
* @param {string} buildingId 需要展开的建筑id/建筑路径(diva)
* @param {string[]} floorIds 需要展开的楼层id
* @returns 成功、失败回调
*/
unexplodedEntity(buildingId, floorIds) {
return this.mapInstance.unexplodedEntity(buildingId, floorIds)
}
/**
* 显示楼层平面
* @param {object} options 楼、层参数
* @param {string} buildingId 需要显示楼层的建筑(diva为建筑路径,从根目录开始,e.g., 产业园区/楼栋/1#)
* @param {string} floor 显示的楼层id,若缺失,显示整个建筑
* @param {string} pattern 匹配楼层路径正则表达式(仅diva)
* @returns 成功、失败回调
*/
async exploreFloor(options) {
return await this.mapInstance.exploreFloor(options)
}
/**
* 添加模型实体
* @param {object} options 模型参数
* @param {string} options.id 模型实体id
* @param {number[]} options.position 位置 [x,y,z]
* @param {string} options.resourceName 资源库中资源的名称
* @param {number} options.roll 翻滚角
* @param {number} options.pitch 俯仰角
* @param {number} options.yaw 偏航角
* @param {number[]} options.scale 比例 [scaleX,scaleY,scaleZ]
* @returns 成功、失败回调
*/
addModel(options) {
return this.mapInstance.addModel(options)
}
/**
* 开启模型移动
* @param {object} options 模型移动参数
* @param {string} options.id 模型实体id
* @param {number} options.duration 移动持续时间
* @param {number} options.speed 速度,单位米/秒
* @param {boolean} options.loop 是否循环
* @param {number[][]} options.path 路径点
* @param {number} options.roll 翻滚角
* @param {number} options.pitch 俯仰角
* @param {number} options.yaw 偏航角
* @returns 成功、失败回调
*/
startEntityMoving(options) {
return this.mapInstance.startEntityMoving(options)
}
/**
* 暂停模型移动
* @param {string} id 模型实体id
* @returns 成功、失败回调
*/
pauseEntityMoving(id) {
return this.mapInstance.pauseEntityMoving(id)
}
/**
* 继续模型移动
* @param {string} id 模型实体id
* @returns 成功、失败回调
*/
resumeEntityMoving(id) {
return this.mapInstance.resumeEntityMoving(id)
}
/**
* 停止模型移动
* @param {string} id 模型实体id
* @returns 成功、失败回调
*/
stopEntityMoving(id) {
return this.mapInstance.stopEntityMoving(id)
}
/**
* 创建特效
* @param {object} options 特效参数
* @param {string} options.id 特效id
* @param {string} options.resourceName 资源库中资源的名称
* @param {number[]} options.position 特效位置,[x,y,z]
* @param {number} options.roll 翻滚角
* @param {number} options.pitch 俯仰角
* @param {number} options.yaw 偏航角
* @param {number[]} options.scale 比例 [scaleX,scaleY,scaleZ]
* @returns 成功、失败回调
*/
async addEffect(options) {
return await this.mapInstance.addEffect(options)
}
/**
* 创建三维文字(51world,diva)
* @param {object} options 文字参数
* @param {string} options.id 文字id
* @param {string} options.text 文字内容
* @param {number[]} options.position 文字位置,[x,y,z]
* @param {number[]} options.color 颜色 [r,g,b,a]
* @param {number} options.roll 翻滚角
* @param {number} options.pitch 俯仰角
* @param {number} options.yaw 偏航角
* @param {number[]} options.scale 比例 [scaleX,scaleY,scaleZ]
* @param {number} options.thickness 厚度
* @returns 成功、失败回调
*/
add3dText(options) {
return this.mapInstance.add3dText(
options.id,
options.text,
options.position,
options.coordinate,
options.color,
options.roll,
options.pitch,
options.yaw,
options.scale,
options.thickness
)
}
/**
* 更新三维文字(51world,diva)
* @param {object} options 更新文字参数
*/
update3dText(options) {
return this.mapInstance.update3dText(options)
}
/**
* 创建路径
* @param {object} options 路径参数
* @param {string} id 路径id
* @param {number[][]} path 路径点
* @param {PathStyle} pathStyle 路径样式
* @param {string} pathStyleName 路径样式名
* @param {number[]} color 颜色 [r,g,b,a]
* @param {number} width 宽度
* @returns 成功、失败回调
*/
async addPath(options) {
return await this.mapInstance.addPath(options)
}
/**
* 创建区域
* @param {object} options 区域参数
* @param {string} id 区域id
* @param {number[][]} path 路径点
* @param {AreaStyle} areaStyle 区域样式(立面)
* @param {number[]} color 颜色 [r,g,b,a]
* @param {number} height 区域高度,单位米
* @param {AreaStyle} topStyle 区域样式(顶面)
* @param {AreaStyle} bottomStyle 区域样式(底面)
* @returns 成功、失败回调
*/
async addArea(options) {
return await this.mapInstance.addArea(options)
}
/**
* 设置模型变换参数
* @param {object} options
* @returns
*/
setModelTransform(options) {
return this.mapInstance.setModelTransform(
options.id,
options.duration,
options.position,
options.coordinate,
options.roll,
options.pitch,
options.yaw,
options.scale,
options.loop
)
}
/**
* 复原,停止模型变换
* @param {string} id 停止模型变换id
* @param {boolean} reset 是否恢复最初状态
* @returns
*/
resetModelTransform(id, reset) {
return this.mapInstance.resetModelTransform(id, reset)
}
/**
* 销毁实例
*/
destroyMap() {
this.mapInstance.destroyMap()
}
/**
*注册鼠标事件
* @param {string} eventType mouseover,mouseout,click,
* @param {function} callback
*/
on(eventType, callback) {
this.mapInstance.addEventListener(eventType, function (e) {
callback(e)
})
}
/**
* 移除鼠标事件
* @param {string} eventType mouseover,mouseout,click,
*/
off(eventType) {
this.mapInstance.removeEventListener(eventType)
}
subscribeEvents(eventType, callback) {
this.mapInstance.subscribeEvents(eventType, function (e) {
callback(e)
})
}
unsubscribeEvents(eventType) {
this.mapInstance.unsubscribeEvents(eventType)
}
// enableDragging (name) {
// this.mapInstance.mapEditor.enableDragging(name)
// }
// disableDragging () {
// }
// saveEditing () {
// }
}