Skip to content

场景管理

创建场景

创建个人场景或项目场景

ts
/**
 * 创建新场景;项目id为空时为创建个人场景;项目id不为空时为创建项目场景
 * @param paramObj
 * @param paramObj.sceneName 场景名称
 * @param paramObj.project 项目id
 *  */
export async function createScene(paramObj: {
  sceneName: string
  project?: string
}) {
  const sceneId = newGUID()
  const datas = {
    sceneId: sceneId,
    dataJson: JSON.stringify(await gen_init_data(sceneId, paramObj.sceneName)),
    saveType: '1',
    ROOTPATH: location.origin,
    PAGEPATH: location.origin,
    projectId: paramObj.project
  }
  try {
    const res = await saveScene(datas)
    if (res.code !== 0) {
      throw new Error(res.msg)
    }
    console.log('创建场景成功')
  } catch (error: any) {
    console.log('创建场景失败:', error?.message ?? error?.msg ?? error)
  }
}
/**生成GUID */
function newGUID() {
  return generateGUID().replaceAll('-', '')
}
/**生成时间戳 */
function generateTimestamp() {
  const date = new Date()
  return date.toISOString()
}
/**生成初始dataJson */
async function gen_init_data(sceneId: string, sceneName: string) {
  const defaultSceneImg = await gen_default_scene_img(sceneId)
  const timeStamp = generateTimestamp()
  return {
    basicInfo: {
      sceneId: sceneId,
      title: sceneName,
      keyWord: '',
      coverImg: defaultSceneImg,
      logoImg: '',
      description: '',
      sceneStatus: '2',
      viewPoint: {},
      templateId: '1',
      tempcoverImg: defaultSceneImg,
      backstage: false
    },
    scene: {
      asset: {
        version: '1.0.0',
        date: timeStamp
      },
      scene: {
        properties: {
          minimumDisableDepthTestDistance: 0,
          shadows: false
        },
        imageryLayers: [
          {
            type: 'LSImageryProvider',
            name: {
              title: 'zkxt-img'
            },
            url: '../../../api/admin/tx/preview/v1.0.0/geovis/zkxt-img.lrc?token=9b00db78-ac97-4ead-9cb9-3bee718d024f',
            subdomains: ['', 0, 1, 2, 3],
            show: true
          },
          {
            type: 'LSImageryProvider',
            name: {
              title: 'skyLandImage'
            },
            url: '../../../api/admin/tx/preview/v1.0.0/tdt/tdtMarker.lrc?token=9b00db78-ac97-4ead-9cb9-3bee718d024f',
            subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
            show: true
          }
        ],
        terrainLayers: [],
        layers: [],
        pageLODLayers: [],
        datasources: [],
        date: timeStamp
      },
      VERSION: (LSGlobe as any)?.VERSION ?? '3.0.0.971',
      Tree: [
        {
          id: 'skyLandImage',
          name: '天地图道路标注',
          type: 1,
          isParent: false,
          dropInner: false,
          checked: true,
          icon: '../../../scene/manage/images/sceneset/tree/icon-imagery.png',
          level: 0,
          tId: 'treeLayer_1',
          parentTId: null,
          open: false,
          zAsync: true,
          isFirstNode: true,
          isLastNode: false,
          isAjaxing: false,
          pId: 0,
          checkedOld: true,
          nocheck: null,
          chkDisabled: false,
          halfCheck: false,
          check_Child_State: -1,
          check_Focus: false,
          isHover: false,
          editNameFlag: false
        },
        {
          id: 'zkxt-img',
          name: '中科星图全球影像',
          type: 1,
          isParent: false,
          dropInner: false,
          checked: true,
          icon: '../../../scene/manage/images/sceneset/tree/icon-imagery.png',
          level: 0,
          tId: 'treeLayer_2',
          parentTId: null,
          open: false,
          zAsync: true,
          isFirstNode: false,
          isLastNode: true,
          isAjaxing: false,
          pId: 0,
          checkedOld: true,
          nocheck: null,
          chkDisabled: false,
          halfCheck: false,
          check_Child_State: -1,
          check_Focus: false,
          isHover: false,
          editNameFlag: false
        }
      ]
    },
    fly: {
      sceneId: sceneId,
      lines: []
    },
    splitscreen: {
      sceneId: sceneId,
      screens: []
    },
    draw: {
      type: 'FeatureCollection',
      features: []
    },
    monomer: {
      type: 'FeatureCollection',
      features: []
    },
    push: {
      type: 'FeatureCollection',
      features: []
    },
    water: {
      type: 'FeatureCollection',
      features: []
    },
    clip: {
      type: 'FeatureCollection',
      features: []
    },
    drawDetail: {
      sceneId: sceneId,
      points: [],
      polylines: [],
      polygons: []
    },
    deleteObj: {
      sceneId: sceneId,
      images: [],
      videos: [],
      drawDetails: []
    }
  }
}
/**生成默认场景图片 */
async function gen_default_scene_img(sceneid: string) {
  const imgBase64 = await urlToBase64('') //图片url
  const fd = new FormData()
  fd.append('sceneId', sceneid)
  fd.append('imageBase64Code', imgBase64)
  const res = await uploadSceneTempImg(fd)
  return res.data
}
/**url转base64 */
async function urlToBase64(url: string): Promise<string> {
  try {
    const response = await fetch(url)
    const blob = await response.blob()
    return new Promise((resolve, reject) => {
      const reader = new FileReader()
      reader.onload = () => resolve(reader.result as string)
      reader.onerror = reject
      reader.readAsDataURL(blob)
    })
  } catch (error) {
    console.error('图片转base64失败:', error)
    throw error
  }
}
/**
 * 保存场景
 */
function saveScene(data: any) {
  return request({
    url: '/admin/api/scene/v1.0.0/saveScene',
    method: 'post',
    data
  })
}
/**场景上传base64图片
 * @param data sceneId:场景id,imageBase64Code:图片base64(只支持jpeg)
 */
export function uploadSceneTempImg(data: FormData) {
  return request({
    url: '/admin/api/scene/v1.0.0/uploadTempImg',
    method: 'post',
    data
  })
}
function generateGUID(): string {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
    const r = (Math.random() * 16) | 0
    const v = c === 'x' ? r : (r & 0x3) | 0x8
    return v.toString(16)
  })
}

场景列表

获取项目场景列表

ts
function fetchProjectSceneList(params: {
  projectId: string //项目id
  current: number //当前页
  size: number //每页条数
  queryStartDate?: string //查询开始时间,格式YYYY-MM-DD
  queryEndDate?: string //查询结束时间,格式YYYY-MM-DD
  title?: string //场景名称
  createBy?: string //创建人
}) {
  return request({
    url: '/admin/api/scene/v1.0.0/pageList',
    method: 'get',
    params: {
      projectId: params.projectId,
      page: params.current,
      limit: params.size,
      queryStartDate: params.queryStartDate,
      queryEndDate: params.queryEndDate,
      title: params.title,
      createBy: params.createBy
    }
  })
}

获取个人场景/个人所有项目场景列表

ts
function fetchUserSceneList(params: {
  // 1 个人场景 2个人所有项目场景
  queryType: '1' | '2'
  current: string
  size: string
}) {
  return request({
    url: '/admin/api/scene/v1.0.0/pageListByUser',
    method: 'get',
    params
  })
}

删除场景

ts
/**
 * 删除场景
 * @param sceneId 场景id
 */
function deleteScene(sceneId: string) {
  return request({
    url: `/admin/api/scene/v1.0.0/deleteScene`,
    method: 'get',
    params: {
      sceneId
    }
  })
}

推荐场景至首页

ts
/**推荐场景到首页 */
function recommendScene(params: { sceneId: string }) {
  return request({
    url: '/admin/api/scene/v1.0.0/recommend',
    method: 'get',
    params
  })
}
/**取消推荐场景 */
function rescindRecommendScene(params: { sceneId: string }) {
  return request({
    url: '/admin/api/scene/v1.0.0/rescind/recommend',
    method: 'get',
    params
  })
}
/**获取推荐场景列表 */
function recommendSceneList(params: { current: string; size: string }) {
  return request({
    url: '/admin/api/scene/v1.0.0/recommendList',
    method: 'get',
    params
  })
}

打开场景编辑/预览

场景编辑

ts
function editScene(sceneId: string) {
  window.open(`/scene/manage/scenesetting.html?guid=${sceneId}`, '_blank')
}

场景预览

ts
/**预览场景 */
previewScene('ffdf3747e27a4fa69056339ae7ec468a', getSceneTemplateList())

/**
 * 预览场景
 * @param sceneId 场景id
 * @param sceneTemplateListPromise 场景模板列表promise
 */
async function previewScene(
  sceneId: string,
  sceneTemplateListPromise: ReturnType<typeof getSceneTemplateList>
) {
  try {
    const [infoRes, res] = await Promise.all([
      getSceneInfo(sceneId),
      sceneTemplateListPromise
    ])
    const templateId = infoRes.data.templateId
    const list = res.data
    const templeteObj = list.find((e: any) => e.id === templateId)
    window.open(`${templeteObj.url}?guid=${sceneId}`, `_blank`)
  } catch (error) {
    console.error(error)
  }
}
/**
 * 获取场景信息
 * @param sceneId 场景id
 */
function getSceneInfo(sceneId: string) {
  return request({
    url: '/admin/api/scene/v1.0.0/getSceneInfo',
    method: 'get',
    params: {
      sceneId
    }
  })
}
/**
 * 获取场景模板列表
 */
function getSceneTemplateList() {
  return request({
    url: '/admin/api/sceneTemplate/v1.0.0/list',
    method: 'get'
  })
}

Released under the MIT License.