场景接口文档

概述

window.scene.api 是Geotwin APP对外暴露的 JavaScript API 接口,允许外部通过该接口控制和操作 3D 场景地图。外部系统(包括页面脚本、集成平台等)应统一通过 window.scene.api 调用相关功能。

初始化

当场景地图组件创建完成后,会自动将 API 挂载到 window.scene.api 上。可以通过监听 sceneReady 事件来确保 API 已就绪:

window.addEventListener('sceneReady', (event) => {
    const { compositeViewer, viewer } = event.detail;
    console.log('场景已准备就绪');
    // 此时可以安全地使用 window.scene.api
});

API 方法

getCompositeViewer()

获取复合视图器实例。

返回值:

  • CompositeViewer - 复合视图器实例,包含场景的所有组件管理器

示例:

const compositeViewer = window.scene.api.getCompositeViewer();
const layerComponent = compositeViewer.componentManager.getComponent(LayerComponent);

getBookmark()

获取当前场景的书签列表。该方法会请求后端接口获取与当前场景 sceneId 相关联的书签数据。

注意:

  • 依赖场景数据中的 sceneId 与地图组件配置中的 option.server(作为接口 baseURL)
  • 如果当前未能获取到 sceneId 或 server,将返回一个被拒绝的 Promise

返回值:

  • Promise<any> - 书签列表接口返回的原始响应数据

示例:

window.scene.api.getBookmark()
  .then((res) => {
    // 具体结构取决于后端实现,这里给出一个典型用法
    const rows = res.data?.data?.rows ?? [];
    console.log('书签列表:', rows);
  })
  .catch((err) => {
    console.error('获取书签失败:', err);
  });

triggerSceneGraphDelta(delta)

触发场景图增量更新,用于对场景中的节点进行增删改操作。

参数:

  • delta: ISceneGraphDelta - 场景图增量数据对象

ISceneGraphDelta 类型:

1. 插入节点 (Insert)

{
    type: "Insert",
    delta: INodeData  // 完整的节点数据
}

2. 修改节点 (Change)

{
    type: "Change",
    delta: {
        guid: string,  // 必需:节点的唯一标识符
        // 其他要修改的属性(可选)
        name?: string,
        visible?: boolean,
        // ... 其他 INodeData 属性
    }
}

3. 删除节点 (Delete)

{
    type: "Delete",
    delta: {
        guid: string,  // 必需:要删除节点的唯一标识符
    }
}

示例:

// 修改节点可见性
window.scene.api.triggerSceneGraphDelta({
    type: "Change",
    delta: {
        guid: "node-guid-123",
        visible: false
    }
});

// 删除节点
window.scene.api.triggerSceneGraphDelta({
    type: "Delete",
    delta: {
        guid: "node-guid-123"
    }
});

genGUID()

生成GUID,确保在外部创建的实体与场景图中的实体使用同一套ID生成规则

返回值:

  • GUID - GUID

示例:

const guid = window.scene.api.genGUID()

flyTo(...args)

相机飞行到指定位置。

参数:

  • x: number - X 坐标
  • y: number - Y 坐标
  • z: number - Z 坐标(高度)
  • heading?: number - 方位角(度)
  • pitch?: number - 俯仰角(度)
  • roll?: number - 翻滚角(度)
  • duration?: number - 飞行持续时间(毫秒)

示例:

// 飞行到指定位置
window.scene.api.flyTo({
    x: 0,
    y: 0,
    z: 1000,
    heading: 0,
    pitch: -45,
    duration: 2000
});

flyToEntity(guid)

相机飞行到指定实体(图层)。

参数:

  • guid: string - 实体的唯一标识符 GUID

示例:

// 飞行到指定图层
window.scene.api.flyToEntity("layer-guid-123");

flyToGeometry(geometry)

相机飞行到指定的 GeoJSON 几何图形。

参数:

  • geometry: Geometry - GeoJSON 标准几何对象

GeoJSON Geometry 类型包括:

  • Point - 点
  • LineString - 线
  • Polygon - 多边形
  • MultiPoint - 多点
  • MultiLineString - 多线
  • MultiPolygon - 多多边形

示例:

// 飞行到多边形区域
window.scene.api.flyToGeometry({
    type: "Polygon",
    coordinates: [
        [
            [116.3, 39.9],
            [116.4, 39.9],
            [116.4, 40.0],
            [116.3, 40.0],
            [116.3, 39.9]
        ]
    ]
});

// 飞行到点
window.scene.api.flyToGeometry({
    type: "Point",
    coordinates: [116.404, 39.915]
});

flyToBookmark(bookmark, duration)

根据书签数据飞行到指定视角位置。

参数:

  • bookmark: object - 书签数据对象,通常包含以下字段:
    • longitude: number - 书签经度(WGS84,经纬度坐标系 4326)
    • latitude: number - 书签纬度(WGS84,经纬度坐标系 4326)
    • height: number - 相机高度
    • heading: number - 航向角(度)
    • tilt: number - 俯仰角(度)
  • duration: number - 飞行持续时间(秒)

示例:

const bookmark = {
  longitude: 116.404,
  latitude: 39.915,
  height: 500,
  heading: 30,
  tilt: -45,
};

// 在 3 秒内飞行到书签位置
window.scene.api.flyToBookmark(bookmark, 3);

translateCoord(options)

坐标转换工具方法,基于引擎内置的 CoordTransform.translate 实现,可在不同坐标系 / 投影之间进行转换。

参数:

  • options: object - 坐标转换配置对象,常用字段包括:
    • fromEPSG?: string - 源坐标系 EPSG 代码(例如 "4326")
    • toProj4?: string - 目标投影的 proj4 字符串(通常可从 viewer.proj4 获取)
    • x: number - 源坐标 X(经度或平面 X)
    • y: number - 源坐标 Y(纬度或平面 Y)

返回值:

  • number[] - 转换后的坐标数组,一般为 [x, y]

示例:

const cv = window.scene.api.getCompositeViewer();
const viewer = cv.viewer;

// 将 WGS84 经纬度转换到当前场景投影坐标
const [x, y] = window.scene.api.translateCoord({
  fromEPSG: "4326",
  toProj4: viewer.proj4,
  x: 116.404,
  y: 39.915,
});

console.log('投影坐标:', x, y);

setViewMode(mode)

设置视图模式。

参数:

  • mode: "2D" | "3D" - 视图模式
    • "2D" - 2D 平面视图
    • "3D" - 3D 立体视图

示例:

// 切换到 2D 模式
window.scene.api.setViewMode("2D");

// 切换到 3D 模式
window.scene.api.setViewMode("3D");

backToTheNorth()

将相机方位角重置为正北方向(heading = 0),保持当前位置和俯仰角不变。

示例:

// 回到正北方向
window.scene.api.backToTheNorth();

getFlyControl()

获取飞行控制组件实例(FlyThroughComponent),用于实现更复杂的飞行路径控制等高级功能。

返回值:

  • FlyThroughComponent - 飞行控制组件实例,具体能力请参考 @gt-viewer/sdk 文档

示例:

const flyControl = window.scene.api.getFlyControl();
// 根据 SDK 文档使用 flyControl 实例进行自定义飞行控制

vectorHighlight 高亮控制

vectorHighlight 是挂载在 window.scene.api 下的一个子对象,用于控制矢量图层的高亮效果。

vectorHighlight.add(guid, ids)

为指定矢量图层添加高亮要素。

参数:

  • guid: string - 图层的 GUID
  • ids: number[] - 需要高亮的要素 ID 数组

示例:

// 高亮图层中 ID 为 1、2、3 的要素
window.scene.api.vectorHighlight.add("layer-guid-123", [1, 2, 3]);

vectorHighlight.remove(guid, ids)

移除指定要素的高亮效果。

参数:

  • guid: string - 图层的 GUID
  • ids: number[] - 需要取消高亮的要素 ID 数组

示例:

// 取消对要素 2、3 的高亮
window.scene.api.vectorHighlight.remove("layer-guid-123", [2, 3]);

vectorHighlight.clear(guid)

清除指定图层的所有高亮效果。

参数:

  • guid: string - 图层的 GUID

示例:

// 清除整个图层的高亮
window.scene.api.vectorHighlight.clear("layer-guid-123");

其他事件

sceneGraphChange 事件

当场景图发生变化时触发。

监听示例:

window.addEventListener('sceneGraphChange', (event) => {
    const sceneData = event.detail.data;
    console.log('场景图已更新', sceneData);
});

完整使用示例

// 等待场景准备就绪
window.addEventListener('sceneReady', (event) => {
    console.log('场景已就绪');

    // 获取复合视图器
    const compositeViewer = window.scene.api.getCompositeViewer();

    // 飞行到指定位置
    window.scene.api.flyTo({
        x: 0,
        y: 0,
        z: 5000,
        heading: 0,
        pitch: -60,
        duration: 3000
    });

    // 3秒后切换到2D视图
    setTimeout(() => {
        window.scene.api.setViewMode("2D");
    }, 3000);

    // 6秒后回到正北方向
    setTimeout(() => {
        window.scene.api.backToTheNorth();
    }, 6000);
});

// 监听场景图变化
window.addEventListener('sceneGraphChange', (event) => {
    console.log('场景数据更新:', event.detail.data);
});

// 修改节点可见性
function toggleNodeVisibility(guid, visible) {
    window.scene.api.triggerSceneGraphDelta({
        type: "Change",
        delta: {
            guid: guid,
            visible: visible
        }
    });
}

// 飞行到某个实体
function focusOnEntity(guid) {
    window.scene.api.flyToEntity(guid);
}

// 飞行到北京天安门
function flyToTiananmen() {
    window.scene.api.flyToGeometry({
        type: "Point",
        coordinates: [116.404, 39.915]
    });
}

数据结构

INodeData

节点数据结构(简化版):

interface INodeData {
    guid: string;           // 节点唯一标识符
    type: string;           // 节点类型:VIEWER | LAYER | FEATURE
    name?: string;          // 节点名称
    visible?: boolean;      // 是否可见
    parentIndex?: number;   // 父节点索引
    render?: object;        // 渲染数据
    animation?: any[];      // 动画数据
    meta?: object;          // 元数据
}

注意事项

  1. API 可用性:确保在 sceneReady 事件触发后再使用 API
  2. GUID 格式:所有 GUID 参数应为有效的字符串标识符
  3. 坐标系统:坐标参数取决于场景使用的投影坐标系
  4. 角度单位:flyTo 方法中的 heading、pitch、roll 参数单位为度(degree)
  5. 异步操作:飞行操作是异步的,如需在飞行完成后执行操作,请使用适当的延时或回调

版本信息

  • 文档版本:1.1.0
  • 更新日期:2026-02-28