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
|