import { getHost, getToken } from '../../../on' import Base from '../index' import { generatePagination } from '../../Element/Pagination' import { regLeftClickCallback, regRightClickCallback } from '../../../Global/ClickCallback' import richText from '../../Element/richText' import Dialog from '../../Element/Dialog' import { openAllNodeList as OpenAllNodeList } from './openAllNodeList' import { openNodeListById as OpenNodeListById } from './openNodeListById' import { syncData } from '../../../Global/MultiViewportMode' import { syncSplitData } from "../../../Global/SplitScreen"; import { attributeElm } from '../../Element/elm_html' import { Proj } from '../../../Tools/proj' import { legp } from '../../Element/datalist' import { setActiveViewer, getGroundCover, closeRotateAround, closeViewFollow } from '../../../Global/global' import { addCluster, remove_entity_from_cluster } from '../../../Global/cluster/cluster' let colors = require('./color.json') class Vector extends Base { #loadEvent = void 0 #loaded = false #textEntity = [] constructor(sdk, options = {}, _Dialog = {}) { super(sdk, options) this.viewer = sdk.viewer if (!this.options.path) { this.error = '未提供路径!' if (window.ELEMENT) { window.ELEMENT.Message.closeAll() window.ELEMENT.Message({ message: this.error, type: 'warning', duration: 1500 }) } console.warn(this.error) return } this.colors = colors this.options.head_tables = options.head_tables || [] this.options.fileName = options.fileName || '未命名对象' if (!this.options.path.endsWith('.kml')) { ; (this.options.color = options.color || 'rgba(0,255,184,0.5)'), (this.options.opacity = options.opacity || options.opacity === 0 ? options.opacity : 1) } this.options.show = options.show || options.show === false ? options.show : true this.total = 0 this.page = 1 this.pageSize = 20 this.currentData = [] this.data = [] this.list = [] this.imgEntity = [] this.Dialog = _Dialog this._elms = {} this.sdk.addIncetance(this.options.id, this) this.disaster_type_colors = colors[this.options.disaster_type] ? { ...colors[this.options.disaster_type] } : void 0 for (const key in this.disaster_type_colors) { this.disaster_type_colors[key] = this.cmykToRgb( this.disaster_type_colors[key] ) } } get type() { return 'vector' } get show() { return this.options.show } set show(v) { this.setShow(v) } get opacity() { return this.options.opacity } set opacity(v) { this.options.opacity = v if (this.entity) { this.entity.entities.values.forEach(enetity => { if (enetity.point) { enetity.point.color = enetity.point.color._value.withAlpha(v) } if (enetity.polygon) { enetity.polygon.material = enetity.polygon.material.color._value.withAlpha( v ) } if (enetity.polyline) { enetity.polyline.material = enetity.polyline.material.color._value.withAlpha( v ) } }) } } on() { if (!this.sdk || !this.viewer || !this.options.path) { return } return this.init() } async init() { let url = '' this.options.host = this.options.host || getHost() if (this.options.host.endsWith('yjearth4.0')) { url = this.options.host + '/api/v1/vector/load2' } else { url = this.options.host + '/yjearth4.0/api/v1/vector/load2' } url += '?path=' + this.options.path // url = 'json/shp.json' let response = await fetch(url, { method: 'get', headers: { 'Content-Type': 'application/json', token: getToken(), Authorization: 'Bearer ' + getToken() } }) if (response.status === 200) { let arrayBuffer = await response.arrayBuffer() let uint8Array = new Uint8Array(arrayBuffer) let string = this.decompressGzip(uint8Array) if(this.data.length===0) { this.data = JSON.parse(string) } await this.formatData() return Vector.create(this) } } // 格式化数据 async formatData() { let features = [] let _this = this const posConvert = (data, src, dst) => { if (data) { if (Array.isArray(data)) { let flag = false for (let i = 0; i < data.length; i++) { if (typeof data[i] === 'object') { posConvert(data[i], src, dst) } else { flag = true break } } if (flag) { let x = Number(data[0]) let y = Number(data[1]) let res = proj4(src, dst, [x, y]) data[0] = Number(res[0].toFixed(10)) data[1] = Number(res[1].toFixed(10)) } } else { if (data instanceof Object) { posConvert(data.coordinates, src, dst) posConvert(data.geometries, src, dst) } } } } for (let i = 0; i < this.data.list.length; i++) { let crs_src = '' let crs_dst = '' for (let [key, item] of this.name_map) { if (item.def === this.data.list[i].crs_src) { crs_src = item.epsg } if (item.def === this.data.list[i].crs_dst) { crs_dst = item.epsg } } for (let m = 0; m < this.data.list[i].features.length; m++) { this.data.list[i].features[m].properties.id if(!this.data.list[i].features[m].properties) { this.data.list[i].features[m].properties = {} } if(!this.data.list[i].features[m].properties.id) { this.data.list[i].features[m].properties.id = Cesium.createGuid() } this.data.list[i].features[m].id = this.data.list[i].features[m].properties.id posConvert( this.data.list[i].features[m].geometry, this.data.list[i].crs_src, this.data.list[i].crs_dst || '+proj=longlat +datum=WGS84 +no_defs' ) this.data.list[i].features[m].geometry.geometries || (this.data.list[i].features[m].geometry.geometries = []) let range = turf.bbox(this.data.list[i].features[m].geometry) if (range && range[0] && range[0] != Infinity) { this.data.list[i].features[m].geometry.range = turf.bbox( this.data.list[i].features[m] ) } features.push(this.data.list[i].features[m]) } } this.geojson = { type: 'FeatureCollection', features: features } // console.log(this.geojson) // for (let i = 0; i < this.geojson.features.length; i++) { // this.geojson.features[i].id = this.geojson.features[i].properties.id // this.geojson.features[i].geometry.range = turf.bbox(this.geojson.features[i]); // } } get fileName() { return this.options.fileName } set fileName(v) { this.options.fileName = v this._elms.fileName && (this._elms.fileName.value = v) } get field() { return this.options.field } set field(v) { this.options.field = v // for (let i = 0; i < this.#textEntity.length; i++) { // const img = new Image(); // img.src = Vector.getcanvas(this.#textEntity[i].properties[this.options.field] && this.#textEntity[i].properties[this.options.field]._value + '') // img.onload = async () => { // this.#textEntity[i].billboard.image = Vector.getcanvas(this.#textEntity[i].properties[this.options.field] && this.#textEntity[i].properties[this.options.field]._value + '') // } // } let label = v for (let index = 0; index < this.options.head_tables.length; index++) { if (this.options.head_tables[index].key === v) { label = this.options.head_tables[index].label break } } this._elms.field && (this._elms.field.value = label) } get img() { return this.options.img } set img(v) { if (!Array.isArray(v)) { v = [v] } this.options.img = v Vector.createImage(this) } get color() { return this.options.color } set color(v) { this.options.color = v if (!this.entity) { return } this.entity.entities.values.forEach(enetity => { if (enetity.point) { enetity.point.color = Cesium.Color.fromCssColorString(v).withAlpha( this.opacity ) } if (enetity.polygon) { enetity.polygon.material = Cesium.Color.fromCssColorString(v).withAlpha( this.opacity ) } if (enetity.polyline) { enetity.polyline.material = Cesium.Color.fromCssColorString( v ).withAlpha(this.opacity) } }) } set onRightClick(val) { if (val && typeof val !== 'function') { console.error('val:', val, '不是一个function') } else { if (this.rightClickCallBack == null && this.options && this.options.id) { regRightClickCallback(this.options.id, this.rightClickCB, this) } this.rightClickCallBack = val } } leftClickCB(mo, id, p, that) { if (that.clickCallBack && typeof that.clickCallBack === 'function') { that.clickCallBack(mo, id, p) } } static create(that) { // that.entity = new Cesium.PrimitiveCollection(); // that.viewer.scene.primitives.add(that.entity) // Vector.calculationScope(that, that.data) // Vector.createPoints(that, that.data.points) // Vector.createPolylines(that, that.data.polylines) // Vector.createPolygons(that, that.data.polygons) let bbox = turf.bbox(that.geojson) if (bbox && bbox[0] && bbox[0] != Infinity) { that.range = bbox } that.options.img && Vector.createImage(that) const getColor = level => { // level = Number(level) let color = that.options.color if ( that.disaster_type_colors && that.disaster_type_colors.hasOwnProperty(level) ) { color = that.disaster_type_colors[level] } return color } if ( that.options.path.endsWith('.kml') || that.options.path.endsWith('.kmz') ) { let url = '' that.options.host = that.options.host || getHost() if (that.options.host.endsWith('yjearth4.0')) { url = that.options.host + '/api/v1/vector/getKml' } else { url = that.options.host + '/yjearth4.0/api/v1/vector/getKml' } url += '?path=' + that.options.path // url = 'json/shp.json' fetch(url, { method: 'get', headers: { 'Content-Type': 'application/json', token: getToken(), Authorization: 'Bearer ' + getToken() } }).then(response => { if (response.status === 200) { response.blob().then(data => { data.text().then(kml => { if (that.options.path.endsWith('.kmz')) { kml = url } else { let parser = new DOMParser() // new Parser kml = parser.parseFromString(kml, 'text/xml') // Parse string let placemark = kml.getElementsByTagName('Placemark') for (let i = 0; i < placemark.length; i++) { placemark[i].id = that.geojson.features[i].id } } Cesium.KmlDataSource.load(kml, { camera: that.viewer.scene.camera, canvas: that.viewer.scene.canvas, clampToGround: true }).then(datasource => { createEntity(datasource) }) }) }) } }) } else { const geoJsonDataSource = new Cesium.GeoJsonDataSource() let promise = geoJsonDataSource.load(that.geojson, { clampToGround: true }) let Instances = [] return promise.then(datasource => { createEntity(datasource) }) } function createEntity(datasource) { that.entity = datasource // that.viewer.dataSources.add(datasource); datasource.entities.values.forEach((entity, index) => { // if(!that.geojson.features[index]) { // return // } // that.data.list[i].features[index].id = that.data.list[i].features[index].properties.id = entity.id // that.geojson.features[index].id = that.geojson.features[index].properties.id = entity.id entity.show = that.options.show entity.type = 'vector' entity.parentId = that.options.id if (!entity.properties) { entity.properties = {} } // that.sdk.viewer.entities.add(entity) addCluster(that.sdk, entity) let color = getColor( entity.properties && entity.properties[that.options.fxdj] && entity.properties[that.options.fxdj]._value ) if (entity.billboard) { // entity.billboard.show = false entity.billboard.heightReference = Cesium.HeightReference.CLAMP_TO_GROUND entity.point = new Cesium.PointGraphics({ show: true, // position: new Cesium.Cartesian3(entity.position._value.x, entity.position._value.y, entity.position._value.z), // 点的位置 color: Cesium.Color.fromCssColorString( color || 'rgba(0,255,184,0.5)' ).withAlpha(that.opacity), // 点的颜色 pixelSize: 10, // 点的大小 heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, disableDepthTestDistance: new Cesium.CallbackProperty(function () { return getGroundCover() ? undefined : Number.POSITIVE_INFINITY }, false) }) } if (entity.polyline) { let material = entity.polyline.material if (color) { material = Cesium.Color.fromCssColorString(color).withAlpha( that.opacity ) } entity.polyline = new Cesium.PolylineGraphics({ positions: entity.polyline.positions._value, width: entity.polyline.width && entity.polyline.width.getValue(), clampToGround: true, material: material, zIndex: that.sdk._entityZIndex }) // let polyline = new Cesium.GroundPolylineGeometry({ // positions: entity.polyline.positions._value, // width: 2 // }); // Instances.push(new Cesium.GeometryInstance({ // geometry: polyline, // attributes: { // color: Cesium.ColorGeometryInstanceAttribute.fromColor( // Cesium.Color.fromCssColorString('rgba(0,255,184,0.5)') // ) // } // })) // console.log(entity.polyline) } if (entity.polygon && entity.polygon.material) { entity.polygon.perPositionHeight = false entity.polygon.extrudedHeight = undefined let material = entity.polygon.material.color._value if (color) { material = Cesium.Color.fromCssColorString(color) } if (that.opacity || that.opacity === 0) { material = material.withAlpha(that.opacity) } let data = entity.kml || entity.kmz if (data) { let img = data.extendedData && data.extendedData.BaseTexturePath && data.extendedData.BaseTexturePath.value ? data.extendedData.BaseTexturePath.value : undefined if (img) { entity.polygon.material.image = img entity.polygon.material.repeat = new Cesium.Cartesian2(1, 1) } entity.polygon.material = new Cesium.ImageMaterialProperty({ image: img, // 贴图的URL repeat: new Cesium.Cartesian2(1, 1), color: material }) } entity.polygon.zIndex = that.sdk._entityZIndex if ( that.options.path.endsWith('.kml') || that.options.path.endsWith('.kmz') ) { let material = color ? Cesium.Color.fromCssColorString('#000000') : entity.polygon.outlineColor.getValue() if (that.opacity || that.opacity === 0) { material = material.withAlpha(that.opacity) } if (entity.polygon.outlineWidth) { entity.polyline = new Cesium.PolylineGraphics({ positions: entity.polygon.hierarchy._value.positions, width: entity.polygon.outlineWidth.getValue(), clampToGround: true, material: material, zIndex: that.sdk._entityZIndex }) } } else { entity.polyline = new Cesium.PolylineGraphics({ positions: entity.polygon.hierarchy._value.positions, width: 1, clampToGround: true, material: Cesium.Color.fromCssColorString('#000000').withAlpha( that.opacity ), zIndex: that.sdk._entityZIndex }) // 通过生成canvas创建billboard,增加贴地高度的加载速度 // if (entity.billboard && entity.position && entity.position.getValue()) { // const img = new Image(); // img.src = Vector.getcanvas(entity.properties[that.options.field] && entity.properties[that.options.field]._value + '') // img.onload = async function () { // let position = entity.position.getValue() // let entity2 = new Cesium.Entity({ // show: that.options.show, // id: entity.id + '_text', // parentId: that.options.id, // position: new Cesium.Cartesian3(position.x, position.y, position.z), // 点的位置 // billboard: { // image: img, // pixelOffset: new Cesium.Cartesian2(0, -15), // verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, // disableDepthTestDistance: new Cesium.CallbackProperty(function () { // return getGroundCover() ? undefined : 100000000 // }, false) // } // }) // entity2.properties = entity.properties // that.#textEntity.push(entity2) // that.sdk.viewer.entities.add(entity2) // } // } if (entity.point) { entity.label = new Cesium.LabelGraphics({ text: new Cesium.CallbackProperty(function () { return ( entity.properties[that.options.field] && entity.properties[that.options.field]._value + '' ) }, false), outlineColor: Cesium.Color.BLACK, outlineWidth: 10, font: '16px Microsoft YaHei', fillColor: Cesium.Color.fromCssColorString('#ffeb3b'), verticalOrigin: Cesium.VerticalOrigin.BOTTOM, pixelOffset: new Cesium.Cartesian2(0, -15), style: Cesium.LabelStyle.FILL_AND_OUTLINE, heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, disableDepthTestDistance: new Cesium.CallbackProperty(function () { return getGroundCover() ? undefined : Number.POSITIVE_INFINITY }, false) }) } } that.sdk._entityZIndex++ } if ( that.options.path.endsWith('.kml') || that.options.path.endsWith('.kmz') ) { if (entity.label) { entity.label.font = '16px Microsoft YaHei' let feature = that.geojson.features[index] entity.billboard.heightReference = Cesium.HeightReference.CLAMP_TO_GROUND entity.properties = feature ? feature.properties : {} if (!entity.properties.id && !entity.properties.Id && !entity.properties.ID) { entity.properties.addProperty('id', entity.id) } entity.label.text = new Cesium.CallbackProperty(function () { return entity.properties[that.options.field] && entity.properties[that.options.field]._value + '' }, false) } } else { if (entity.point) { entity.label = new Cesium.LabelGraphics({ text: new Cesium.CallbackProperty(function () { return ( entity.properties[that.options.field] && entity.properties[that.options.field]._value + '' ) }, false), outlineColor: Cesium.Color.BLACK, outlineWidth: 10, font: '16px Microsoft YaHei', fillColor: Cesium.Color.fromCssColorString('#ffeb3b'), verticalOrigin: Cesium.VerticalOrigin.BOTTOM, pixelOffset: new Cesium.Cartesian2(0, -15), style: Cesium.LabelStyle.FILL_AND_OUTLINE, heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, disableDepthTestDistance: new Cesium.CallbackProperty(function () { return getGroundCover() ? undefined : Number.POSITIVE_INFINITY }, false) }) } } }) if (!that.options.field) { const properties = ['id', 'Id', 'ID', 'name', 'Name', 'NAME', 'address', 'Address', 'ADDRESS', 'text', 'Text', 'TEXT', 'label', 'Label', 'LABEL']; const field = properties.find(prop => that.geojson.features[0].properties[prop] !== undefined); if (field) { that.options.field = field; } else { for (let key in that.geojson.features[0].properties) { that.options.field = key; break; } } } // for (let i = 0; i < that.#textEntity.length; i++) { // that.entity.entities.add(that.#textEntity[i]) // } that.#loaded = true if (that.#loadEvent) { that.#loadEvent() } // let primitive = new Cesium.GroundPolylinePrimitive({ // geometryInstances: Instances, // appearance: new Cesium.PolylineColorAppearance() // }); // that.viewer.scene.primitives.add(primitive); // that.viewer.zoomTo(datasource) } } static createImage(that) { //(primitive无法贴地?) that.removeImage() if (!that.range) { return } for (let i = 0; i < that.options.img.length; i++) { let entity = that.sdk.viewer.entities.add({ show: that.options.show, rectangle: { coordinates: Cesium.Rectangle.fromDegrees(...that.range), material: new Cesium.ImageMaterialProperty({ image: that.options.img[i], transparent: true }) } }) that.imgEntity.push(entity) } } static getcanvas(text) { const canvas = document.createElement('canvas') const ctx = canvas.getContext('2d') ctx.font = '16px YaHei' let texts = text.split('\n') let canvasWidth = 0 let canvasHeight = 0 for (let i = 0; i < texts.length; i++) { const t = texts[i] const width = ctx.measureText(t).width if (width > canvasWidth) { canvasWidth = width } canvasHeight += 16 } canvasHeight = canvasHeight + 10 + (texts.length - 1) * 5 canvasWidth = canvasWidth + 30 canvas.width = canvasWidth canvas.height = canvasHeight const linearGradient = ctx.createLinearGradient( 0, 0, canvasWidth, canvasHeight ) ctx.fillStyle = linearGradient ctx.fillRect(0, 0, canvasWidth, canvasHeight) ctx.fillStyle = '#ffffff' ctx.font = '16px YaHei' ctx.strokeStyle = '#000000' ctx.strokeText( texts, 15, 16 * texts.length + (10 * 10) / 16 + texts.length * 5 ) ctx.fillText( texts, 15, 16 * texts.length + (10 * 10) / 16 + texts.length - 1 * 5 ) ctx.moveTo(canvasWidth / 2, canvasHeight) ctx.stroke() ctx.closePath() return canvas.toDataURL() } async edit(status = false, DialogEvent = {}) { this.originalOptions = this.deepCopyObj(this.options) if (this._DialogObject && this._DialogObject.close) { this._DialogObject.close() this._DialogObject = null } if (status) { this._DialogObject = await new Dialog(this.sdk, this.options, { title: '编辑属性', left: '180px', top: '100px', confirmCallBack: options => { this.fileName = this.fileName.trim() if (!this.fileName) { this.fileName = '未命名对象' } this.originalOptions.fileName = this.fileName this.originalOptions.field = this.field this._DialogObject.close() DialogEvent.confirmCallBack && DialogEvent.confirmCallBack({ id: this.options.id, fileName: this.originalOptions.fileName, field: this.originalOptions.field }) }, closeCallBack: () => { this.reset() DialogEvent.closeCallBack && DialogEvent.closeCallBack() } }) let html = `
文件名称:
名称字段选择:
` let contentElm = document.createElement('div') contentElm.innerHTML = html this._DialogObject.contentAppChild(contentElm) let nameElm = contentElm.getElementsByClassName('flie-name')[0] nameElm.value = this.options.fileName nameElm.addEventListener('input', () => { this.options.fileName = nameElm.value }) let keyData = [] for (let key in this.geojson.features[0].properties) { let label = key for (let index = 0; index < this.options.head_tables.length; index++) { if (this.options.head_tables[index].key === key) { label = this.options.head_tables[index].label break } } keyData.push({ name: label, value: label, key: key }) } let keyObject = legp( contentElm.getElementsByClassName('key-box')[0], '.key' ) if (keyObject) { keyObject.legp_search(keyData) let keyDataLegpElm = contentElm .getElementsByClassName('key')[0] .getElementsByTagName('input')[0] keyDataLegpElm.value = this.field for (let i = 0; i < keyData.length; i++) { if (keyData[i].key == this.field) { keyDataLegpElm.value = keyData[i].value keyObject.legp_searchActive(keyData[i].value) break } } keyDataLegpElm.addEventListener('input', () => { for (let i = 0; i < keyData.length; i++) { if (keyData[i].value === keyDataLegpElm.value) { this.options.field = keyData[i].key break } } }) this._elms.field = keyDataLegpElm } this._elms.fileName = nameElm return let selectElm = contentElm.getElementsByClassName('input-select')[0] let option = '' // for (let key in this.geojson.features[0].properties) { // let o = `` // option = option + o // } for (let key in this.geojson.features[0].properties) { let label = key for (let index = 0; index < this.options.head_tables.length; index++) { if (this.options.head_tables[index].key === key) { label = this.options.head_tables[index].label break } } let o = `` option = option + o } selectElm.innerHTML = option selectElm.value = this.options.field selectElm.addEventListener('input', () => { this.options.field = selectElm.value }) this._elms.fileName = nameElm this._elms.field = selectElm } else { if (this._DialogObject && this._DialogObject.close) { this._DialogObject.close() this._DialogObject = null } } } async editById(status = false, nodeId, DialogEvent = {}) { // nodeId = this.dataArray[0].attr.id if (this._DialogObject && this._DialogObject.close) { this._DialogObject.close() this._DialogObject = null } let cameraName = '' let index if (status) { let options = {} for (let i = 0; i < this.geojson.features.length; i++) { if (this.geojson.features[i].id === nodeId) { if (this.geojson.features[i].content) { options = this.deepCopyObj(this.geojson.features[i].content) } index = i break } } options.id = options.id || nodeId options.link || (options.link = {}) options.link.content || (options.link.content = []) options.camera || (options.camera = []) options.richTextContent || (options.richTextContent = '') options.attributeType = options.attributeType || 'richText' this._DialogObject = await new Dialog(this.sdk, options, { title: '编辑属性', left: '180px', top: '100px', confirmCallBack: () => { this._DialogObject.close() this.geojson.features[index].content = this.deepCopyObj( this._DialogObject.attribute ) DialogEvent.confirmCallBack && DialogEvent.confirmCallBack(this._DialogObject.attribute) }, closeCallBack: () => { // this.reset() DialogEvent.closeCallBack && DialogEvent.closeCallBack() } }) this._DialogObject.event = DialogEvent this._DialogObject.attribute = this.deepCopyObj(options) let html = `
内容类型:
编辑内容:
编辑内容:
操作
设备名称
设备类型
设备IP
设备端口
用户名
密码

暂无数据

` let contentElm = document.createElement('div') contentElm.innerHTML = html this._DialogObject.contentAppChild(contentElm) let all_elm = contentElm.getElementsByTagName('*') this._DialogObject._element.body.style.width = '600px' let attributeSelectElm = contentElm.getElementsByClassName( 'attribute-select' )[0] let linkAddBtnElm = contentElm.getElementsByClassName('link_add_btn')[0] let openRichTextBtnElm = contentElm.getElementsByClassName( 'open-richText-btn' )[0] let attributeContent = this._DialogObject._element.content.getElementsByClassName( 'attribute-content' ) for (let i = 0; i < attributeContent.length; i++) { if ( attributeContent[i].className.indexOf( 'attribute-content-' + this._DialogObject.attribute.attributeType ) > -1 ) { attributeContent[i].style.display = 'block' } else { attributeContent[i].style.display = 'none' } } attributeSelectElm.addEventListener('change', () => { this._DialogObject.attribute.attributeType = attributeSelectElm.value for (let i = 0; i < attributeContent.length; i++) { if ( attributeContent[i].className.indexOf( 'attribute-content-' + this._DialogObject.attribute.attributeType ) > -1 ) { attributeContent[i].style.display = 'block' } else { attributeContent[i].style.display = 'none' } } }) linkAddBtnElm.addEventListener('click', async () => { if ( this._DialogObject._element.content.getElementsByClassName( 'link_add' )[0].value ) { this._DialogObject.attribute.link.content.push({ name: this.getDateTimeString(), url: this._DialogObject._element.content.getElementsByClassName( 'link_add' )[0].value }) this._DialogObject._element.content.getElementsByClassName( 'link_add' )[0].value = '' this.setAttributeLinkById( nodeId, this._DialogObject.attribute.link.content ) } else { DialogEvent.clickAddLink && DialogEvent.clickAddLink(nodeId) } }) openRichTextBtnElm.addEventListener('click', () => { richText.open( nodeId, nodeId, this._DialogObject.attribute.richTextContent ) richText.primaryCallBack = content => { this._DialogObject.attribute.richTextContent = content } }) let cameraNameElm = contentElm.getElementsByClassName('camera-name')[0] let cameraSelectElm = contentElm.getElementsByClassName( 'camera-select' )[0] cameraNameElm.addEventListener('input', () => { cameraName = cameraNameElm.value }) this.cameraSelect && this.cameraSelect(cameraName) cameraSelectElm.addEventListener('click', () => { this.cameraSelect && this.cameraSelect(cameraName) }) // let nameElm = contentElm.getElementsByClassName('flie-name')[0] // nameElm.value = this.options.fileName // nameElm.addEventListener('input', ()=>{ // this.options.fileName = nameElm.value // }) // let selectElm = contentElm.getElementsByClassName('input-select')[0] // let option = '' // for(let key in this.dataArray[0].attr) { // let o = `` // option = option + o // } // selectElm.innerHTML = option // selectElm.value = this.options.field // selectElm.addEventListener('input', ()=>{ // this.options.field = selectElm.value // }) // this._elms.fileName = nameElm // this._elms.field = selectElm } else { if (this._DialogObject && this._DialogObject.close) { this._DialogObject.close() this._DialogObject = null } } } editContentById(nodeId, content) { for (let i = 0; i < this.geojson.features.length; i++) { if (this.geojson.features[i].id === nodeId) { this.geojson.features[i].content = content break } } } reset() { this.fileName = this.originalOptions.fileName this.field = this.originalOptions.field } addAttributeLinkById(nodeId, link, i) { if ( this._DialogObject && this._DialogObject.attribute && this._DialogObject.attribute.id == nodeId ) { if (i || i === 0) { this._DialogObject._element.body .getElementsByClassName('attribute-content-link')[1] .getElementsByClassName('tr') [i + 1].getElementsByClassName('file-select')[0].value = link } else { this._DialogObject.attribute.link.content.push({ name: this.getDateTimeString(), url: link }) this.setAttributeLinkById( nodeId, this._DialogObject.attribute.link.content ) } } } setAttributeLinkById(nodeId, data) { if ( this._DialogObject && this._DialogObject.attribute && this._DialogObject.attribute.id == nodeId ) { this._DialogObject.attribute.link.content = data let table = this._DialogObject._element.content .getElementsByClassName('attribute-content-link')[1] .getElementsByClassName('table')[0] let tableContent = table.getElementsByClassName('table-body')[0] tableContent.innerHTML = '' if (this._DialogObject.attribute.link.content.length > 0) { table.getElementsByClassName('table-empty')[0].style.display = 'none' } else { table.getElementsByClassName('table-empty')[0].style.display = 'flex' } for ( let i = 0; i < this._DialogObject.attribute.link.content.length; i++ ) { let tr = `
` + this._DialogObject.attribute.link.content[i].name + `
` + this._DialogObject.attribute.link.content[i].url + `
` let trElm = document.createRange().createContextualFragment(tr) tableContent.appendChild(trElm) } let item = tableContent.getElementsByClassName('tr') let fun = { linkEdit: async index => { await this.setAttributeLinkById( nodeId, this._DialogObject.attribute.link.content ) let table = this._DialogObject._element.content .getElementsByClassName('attribute-content-link')[1] .getElementsByClassName('table')[0] let tableContent = table.getElementsByClassName('table-body')[0] let item = tableContent.getElementsByClassName('tr') for (let i = 0; i < item.length; i++) { if (index === i) { let html = `
` item[i].innerHTML = html let td = item[i].getElementsByClassName('td') td[0].getElementsByClassName( 'input' )[0].value = this._DialogObject.attribute.link.content[index].name td[1].getElementsByClassName( 'input' )[0].value = this._DialogObject.attribute.link.content[index].url let btn = item[i].getElementsByTagName('button') for (let n = 0; n < btn.length; n++) { if (!btn[n] || !btn[n].attributes) { continue; } for (let m of btn[n].attributes) { if (m.name === '@click') { btn[n].addEventListener('click', e => { if (typeof fun[m.value] === 'function') { fun[m.value]( { name: td[0].getElementsByClassName('input')[0] .value, url: td[1].getElementsByClassName('input')[0].value }, i ) } }) btn[n].attributes.removeNamedItem(m.name) break } } } break } } }, linkDelete: i => { this._DialogObject.attribute.link.content.splice(i, 1) this.setAttributeLinkById( nodeId, this._DialogObject.attribute.link.content ) }, confirmEdit: (value, i) => { this._DialogObject.attribute.link.content[i] = value this.setAttributeLinkById( nodeId, this._DialogObject.attribute.link.content ) }, cancelEdit: () => { this.setAttributeLinkById( nodeId, this._DialogObject.attribute.link.content ) }, fileSelect: (value, i) => { this._DialogObject.event && this._DialogObject.event.clickAddLink && this._DialogObject.event.clickAddLink(nodeId, i) } } for (let i = 0; i < item.length; i++) { let btn = item[i].getElementsByTagName('button') for (let n = 0; n < btn.length; n++) { if (!btn[n] || !btn[n].attributes) { continue; } for (let m of btn[n].attributes) { if (m.name === '@click') { btn[n].addEventListener('click', e => { if (typeof fun[m.value] === 'function') { fun[m.value](i) } }) btn[n].attributes.removeNamedItem(m.name) break } } } } } for (let i = 0; i < this.dataArray.length; i++) { if (this.dataArray[i].attr.id === nodeId) { if (this.dataArray[i].content) { this.opt_DialogObject.attribute.link.content = v } break } } } getAllNode() { return this.data } openAllNodeList() { OpenAllNodeList(this) } openNodeListById(id) { OpenNodeListById(this, id) } static createTableContent(that) { let trsElm = '' for (let i = 0; i < that.currentData.length; i++) { let trElm = '' let tdElm = '' for (let key in that.currentData[i].attr) { tdElm = tdElm + `
${that.currentData[i].attr[key]}
` } trElm = trElm + tdElm + '' trsElm = trsElm + trElm } return trsElm } flyTo(id, options = {}) { setActiveViewer(0) closeRotateAround(this.sdk) closeViewFollow(this.sdk) if (id) { for (let i = 0; i < this.geojson.features.length; i++) { if (this.geojson.features[i].id === id) { if (this.geojson.features[i].geometry.type === 'Point') { this.getClampToHeight({ lng: this.geojson.features[i].geometry.coordinates[0], lat: this.geojson.features[i].geometry.coordinates[1] }).then(height => { this.sdk.viewer.camera.flyTo({ orientation: options.orientation, destination: Cesium.Cartesian3.fromDegrees( this.geojson.features[i].geometry.coordinates[0], this.geojson.features[i].geometry.coordinates[1], height + (options.height || 500) ) }) }) } else { let range = this.geojson.features[i].geometry.range if (range) { let array = [] this.getClampToHeight({ lng: range[0], lat: range[1] }).then( h => { let a = Cesium.Cartesian3.fromDegrees(range[0], range[1], h) array.push(a.x, a.y, a.z) this.getClampToHeight({ lng: range[2], lat: range[3] }).then( h2 => { let a = Cesium.Cartesian3.fromDegrees( range[2], range[3], h2 ) array.push(a.x, a.y, a.z) let BoundingSphere = Cesium.BoundingSphere.fromVertices( array ) this.sdk.viewer.camera.flyToBoundingSphere( BoundingSphere, { offset: options.orientation || { heading: Cesium.Math.toRadians(0.0), pitch: Cesium.Math.toRadians(-90.0), roll: Cesium.Math.toRadians(0.0) } } ) } ) } ) } } } } } else { 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) this.sdk.viewer.camera.flyTo({ destination: destination, orientation: orientation }) } else { if (this.range) { let array = [] this.getClampToHeight({ lng: this.range[0], lat: this.range[1] }).then(h => { let a = Cesium.Cartesian3.fromDegrees( this.range[0], this.range[1], h ) array.push(a.x, a.y, a.z) this.getClampToHeight({ lng: this.range[2], lat: this.range[3] }).then(h2 => { let a = Cesium.Cartesian3.fromDegrees( this.range[2], this.range[3], h2 ) array.push(a.x, a.y, a.z) let BoundingSphere = Cesium.BoundingSphere.fromVertices(array) this.sdk.viewer.camera.flyToBoundingSphere(BoundingSphere, { offset: options.orientation || { heading: Cesium.Math.toRadians(0.0), pitch: Cesium.Math.toRadians(-90.0), roll: Cesium.Math.toRadians(0.0) } }) }) }) } } } } setShow(status, id) { // let enetity = this.entity.entities.getById(id) // if(enetity) { // enetity.show = status // } // else { // } if (id) { if (!this.entity) { return } for (let i = 0; i < this.entity.entities.values.length; i++) { if ( this.entity.entities.values[i].id && this.entity.entities.values[i].id.startsWith(id) ) { this.entity.entities.values[i].show = status this.entity.entities.values[i]._customShow = status syncSplitData(this.sdk, this.options.id, this.entity.entities.values[i].id) // this.entity.entities.remove(this.entity.entities.values[i]) break } } syncData(this.sdk, this.options.id) } else { this.options.show = status if (!this.entity) { return } // this.entity.show = status for (let i = 0; i < this.entity.entities.values.length; i++) { this.entity.entities.values[i].show = status this.entity.entities.values[i]._customShow = status syncSplitData(this.sdk, this.options.id, this.entity.entities.values[i].id) } syncData(this.sdk, this.options.id) } } setShowImg(status, index) { if (index || index === 0) { for (let i = 0; i < this.imgEntity.length; i++) { if (i == index) { this.imgEntity[i].show = status break } } } else { for (let i = 0; i < this.imgEntity.length; i++) { this.imgEntity[i].show = status } } } async remove() { if (this.entity) { this.entity.entities.values.forEach(enetity => { remove_entity_from_cluster(this.sdk.viewer, enetity) }) } this.#textEntity = [] // this.#textEntity = [] // this.viewer.dataSources.remove(this.entity, true) this.removeImage() this.entity = null this.geojson = {} this.data = {} await this.sdk.removeIncetance(this.options.id) await syncSplitData(this.sdk, this.options.id) await syncData(this.sdk, this.options.id) } removeImage() { for (let i = 0; i < this.imgEntity.length; i++) { this.sdk.viewer.entities.remove(this.imgEntity[i]) } this.imgEntity = [] } cameraSelect(cameraName, page) { const type = { '1': '海康', '2': '大华' } let host = this.options.host if ( this._DialogObject && this._DialogObject._element && this._DialogObject._element.content ) { let paginationElm = that._DialogObject._element.content.getElementsByClassName( 'pagination' )[0] let attributeCameraElm = that._DialogObject._element.content.getElementsByClassName( 'attribute-content-camera' )[0] if (!paginationElm) { return } if (!attributeCameraElm) { return } generatePagination(paginationElm, 1, 10, 1) } else { return } let url = '' const params = { cameraName: cameraName, page: !page || typeof page === 'object' ? 1 : page, pageSize: 5 } const queryString = new URLSearchParams(params).toString() if (host.endsWith('yjearth4.0')) url = `${host}/api/v1/cameraData/list?${queryString}` else url = `${host}/yjearth4.0/api/v1/cameraData/list?${queryString}` // url = this.options.path fetch(url, { method: 'get', headers: { 'Content-Type': 'application/json', token: getToken(), Authorization: 'Bearer ' + getToken() } }).then(response => { if (response.status === 200) { response.json().then(data => { if (data.code === 200 || data.code === 0) { if ( !this._DialogObject || !this._DialogObject._element || !this._DialogObject._element.content ) { return } let paginationElm = this._DialogObject._element.content.getElementsByClassName( 'pagination' )[0] let table = this._DialogObject._element.content.getElementsByClassName( 'camera-table' )[0] let tableContent = table.getElementsByClassName('table-body')[0] tableContent.innerHTML = '' if (data.data) { if (data.data.list && data.data.list.length > 0) { generatePagination( paginationElm, data.data.total, 10, 1, pageIndex => { this.cameraSelect && this.cameraSelect(cameraName, pageIndex) } ) table.getElementsByClassName('table-empty')[0].style.display = 'none' tableContent.style.display = 'inline-flex' for (let i = 0; i < data.data.list.length; i++) { let tr = `
绑定
${data.data.list[i].cameraName}
${type[data.data.list[i].type] }
${data.data.list[i].ip }
${data.data.list[i].port }
${data.data.list[i].userName }
${data.data.list[i].passWord}
` let trElm = document .createRange() .createContextualFragment(tr) let checkbox = trElm.querySelector('input[type="checkbox"]') checkbox.addEventListener('change', () => { if (checkbox.checked) { this._DialogObject.attribute.camera.push( data.data.list[i] ) } else { let newArray = this._DialogObject.attribute.camera.filter( item => { return item.ID !== data.data.list[i].ID } ) this._DialogObject.attribute.camera = newArray } }) tableContent.appendChild(trElm) for ( let m = 0; m < this._DialogObject.attribute.camera.length; m++ ) { if ( this._DialogObject.attribute.camera[m].ID === data.data.list[i].ID ) { checkbox.checked = true break } } } } if (data.data && data.data.total) { generatePagination( paginationElm, data.data.total, 10, 1, pageIndex => { this.cameraSelect && this.cameraSelect(cameraName, pageIndex) } ) } } else { generatePagination(paginationElm, 1, 10, 1) table.getElementsByClassName('table-empty')[0].style.display = 'flex' tableContent.style.display = 'none' } } else { console.error(data.message) } }) } }) } load(callback) { if (this.#loaded) { callback() } else { this.#loadEvent = callback } } flicker() { } } export default Vector