Cesium-(Primitive)-(PolygonOutlineGeometry)

文摘   2025-01-09 10:38   宁夏  

PolygonOutlineGeometry

带有轮廓线的多边形

以下是 PolygonOutlineGeometry 类的构造函数属性,以表格形式展示:

属性名
类型
默认值
描述
polygonHierarchy
PolygonHierarchy

可以包含洞的多边形层级结构。
height
number
0.0
多边形与椭球体表面之间的距离,单位为米。
extrudedHeight
number

多边形拉伸面与椭球体表面之间的距离,单位为米。
vertexFormat
VertexFormat
VertexFormat.DEFAULT
要计算的顶点属性。
ellipsoid
Ellipsoid
Ellipsoid.default
用作参考的椭球体。
granularity
number
CesiumMath.RADIANS_PER_DEGREE
每个经纬度之间的距离,单位为弧度。决定缓冲区中的位置数量。
perPositionHeight
boolean
false
使用 options.positions 的高度值代替 options.height 确定高度。
arcType
ArcType
ArcType.GEODESIC
轮廓必须遵循的路径类型。有效选项是 ArcType.GEODESIC 和 ArcType.RHUMB

以下是 PolygonOutlineGeometry 类的静态方法和属性:

方法/属性名称
返回类型
描述
packedLength
number
将对象打包到数组中使用的元素数量。
createGeometry(polygonGeometry)
Geometry | undefined
计算多边形轮廓的几何表示,包括顶点、索引和边界球。
fromPositions(options)
PolygonOutlineGeometry
从位置数组定义的多边形轮廓。
pack(value, array, startingIndex)
Array.
将提供的实例存储到提供的数组中。
unpack(array, startingIndex, result)
PolygonOutlineGeometry
从打包的数组中检索实例。

以下是 createGeometry 方法的参数和返回值:

参数名
类型
描述
polygonGeometry
PolygonOutlineGeometry
多边形轮廓的描述。
返回值
The computed vertices and indices.
计算得到的顶点和索引。

以下是 fromPositions 方法的参数:

参数名
类型
默认值
描述
options
object

包含属性的对象。

以下是 pack 方法的参数和返回值:

参数名
类型
默认值
描述
value
PolygonOutlineGeometry

要打包的值。
array
Array.

要打包进的数组。
startingIndex
number
0
开始打包元素的数组索引。

返回值:被打包的数组。

以下是 unpack 方法的参数和返回值:

参数名
类型
默认值
描述
array
Array.

打包的数组。
startingIndex
number
0
要解包的元素的起始索引。
result
PolygonOutlineGeometry

用于存储结果的对象。

返回值:修改后的结果参数或如果没有提供新实例,则为一个新的 PolygonOutlineGeometry 实例。

案例

添加带有轮廓线的多边形包含以下步骤:

  1. 定义多边形轮廓线(polygon1
  • 使用Cesium.PolygonOutlineGeometry构造函数创建了一个多边形轮廓线的几何体。
  • 通过polygonHierarchy属性定义了多边形的层次结构,包括一个外部轮廓和嵌套的内部孔。这些轮廓和孔是通过经纬度(度为单位)数组定义的,然后这些经纬度被转换成Cesium的Cartesian3坐标系统。
  • 这里定义了一个具有一个外部轮廓和两个内部孔(其中一个内部孔还有一个更小的内部孔)的复杂多边形。
  • 将多边形轮廓线几何体转换为可渲染的几何体(geometry1
    • 调用Cesium.PolygonOutlineGeometry.createGeometry(polygon1)polygon1几何体定义转换为Cesium引擎可以理解的格式,这涉及到实际的几何计算,如顶点、边和面的生成。
  • 创建第一个几何体实例(polygonInstance1
    • 使用Cesium.GeometryInstance构造函数将geometry1与额外的属性(如颜色)关联起来,创建一个几何体实例。这里设置了颜色为蓝色,并给实例指定了一个ID。
  • 创建第二个多边形轮廓线(polygon2)并转换为可渲染的几何体(geometry2
    • 使用Cesium.PolygonOutlineGeometry.fromPositions快捷方式从一组点直接创建另一个多边形轮廓线的几何体,并指定了一个拉伸高度(extrudedHeight),使其具有立体感。
    • 类似于polygon1,调用createGeometry方法来准备渲染。
  • 创建第二个几何体实例(polygonInstance2
    • 类似于polygonInstance1,但这次将颜色设置为红色,并给实例指定了另一个ID。
  • 创建并添加Primitive到Cesium Viewer
    • 使用Cesium.Primitive构造函数创建一个Primitive,这是一个可以在Cesium场景中渲染的图形对象。这里指定了两个几何体实例(polygonInstance1polygonInstance2)作为要渲染的内容。
    • asynchronous属性设置为false,但在这种情况下,对于PolygonOutlineGeometry,这个属性实际上不会影响渲染过程,因为轮廓线的渲染通常是同步的。
    • 设置了appearance属性,使用Cesium.PerInstanceColorAppearance来根据每个实例的颜色属性进行渲染。这里指定了渲染不应是半透明的(translucent: false),并且使用平面阴影(flat: true),意味着渲染时不考虑光照效果。
    • 最后,将Primitive添加到Cesium Viewer的场景(viewer.scene.primitives)中,以便在3D地球仪上渲染这两个多边形轮廓线。
    // 定义一个函数,该函数接收一个 Cesium 视图器(Cesium.Viewer)实例作为参数
    addPolygonOutlineGeometry(viewer) {
    // 创建一个 PolygonOutlineGeometry 实例,用于描述一个多边形的轮廓线
    // 这里定义了一个复杂的多边形,它有一个外部轮廓和多个内部孔
    let polygon1 = new Cesium.PolygonOutlineGeometry({
      // polygonHierarchy 定义了多边形的层次结构
      polygonHierarchy : new Cesium.PolygonHierarchy(
        // 外部轮廓的顶点数组,通过经纬度转换而来
        Cesium.Cartesian3.fromDegreesArray([
          -109.0, 30.0,
          -95.0, 30.0,
          -95.0, 40.0,
          -109.0, 40.0
        ]),
        // 内部孔的层次结构数组,这里定义了两个内部孔
        [
          new Cesium.PolygonHierarchy(
            // 第一个内部孔的顶点数组
            Cesium.Cartesian3.fromDegreesArray([
              -107.0, 31.0,
              -107.0, 39.0,
              -97.0, 39.0,
              -97.0, 31.0
            ]),
            // 第一个内部孔内部的孔(如果有的话),这里还有一个内部孔
            [
              new Cesium.PolygonHierarchy(
                // 第二个内部孔的顶点数组
                Cesium.Cartesian3.fromDegreesArray([
                  -105.0, 33.0,
                  -99.0, 33.0,
                  -99.0, 37.0,
                  -105.0, 37.0
                ]),
                // 第二个内部孔内部的孔(这里没有定义,所以是空的)
                []
              )
            ]
          )
        ]
      )
    });

    // 将 PolygonOutlineGeometry 实例转换为实际可用于渲染的几何体
    let geometry1 = Cesium.PolygonOutlineGeometry.createGeometry(polygon1);

    // 创建一个 GeometryInstance 实例,将上述几何体与其他属性(如颜色)关联起来
    let polygonInstance1 = new Cesium.GeometryInstance({
      geometry: geometry1,
      // 为这个几何体实例设置颜色属性,这里设置为蓝色
      attributes: {
        color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE)
      },
      // 为这个几何体实例设置一个唯一的标识符
      id: 'polygonInstance1'
    });

    // 使用一组点直接创建一个新的 PolygonOutlineGeometry 实例
    let polygon2 = Cesium.PolygonOutlineGeometry.fromPositions({
      // 点的数组,通过经纬度转换而来
      positions : Cesium.Cartesian3.fromDegreesArray([
        -72.0, 40.0,
        -70.0, 35.0,
        -75.0, 30.0,
        -70.0, 30.0,
        -68.0, 40.0
      ]),
      // 设置多边形的拉伸高度,使其具有立体感
      extrudedHeight: 300000
    });

    // 将 PolygonOutlineGeometry 实例转换为实际可用于渲染的几何体
    let geometry2 = Cesium.PolygonOutlineGeometry.createGeometry(polygon2);

    // 为第二个多边形轮廓线创建一个 GeometryInstance 实例,并设置颜色为红色
    let polygonInstance2 = new Cesium.GeometryInstance({
      geometry: geometry2,
      attributes: {
        color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.RED)
      },
      id: 'polygonInstance2'
    });

    // 创建一个 Primitive 实例,用于将多个几何体实例渲染到 Cesium 场景中
    let primitive = new Cesium.Primitive({
      // 包含要渲染的几何体实例数组
      geometryInstances: [polygonInstance1, polygonInstance2],
      // 注意:对于 PolygonOutlineGeometry,asynchronous 参数通常不影响渲染过程,
      // 因为 PolygonOutlineGeometry 的渲染是同步的
      asynchronous: false,
      // 设置 Primitive 的外观,这里使用 PerInstanceColorAppearance 来根据每个实例的颜色属性进行渲染
      appearance: new Cesium.PerInstanceColorAppearance({
        // 设置几何体不是半透明的
        translucent: false,
        flat: true,//当 true 时,片段着色器中将使用平面阴影,这意味着不考虑光照
          })
      });

            viewer.scene.primitives.add(primitive);
    }

    GISer世界
    热门GIS开源库介绍、GIS开源库实战教程、GIS技术前沿动态(关注GIS技术的最新发展)、GIS行业应用案例分享(分享众多GIS在不同行业中的应用案例)、GIS技术交流互动
     最新文章