class Streetscape { constructor(sgworld, option = {}) { this.sgworld = sgworld this.streetscape_alpha = option.alpha || 1; /** * * 街景服务参数 * */ this.streetSphere_data = { StreetUrl: option.StreetUrl, getImageRootUrl: option.StreetUrl + "/Image3DResourceService/GetImageTile/?ImageID=", getImageInfo: option.StreetUrl + '/Image3DResourceService/GetImageInfo/?ImageID=', getFirstImageDir: "&zoom=0", getSecondImageDir: "&zoom=4", lon: option.lon, lat: option.lat } this.setStreetScapeUrl() this.init() } //设置街景接口响应回调 setStreetViewData(StreetViewData, datas) { StreetViewData.getImageTileID = datas.Station.StationID; StreetViewData.lon = datas.Station.X; StreetViewData.lat = datas.Station.Y; StreetViewData.height = datas.Station.H; StreetViewData.HeadingPitchRoll = { heading: datas.Station.Yaw, pitch: datas.Station.Pitch, roll: datas.Station.Roll, }; this.getLinksData(StreetViewData) } // 立德街景前后数据 getLinksData(StreetViewData) { this.sgworld.core.xhr({ url: this.StreetScapeOption.getInitImageSequenceById.replace('{id}', StreetViewData.getImageTileID) + '&Step=1', type: 'get', dataType: 'json', success: data => { this.setLinksData(0, data, StreetViewData, () => { this.StreetView.createNavigation() }) } }) this.sgworld.core.xhr({ url: this.StreetScapeOption.getInitImageSequenceById.replace('{id}', StreetViewData.getImageTileID) + '&Step=-1', type: 'get', dataType: 'json', success: data => { this.setLinksData(-1, data, StreetViewData, () => { this.StreetView.createNavigation() }) } }) } setLinksData(step, data, StreetViewData, callback) { let angle = StreetViewData.HeadingPitchRoll.heading + step * 180 let links = [] if (data.StationItems) { links = data.StationItems.filter(item => { return item.Station.StationID !== StreetViewData.getImageTileID }) } let type = step === -1 ? 'prev' : 'next' if (links.length) { let link = links[0].Station StreetViewData.linkImagesData.push({ type: type, name: link.Address, ImageID: link.StationID, NavigationAngle: angle, Position: [link.X, link.Y, link.H] }); // callback && callback() } else { StreetViewData.linkImagesData.push({ type: type, name: data.StationItems[0].Station.Address, NavigationAngle: angle }); } callback && callback() } // 立德街景交叉口数据 getJoinsData(StreetViewData, callback) { this.sgworld.core.xhr({ url: this.StreetScapeOption.getInitImageJointsById.replace('{id}', StreetViewData.getImageTileID), type: 'get', dataType: 'json', success: data => { if (data.Junction) { this.pervJoinsID = StreetViewData.getImageTileID callback && callback(data.Junction || []) } else { this.sgworld.core.xhr({ url: this.StreetScapeOption.getInitImageJointsById.replace('{id}', this.pervJoinsID), type: 'get', dataType: 'json', success: data => { if (data.Junction) { callback && callback(data.Junction || []) } else { layer.msg(data.Message); } } }) } } }) } selectJoinsCallBack() { this.getJoinsData(this.StreetView.StreetViewData, join => { let btn = [] let linkImagesData = [] let btnFun = {} join.forEach((item, index) => { btn.push(item.RoadName) let data = { ImageID: item.StationID, NavigationAngle: item.Angle - 180, Position: [item.X, item.Y, item.H] } let btnFunEvent = (layerindex) => { layer.close(layerindex); this.getImageInfo(data.ImageID, () => { this.StreetView.MoveToLinkImage(data) }) } if (!index) { btnFun['yes'] = btnFunEvent } else { btnFun['btn' + (index + 1)] = btnFunEvent } linkImagesData.push(data); }) layer.msg('请选择道路', { time: 10000, btn: btn, ...btnFun }); }) } setImageDataCallback(StreetViewData, data) { if (data && data.Sizes) { let size = data.Sizes[0] let width = size.Width let height = size.Height StreetViewData.row = Math.ceil(height / 512) StreetViewData.col = Math.ceil(width / 512) StreetViewData.maxWidth = width StreetViewData.maxHeight = height } } getImageInfo(id, callback) { this.sgworld.core.xhr({ url: this.streetSphere_data.getImageInfo + id, type: 'get', dataType: 'json', success: data => { this.setImageDataCallback(this.StreetView.StreetViewData, data) callback && callback() } }) } getImageDataByPosition(position, callback) { let url = this.StreetView.getInitImageByPositionURL(position) this.sgworld.core.xhr({ url: url, type: 'get', dataType: 'json', success: data => { callback && callback(data) } }) } //设置街景接口 setStreetScapeUrl() { this.StreetScapeOption = { type: 'lide', getInitImageByPosition: '/Image3DIndexService/GetStationByCoord/?x={lon}&tolerance=0%2E0005&type=4&y={lat}', getInitImageJointsById: '/Image3DIndexService/GetStationJoints/?direction=1&StationID={id}', getInitImageSequenceById: '/Image3DIndexService/GetStationSequence/?StationID={id}', getInitImageById: '', getSecondImageById: '', getInitImageByPositionCallBack: this.setStreetViewData.bind(this), getImageInfoByIdCallBack: this.setStreetViewData.bind(this), selectJoinsCallBack: this.selectJoinsCallBack.bind(this), setImageDataCallback: this.setImageDataCallback.bind(this) } this.StreetScapeOption.getInitImageByPosition = this.streetSphere_data.StreetUrl + this.StreetScapeOption.getInitImageByPosition; this.StreetScapeOption.getInitImageJointsById = this.streetSphere_data.StreetUrl + this.StreetScapeOption.getInitImageJointsById; this.StreetScapeOption.getInitImageSequenceById = this.streetSphere_data.StreetUrl + this.StreetScapeOption.getInitImageSequenceById; this.StreetScapeOption.getInitImageById = this.streetSphere_data.getImageRootUrl + '{id}' + this.streetSphere_data.getFirstImageDir; this.StreetScapeOption.getSecondImageById = this.streetSphere_data.getImageRootUrl + '{id}' + this.streetSphere_data.getSecondImageDir; this.StreetScapeOption.getImageInfo = this.streetSphere_data.getImageInfo; } // 初始化街景 init() { this.exit() this.sgworld.camera.stop(); //取消飞行状态 this.StreetView = this.sgworld.analysis.StreetViewOpen({ lon: this.streetSphere_data.lon, lat: this.streetSphere_data.lat }, this.StreetScapeOption, () => { //创建滑动按钮 this.createSlider(); ///创建退出按钮 this.createExitButton(); }); this.setOpacity(this.streetscape_alpha); } //退出街景 exit() { if (this.StreetView) { this.StreetView.exit(); this.StreetView = null; this.sliderContainer && this.sliderContainer.remove(); //移除退出按钮 this.exitContainer && this.exitContainer.remove(); this.sliderContainer = this.exitContainer = undefined } } // 跳转位置 changePosition(position) { this.streetSphere_data.lon = position.lon; this.streetSphere_data.lat = position.lat; this.StreetView.StreetViewData.isTwoTextures = false; this.StreetView.StreetViewData.isThreeTextures = false; this.StreetScapeOption.flyTime = 1; this.init(); } // 更新服务 changeServer(StreetUrl) { this.streetSphere_data.StreetUrl = StreetUrl; this.streetSphere_data.getImageRootUrl = StreetUrl + "/Image3DResourceService/GetImageTile/?ImageID="; this.streetSphere_data.getImageInfo = StreetUrl + '/Image3DResourceService/GetImageInfo/?ImageID='; this.StreetView.StreetViewData.isTwoTextures = false; this.StreetView.StreetViewData.isThreeTextures = false; this.setStreetScapeUrl(); this.StreetScapeOption.flyTime = 1; this.init(); } // 下一步 nextStep() { let linkImageData = this.StreetView.StreetViewData.linkImagesData.find(item => { return item.type === "next" }) linkImageData && this.StreetView.MoveToLinkImage(linkImageData); } // 上一步 prevStep() { let linkImageData = this.StreetView.StreetViewData.linkImagesData.find(item => { return item.type === "prev" }) linkImageData && this.StreetView.MoveToLinkImage(linkImageData); } //设置街景球透明度 setOpacity(alpha) { this.streetscape_alpha = alpha if (this.StreetView) { this.StreetView.setOpacity(alpha); } } //创建透明度滑动条 createSlider() { var div = '
'; $(document.body).append(div); this.sliderContainer = $('#streetScapeSlider'); layui.use('slider', () => { var slider = layui.slider; slider.render({ elem: '#opacity-streetScape', theme: '#1E9FFF', min: 0 //最小值 , max: 100 //最大值 , value: this.streetscape_alpha * 100, change: (value) => { this.setOpacity(value / 100); } }); }); } //创建退出按钮 createExitButton() { let div = '
'; $(document.body).append(div); this.exitContainer = $('#streetScapeExitButton'); this.exitContainer.click(() => { this.exit() }) } }