cesium 图层构建的那些事 (二十一)

对于cesium entiy的增删改查 我们来封装一个layer来统一管理
类似arcgis js 的GraphicLayer

中间数据管理类

  • import {Layer} from "./Layer";
  •  
  • export abstract class DataSourceLayer extends Layer {
  • type: string = "DataSourceLayer";
  •  
  • protected _addToMap(map: any) {
  • map.dataSources.add(this.cesiumObj);
  • }
  •  
  • protected _removeByMap(destroy: boolean = true) {
  • this.map.dataSources.remove(this.cesiumObj);
  • this.cesiumObj = null;
  • }
  •  
  • on(eventName: string, callBacl: Function): this {
  • return this;
  • }
  •  
  • off(): this {
  • return this;
  • }
  • }

json序列化工具
```javascript

/**

  • 将cesium对象json化
    */
    export class CesiumToJson {
    private static excludes = ["_definitionChanged", "_children", "_propertyNames", "_type_"];
    public static entityToJson(entity: any): any {
    const option:any = {};
    if (!entity) {
    return option;
    }
    for (let key in entity) {
    if (!key.startsWith("_")) {
    continue;
    }
    if (this.excludes.indexOf(key) !== -1) {
    continue;
    }
    const value = entity[key];
    if (!value) {
    continue;
    }
    if (Object.prototype.toString.call(value) == "[object Function]") {
    continue;
    }
    key = key.substr(1, key.length);

    • if (key === "material") {
    • option[key] = this.entityToJson(value);
    • // 打包可能会引起问题,需要注意(未验证)
    • option[key].type = value.constructor.name;
    • continue;
    • }
    • if (Object.prototype.toString.call(value) == "[object Object]") {
    • console.log(key, value);
    • if (!(Object.prototype.toString.call(value._value) == "[object Undefined]")) {
    • option[key] = value._value;
    • } else if (!(Object.prototype.toString.call(value._callback) == "[object Undefined]")) {
    • // 如果是动态执行方法的,暂时不支持保存,后期想办法解析
    • continue;
    • } else {
    • option[key] = this.entityToJson(value);
    • }
    • } else {
    • option[key] = value;
    • }
    • }
    • return option;

    }
    public static entitiesToJson(entities: any): any {
    return entities.values.map((entity: any) => {
    return this.entityToJson(entity);
    })
    }

     

    public static jsonToEntityObj(option: any) {
    for (let key in option) {
    const value = option[key];
    if (key === "material") {
    let materialProperty = null;
    const type = value.type;
    delete value.type;
    let material = Cesium[type];
    if (material) {
    materialProperty = new material();
    for (const field in value) {
    materialProperty[field] = value[field];
    }
    }
    option[key] = materialProperty;
    } else if (Object.prototype.toString.call(value) == "[object Object]") {
    this.jsonToEntityObj(value);

posted @ 2022-01-20 17:49  haibalai  阅读(106)  评论(0编辑  收藏  举报