import { getHost, getToken } from "../../../on"; import Base from "../index"; import { generatePagination } from "../../Element/Pagination"; import { regLeftClickCallback } 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 { attributeElm } from '../../Element/elm_html' class Shp extends Base { constructor(sdk, options = {}, _Dialog = {}) { super(sdk, options); this.viewer = sdk.viewer if (!this.options.path) { this.error = 'No path provided!' if (window.ELEMENT) { window.ELEMENT.Message.closeAll(); window.ELEMENT.Message({ message: this.error, type: 'warning', duration: 1500 }); } console.warn(this.error) return } this.options.fileName = options.fileName || '未命名对象' this.options.field = options.field || 'id' this.total = 0 this.page = 1 this.pageSize = 20 this.currentData = [] this.data = [] this.list = [] this.Dialog = _Dialog this._elms = {}; } get show() { return undefined } set show(v) { this.setShow(v) } on() { if (!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/load' } else { url = this.options.host + '/yjearth4.0/api/v1/vector/load' } 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 data = await response.json() // Shp.create(this) if (data.code === 200 || data.code === 0) { this.data = data.data // for (let i = 0; i < this.data.length; i++) { // let points // let polylines // let polygons // let multi_polylines // let multi_polygons // if (this.data[i].points) { // points = [...this.data[i].points] // } // else { // points = [] // } // if (this.data[i].polylines) { // polylines = [...this.data[i].polylines] // } // else { // polylines = [] // } // if (this.data[i].polygons) { // polygons = [...this.data[i].polygons] // } // else { // polygons = [] // } // if (this.data[i].multi_polylines) { // multi_polylines = [...this.data[i].multi_polylines] // } // else { // multi_polylines = [] // } // if (this.data[i].multi_polygons) { // multi_polygons = [...this.data[i].multi_polygons] // } // else { // multi_polygons = [] // } // this.dataArray = [...this.dataArray, ...points, ...polylines, ...polygons, ...multi_polylines, ...multi_polygons] // } await this.formatData() return Shp.create(this) } else { return console.error(data.message) } } } // 格式化数据 async formatData() { let features = [] let _this = this formatFeatures(this.data) function formatFeatures(data) { if (data.data) { _this.list.push(...data.data) for (let i = 0; i < data.data.length; i++) { let points let polylines let polygons let multi_polylines let multi_polygons if (data.data[i].points) { points = [...data.data[i].points] for (let m = 0; m < points.length; m++) { features.push({ "id": points[m].attr.id, "type": "Feature", "geometry": { "type": "Point", "coordinates": [points[m].x, points[m].y, points[m].z], "range": points[m].range, "positions": { x: points[m].x, y: points[m].y, z: points[m].z } }, "properties": points[m].attr ? { ...points[m].attr } : {} }) } } if (data.data[i].polylines) { polylines = [...data.data[i].polylines] for (let m = 0; m < polylines.length; m++) { let positions = [] for (let n = 0; n < polylines[m].positions.length; n++) { positions.push([polylines[m].positions[n].x, polylines[m].positions[n].y, polylines[m].positions[n].z]) } features.push({ "id": polylines[m].attr.id, "type": "Feature", "geometry": { "type": "LineString", "coordinates": positions, "range": polylines[m].range, "positions": polylines[m].positions }, "properties": polylines[m].attr ? { ...polylines[m].attr } : {} }) } } if (data.data[i].polygons) { polygons = [...data.data[i].polygons] for (let m = 0; m < polygons.length; m++) { let positions = [] for (let n = 0; n < polygons[m].positions.length; n++) { positions.push([polygons[m].positions[n].x, polygons[m].positions[n].y]) } features.push({ "id": polygons[m].attr.id, "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [positions], "range": polygons[m].range, "positions": polygons[m].positions }, "properties": polygons[m].attr ? { ...polygons[m].attr } : {} }) } } if (data.data[i].multi_polylines) { multi_polylines = [...data.data[i].multi_polylines] for (let m = 0; m < multi_polylines.length; m++) { let positions = [] let positionsxyz = [] for (let n = 0; n < multi_polylines[m].polylines.length; n++) { let positions2 = [] positionsxyz.push(multi_polylines[m].polylines[n].positions) for (let r = 0; r < multi_polylines[m].polylines[n].positions.length; r++) { positions2.push([multi_polylines[m].polylines[n].positions[r].x, multi_polylines[m].polylines[n].positions[r].y, multi_polylines[m].polylines[n].positions[r].z]) } positions.push(positions2) } features.push({ "id": multi_polylines[m].attr.id, "type": "Feature", "geometry": { "type": "MultiLineString", "coordinates": positions, "range": multi_polylines[m].range, "positions": positionsxyz }, "properties": multi_polylines[m].attr ? { ...multi_polylines[m].attr } : {} }) } } if (data.data[i].multi_polygons) { multi_polygons = [...data.data[i].multi_polygons] for (let m = 0; m < multi_polygons.length; m++) { let positions = [] let positionsxyz = [] for (let n = 0; n < multi_polygons[m].polygons.length; n++) { let positions2 = [] positionsxyz.push(multi_polygons[m].polygons[n].positions) for (let r = 0; r < multi_polygons[m].polygons[n].positions.length; r++) { positions2.push([multi_polygons[m].polygons[n].positions[r].x, multi_polygons[m].polygons[n].positions[r].y, multi_polygons[m].polygons[n].positions[r].z]) } positions.push(positions2) } features.push({ "id": multi_polygons[m].attr.id, "type": "Feature", "geometry": { "type": "MultiPolygon", "coordinates": [positions], "range": multi_polygons[m].range, "positions": positionsxyz }, "properties": multi_polygons[m].attr ? { ...multi_polygons[m].attr } : {} }) } } } } if (data.children) { for (let i = 0; i < data.children.length; i++) { formatFeatures(data.children[i]) } } } features.sort((a, b) => Number(a.properties.fid) - Number(b.properties.fid)); // for(let i=0;i<5;i++) { // features = [...features, ...features] // } this.geojson = { "type": "FeatureCollection", "features": features } } 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 this._elms.field && (this._elms.field.value = v) } get onClick() { return this.clickCallBack } set onClick(val) { if (val && typeof val !== 'function') { console.error('val:', val, '不是一个function') } else { this.clickCallBack = 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) // Shp.calculationScope(that, that.data) // Shp.createPoints(that, that.data.points) // Shp.createPolylines(that, that.data.polylines) // Shp.createPolygons(that, that.data.polygons) let bbox = turf.bbox(that.geojson); that.range = { max_x: bbox[2], max_y: bbox[3], min_x: bbox[0], min_y: bbox[1], } const geoJsonDataSource = new Cesium.GeoJsonDataSource(); let promise = geoJsonDataSource.load(that.geojson, { clampToGround: true, }); let Instances = [] let Points = new Cesium.PointPrimitiveCollection() let Lines = [] let Polygons = [] return promise.then(datasource => { that.entity = datasource // that.viewer.dataSources.add(datasource); datasource.entities.values.forEach(enetity => { if (enetity.billboard) { Points.add({ position: enetity.position._value, color: Cesium.Color.RED, // 红色点 pixelSize: 10, disableDepthTestDistance: Number.POSITIVE_INFINITY, }) } if (enetity.polygon) { let polygon = new Cesium.PolygonGeometry({ polygonHierarchy: new Cesium.PolygonHierarchy(enetity.polygon.hierarchy._value.positions) }); Polygons.push(new Cesium.GeometryInstance({ geometry: polygon, attributes: { color: Cesium.ColorGeometryInstanceAttribute.fromColor( Cesium.Color.fromCssColorString('rgba(0,255,184,0.5)') ), show: new Cesium.ShowGeometryInstanceAttribute(true) } })) } if (enetity.polyline) { let polyline = new Cesium.GroundPolylineGeometry({ positions: enetity.polyline.positions._value, width: 2 }); Lines.push(new Cesium.GeometryInstance({ geometry: polyline, attributes: { color: Cesium.ColorGeometryInstanceAttribute.fromColor( Cesium.Color.fromCssColorString('rgba(0,255,184,0.5)') ) } })) // console.log(enetity.polyline) } }) // let polygonsPrimitive = new Cesium.GroundPolylinePrimitive({ // geometryInstances: Polygons, // appearance: new Cesium.MaterialAppearance({ // material: new Cesium.Material({ // fabric: { // type: 'Color', // uniforms: { // color: new Cesium.Color(1.0, 1.0, 0.0, 1.0) // } // } // }) // }) // }); console.log('Lines', Lines) console.log('Polygons', Polygons) let LinesPrimitive = new Cesium.GroundPolylinePrimitive({ geometryInstances: Lines }); let PolygonsPrimitive = new Cesium.GroundPrimitive({ geometryInstances: Polygons, appearance: new Cesium.PerInstanceColorAppearance({ translucent: true, //false时透明度无效 closed: false, }), }); (Points.length>0) && that.viewer.scene.primitives.add(Points); (LinesPrimitive.length>0) && that.viewer.scene.primitives.add(LinesPrimitive); (PolygonsPrimitive.length>0) && that.viewer.scene.primitives.add(PolygonsPrimitive); // that.viewer.zoomTo(datasource) }) } /** * @description 计算shp范围 */ static calculationScope(that, data) { let points = [] if (data.points) { for (let i = 0; i < data.points.length; i++) { points.push(turf.point([data.points[i].position.x, data.points[i].position.y])) } } if (data.polylines) { for (let i = 0; i < data.polylines.length; i++) { if (data.polylines[i].positions) for (let m = 0; m < data.polylines[i].positions.length; m++) { points.push(turf.point([data.polylines[i].positions[m].x, data.polylines[i].positions[m].y])) } } } if (data.polygons) { for (let i = 0; i < data.polygons.length; i++) { if (data.polygons[i].positions) for (let m = 0; m < data.polygons[i].positions.length; m++) { points.push(turf.point([data.polygons[i].positions[m].x, data.polygons[i].positions[m].y])) } } } if (points.length > 0) { let features = turf.featureCollection(points); let enveloped = turf.envelope(features); if (enveloped && enveloped.bbox && enveloped.bbox.length == 4) { that.range = { max_x: enveloped.bbox[2], max_y: enveloped.bbox[3], min_x: enveloped.bbox[0], min_y: enveloped.bbox[1], } } } } static createPoints(that, data) { if (!data) { return } let points = new Cesium.PointPrimitiveCollection({ scene: that.viewer.scene // 指定场景 }); for (let i = 0; i < data.length; i++) { data[i].attr.id || (data[i].attr.id = that.randomString()) points.add({ id: data[i].attr.id, position: Cesium.Cartesian3.fromDegrees(data[i].x, data[i].y, data[i].z), // 点的位置 color: Cesium.Color.RED, // 点的颜色 pixelSize: 10, // 点的大小 disableDepthTestDistance: Number.POSITIVE_INFINITY // 不应用深度测试 }) regLeftClickCallback(data[i].attr.id, that.leftClickCB, that) } that.entity.add(points) } static createPolylines(that, data) { if (!data) { return } let polylineInstance = [] for (let i = 0; i < data.length; i++) { data[i].attr.id || (data[i].attr.id = that.randomString()) let positions = data[i].positions let fromDegreesArray = [] for (let m = 0; m < positions.length; m++) { fromDegreesArray.push(positions[m].x, positions[m].y, positions[m].z) } let polyline = new Cesium.GroundPolylineGeometry({ positions: Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray), width: 4 }); let instance = new Cesium.GeometryInstance({ id: data[i].attr.id, geometry: polyline, attributes: { color: Cesium.ColorGeometryInstanceAttribute.fromColor( Cesium.Color.fromCssColorString(data[i].COLOR || 'rgba(0,255,184,0.5)') ), show: new Cesium.ShowGeometryInstanceAttribute(true), //显示或者隐藏 }, }); polylineInstance.push(instance) regLeftClickCallback(data[i].attr.id, that.leftClickCB, that) } if (polylineInstance.length > 0) { that.entity.add( new Cesium.GroundPolylinePrimitive({ geometryInstances: polylineInstance, appearance: new Cesium.PolylineColorAppearance() }) ); } } static createPolygons(that, data) { if (!data) { return } let polygonInstance = [] for (let i = 0; i < data.length; i++) { data[i].attr.id || (data[i].attr.id = that.randomString()) let positions = data[i].positions let fromDegreesArray = [] for (let m = 0; m < positions.length; m++) { fromDegreesArray.push(positions[m].x, positions[m].y, positions[m].z) } let polygon = new Cesium.PolygonGeometry({ polygonHierarchy: new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArrayHeights(fromDegreesArray)), }); let instance = new Cesium.GeometryInstance({ id: data[i].attr.id, geometry: polygon, attributes: { color: Cesium.ColorGeometryInstanceAttribute.fromColor( Cesium.Color.fromCssColorString(data[i].COLOR || 'rgba(0,255,184,0.5)') ), show: new Cesium.ShowGeometryInstanceAttribute(true), //显示或者隐藏 }, }); polygonInstance.push(instance) regLeftClickCallback(data[i].attr.id, that.leftClickCB, that) } if (polygonInstance.length > 0) { let primitive = new Cesium.GroundPrimitive({ geometryInstances: polygonInstance, appearance: new Cesium.PerInstanceColorAppearance({ translucent: true, //false时透明度无效 closed: false, }), }) that.entity.add(primitive); } } 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 = `
暂无数据
暂无数据