217 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			217 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | /** | |||
|  |  * @name: index | |||
|  |  * @author: Administrator | |||
|  |  * @date: 2023-03-04 10:39 | |||
|  |  * @description:index | |||
|  |  * @update: 2023-03-04 10:39 | |||
|  |  */ | |||
|  | import { getHost, getToken } from "../../../on"; | |||
|  | import Base from '../index' | |||
|  | import Tools from '../../../Tools' | |||
|  | import { syncSplitData } from "../../../Global/SplitScreen"; | |||
|  | import { syncData, getSdk as get2DSdk } from '../../../Global/MultiViewportMode' | |||
|  | import { setActiveViewer, closeRotateAround, closeViewFollow} from '../../../Global/global' | |||
|  | 
 | |||
|  | class GeoJson extends Base { | |||
|  |   /** | |||
|  |    * @constructor | |||
|  |    * @param sdk | |||
|  |    * @param options {object} 参数 | |||
|  |    * @param options.id {string} id | |||
|  |    * @param options.url {string} geojson地址 | |||
|  |    * @param [options.color=#ef0606] {string} 线条颜色 | |||
|  |    * @param [options.width=1] {number}  线条宽度 | |||
|  |    * @example new YJ.Obj.GeoJson(earth,{id:"123",url:""}) | |||
|  |    * */ | |||
|  |   constructor(sdk, options = {}) { | |||
|  |     super(sdk, options) | |||
|  | 
 | |||
|  |     this.primitive = undefined | |||
|  |     this.positions = [] | |||
|  |      | |||
|  | 
 | |||
|  |     this.loading = true | |||
|  |   } | |||
|  | 
 | |||
|  |   setDefaultValue() { | |||
|  |     super.setDefaultValue() | |||
|  |     this.options.host = this.options.host || getHost() | |||
|  |     // let url = this.options.url
 | |||
|  |     // if (this.options.host) {
 | |||
|  |     //   let o = new URL(this.options.url, this.options.host)
 | |||
|  |     //   url = o.href
 | |||
|  |     // }
 | |||
|  | 
 | |||
|  |     // this.options.url = url
 | |||
|  |     this.options.color = this.options.color || 'rgb(239, 6, 6, 1)' | |||
|  |     this.options.width = this.options.width || 1 | |||
|  |   } | |||
|  | 
 | |||
|  |   get show() { | |||
|  |     return this.options.show | |||
|  |   } | |||
|  | 
 | |||
|  |   // set show(status) {
 | |||
|  |   //   let sdkD = get2DSdk().sdkD
 | |||
|  |   //   if (!this.isShowView || !sdkD) {
 | |||
|  |   //     this.options.show = status
 | |||
|  |   //   }
 | |||
|  |   //   if (this.entity) {
 | |||
|  |   //     if (!this.showView || this.showView == 3 || !sdkD) {
 | |||
|  |   //       for (let i = 0; i < this.entity.entities.values.length; i++) {
 | |||
|  |   //         this.entity.entities.values[i].show = this.options.show
 | |||
|  |   //       }
 | |||
|  |   //     }
 | |||
|  |   //     else {
 | |||
|  |   //       for (let i = 0; i < this.entity.entities.values.length; i++) {
 | |||
|  |   //         this.entity.entities.values[i].show = false
 | |||
|  |   //       }
 | |||
|  |   //     }
 | |||
|  |   //   }
 | |||
|  |   //   syncData(this.sdk, this.options.id)
 | |||
|  |   //   syncSplitData(this.sdk, this.options.id)
 | |||
|  |   //   this.isShowView = false
 | |||
|  |   // }
 | |||
|  |   set show(status) { | |||
|  |     this.options.show = status | |||
|  |     if (this.entity) { | |||
|  |       for (let i = 0; i < this.entity.entities.values.length; i++) { | |||
|  |         this.entity.entities.values[i].show = status | |||
|  |       } | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   async on() { | |||
|  |     let url = "" | |||
|  |     if (this.options.host.endsWith("yjearth4.0")) | |||
|  |       url = this.options.host + '/data/service/getFile' | |||
|  |     else | |||
|  |       url = this.options.host + '/yjearth4.0/data/service/getFile' | |||
|  |     url = url + '?path=' + encodeURIComponent(this.options.url) | |||
|  |     let rsp = await fetch(url, { | |||
|  |       method: 'get', | |||
|  |       headers: { | |||
|  |         'Content-Type': 'application/json', | |||
|  |         "token": getToken(), | |||
|  |         "Authorization": "Bearer " + getToken(), | |||
|  |       } | |||
|  |     }) | |||
|  |     let json = await rsp.json() | |||
|  |     this.geojson = json | |||
|  |     // this.sdk.addIncetance(this.options.id, this)
 | |||
|  |     return GeoJson.addDataToGlobe(this, json.features) | |||
|  |   } | |||
|  | 
 | |||
|  |   /*geojosn暂时只用线的形式*/ | |||
|  |   static addDataToGlobe(that) { | |||
|  |     const geoJsonDataSource = new Cesium.GeoJsonDataSource(); | |||
|  |     let geojson = that.deepCopyObj(that.geojson) | |||
|  |     for (let i = 0; i < geojson.features.length; i++) { | |||
|  |       if (!geojson.features[i].id) { | |||
|  |         geojson.features[i].id = that.options.id + '_' + i | |||
|  |       } | |||
|  |     } | |||
|  |     // console.log(geojson)
 | |||
|  |     let promise = geoJsonDataSource.load(geojson, { | |||
|  |       clampToGround: true, | |||
|  |     }); | |||
|  |     return promise.then(datasource => { | |||
|  |       that.entity = datasource | |||
|  |       datasource.entities.values.forEach(enetity => { | |||
|  |         // console.log(enetity)
 | |||
|  |         let color = Cesium.Color.fromCssColorString(that.options.color) | |||
|  |         let colorPolygon = color.withAlpha(0.2) | |||
|  |         enetity.show = that.options.show | |||
|  |         that.sdk.viewer.entities.add(enetity) | |||
|  |         if (enetity.billboard) { | |||
|  |           enetity.billboard.heightReference = Cesium.HeightReference.CLAMP_TO_GROUND | |||
|  |           enetity.point = new Cesium.PointGraphics({ | |||
|  |             show: true, | |||
|  |             color: color, // 点的颜色
 | |||
|  |             pixelSize: 10, // 点的大小
 | |||
|  |             heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, | |||
|  |             disableDepthTestDistance: Number.POSITIVE_INFINITY  // 不应用深度测试
 | |||
|  |           }) | |||
|  |         } | |||
|  | 
 | |||
|  |         if (enetity.polyline) { | |||
|  |           enetity.polyline.material = color | |||
|  |           enetity.polyline.zIndex = that.sdk._entityZIndex | |||
|  |           that.sdk._entityZIndex++ | |||
|  |         } | |||
|  | 
 | |||
|  |         if (enetity.polygon) { | |||
|  |           enetity.polygon.perPositionHeight = false | |||
|  |           enetity.polygon.material = colorPolygon | |||
|  |           enetity.polygon.zIndex = that.sdk._entityZIndex | |||
|  | 
 | |||
|  |           enetity.polyline = new Cesium.PolylineGraphics({ | |||
|  |             positions: enetity.polygon.hierarchy._value.positions, | |||
|  |             width: 1, | |||
|  |             clampToGround: true, | |||
|  |             material: color, | |||
|  |             zIndex: that.sdk._entityZIndex | |||
|  |           }) | |||
|  |           that.sdk._entityZIndex++ | |||
|  |         } | |||
|  |       }) | |||
|  |       that.loading = false | |||
|  |     }) | |||
|  |   } | |||
|  | 
 | |||
|  |   remove() { | |||
|  |     if (this.entity) { | |||
|  |       this.entity.entities.values.forEach(enetity => { | |||
|  |         this.sdk.viewer.entities.remove(enetity) | |||
|  |       }) | |||
|  |       this.entity = null | |||
|  |       this.geojson = {} | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   async flyTo() { | |||
|  |     if (!this.loading) { | |||
|  |       if (this.geojson) { | |||
|  |         setActiveViewer(0) | |||
|  |         closeRotateAround(this.sdk) | |||
|  |         closeViewFollow(this.sdk) | |||
|  | 
 | |||
|  |         let range = turf.bbox(this.geojson); | |||
|  |         if (this.options.customView && this.options.customView.relativePosition && this.options.customView.orientation) { | |||
|  |           let orientation = { | |||
|  |             heading: Cesium.Math.toRadians(this.options.customView.orientation.heading || 0.0), | |||
|  |             pitch: Cesium.Math.toRadians(this.options.customView.orientation.pitch || -60.0), | |||
|  |             roll: Cesium.Math.toRadians(this.options.customView.orientation.roll || 0.0) | |||
|  |           } | |||
|  |      | |||
|  |           let lng = this.options.customView.relativePosition.lng | |||
|  |           let lat = this.options.customView.relativePosition.lat | |||
|  |           let alt = this.options.customView.relativePosition.alt | |||
|  |           let destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt) | |||
|  |      | |||
|  |           let position = { lng: range[0], lat: range[1] } | |||
|  |           // 如果没有高度值,则获取紧贴高度计算
 | |||
|  |           position.alt = await this.getClampToHeight(position) | |||
|  |           lng = this.options.customView.relativePosition.lng + position.lng | |||
|  |           lat = this.options.customView.relativePosition.lat + position.lat | |||
|  |           alt = this.options.customView.relativePosition.alt + position.alt | |||
|  |           destination = Cesium.Cartesian3.fromDegrees(lng, lat, alt) | |||
|  |           this.sdk.viewer.camera.flyTo({ | |||
|  |             destination: destination, | |||
|  |             orientation: orientation | |||
|  |           }) | |||
|  |         } | |||
|  |         else { | |||
|  |           this.viewer.camera.flyTo({ | |||
|  |             destination: Cesium.Rectangle.fromDegrees(...range) | |||
|  |           }); | |||
|  |         } | |||
|  |       } | |||
|  |     } | |||
|  |   } | |||
|  | 
 | |||
|  |   flicker() { } | |||
|  | } | |||
|  | 
 | |||
|  | export default GeoJson |