Cesium-(Primitive)-(PolygonGeometry、RectangleOutlineGeometry)

文摘   2025-01-16 22:24   宁夏  

1、PolygonGeometry
image
image

多边形几何体

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

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

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

可选的,多边形拉伸面与椭球体表面之间的距离,单位为米。
vertexFormat
VertexFormat
VertexFormat.DEFAULT
可选的,要计算的顶点属性。
stRotation
number
0.0
可选的,纹理坐标的旋转角度,单位为弧度。顺时针为正。
ellipsoid
Ellipsoid
Ellipsoid.default
可选的,用作参考的椭球体。
granularity
number
CesiumMath.RADIANS_PER_DEGREE
可选的,每个经纬度之间的距离,单位为弧度。决定缓冲区中的位置数量。
perPositionHeight
boolean
false
可选的,使用 options.positions 的高度值代替 options.height 确定高度。
closeTop
boolean
true
可选的,当为 false 时,拉伸多边形的顶部保持开放。
closeBottom
boolean
true
可选的,当为 false 时,拉伸多边形的底部保持开放。
arcType
ArcType
ArcType.GEODESIC
可选的,多边形边缘必须遵循的线条类型。有效选项是 ArcType.GEODESIC 和 ArcType.RHUMB
textureCoordinates
PolygonHierarchy

可选的,作为 Cartesian2 点的 PolygonHierarchy 的纹理坐标。对于地面原语无效。

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

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

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

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

定义多边形外边界的线性环。
ellipsoid
Ellipsoid
Ellipsoid.default
可选的,用作参考的椭球体。
arcType
ArcType
ArcType.GEODESIC
可选的,多边形边缘必须遵循的线条类型。
result
Rectangle

可选的,用于存储结果的对象。

返回值:结果矩形。

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

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

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

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

包含属性的对象。
返回值
PolygonGeometry

根据位置创建的多边形几何体。

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

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

要打包的值。
array
Array.

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

返回值:被打包的数组。

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

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

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

用于存储结果的对象。

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

案例

添加两个多边形几何体。下面是该函数的详细解释:

  1. 创建第一个多边形(polygon1)
  • 使用 Cesium.PolygonGeometry 构造函数创建一个多边形几何体。
  • polygonHierarchy 参数定义了多边形的形状和嵌套结构。这里,它首先定义了一个外层多边形(一个矩形),然后通过嵌套的 Cesium.PolygonHierarchy 数组定义了一个或多个孔(内部多边形)。
  • 外层多边形的顶点通过 Cesium.Cartesian3.fromDegreesArray 方法从经纬度数组转换而来,形成一个矩形。
  • 第一个内部多边形(孔)同样通过经纬度数组定义,并嵌套在外层多边形内。此内部多边形也包含一个更小的内部多边形作为孔。
  • 调用 Cesium.PolygonGeometry.createGeometry(polygon1) 将 PolygonGeometry 转换为实际的几何体数据,以便渲染。
  • 创建第一个多边形实例(polygonInstance1)
    • 使用 Cesium.GeometryInstance 构造函数创建一个几何体实例。这个实例将用于将几何体添加到场景中,并可以附加额外的属性(如颜色)。
    • geometry 属性设置为上面创建的 geometry1
    • attributes 属性用于定义每个实例的颜色,这里设置为蓝色。
    • id 属性为实例设置了一个唯一标识符。
  • 创建第二个多边形(polygon2)
    • 使用 Cesium.PolygonGeometry.fromPositions 方法直接从一组点创建多边形几何体。这种方法比使用 polygonHierarchy 更简单,适合没有嵌套孔的情况。
    • positions 参数是一个经纬度数组,定义了多边形的顶点。
    • extrudedHeight 参数设置了多边形的拉伸高度,使其具有立体感。
    • 同样,调用 Cesium.PolygonGeometry.createGeometry(polygon2) 将几何体描述转换为可渲染的几何体数据。
  • 创建第二个多边形实例(polygonInstance2)
    • 类似于第一个多边形实例的创建,但这次使用第二个多边形的几何体和红色作为颜色。
  • 创建并添加 Primitive
    • 使用 Cesium.Primitive 构造函数创建一个新的 Primitive 实例。Primitive 是 Cesium 中用于渲染几何体的基础对象。
    • geometryInstances 属性包含要渲染的几何体实例数组(这里有两个实例)。
    • asynchronous 属性设置为 false,但在这种情况下,它实际上并不影响 Primitive 的渲染,因为 Primitive 的渲染通常是同步的。
    • appearance 属性设置为 Cesium.PerInstanceColorAppearance,它允许每个几何体实例根据其属性中定义的颜色进行渲染。这里还设置了 translucent(半透明)为 false 和 flat(平面阴影)为 true,意味着几何体将使用平面着色,不考虑光照效果。
    • 最后,使用 viewer.scene.primitives.add(primitive) 将 Primitive 添加到 Cesium 场景中,以便在地图上渲染。
    addPolygonGeometry(viewer) {
      // 定义一个函数,用于向Cesium Viewer中添加多边形几何体

      // 1. 创建一个嵌套多边形几何体 (polygon1)
      // 这是一个具有多级嵌套的多边形,每个内部多边形定义了一个孔
    let polygon1 = new Cesium.PolygonGeometry({
        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
              ]),
              // 第二个内部多边形没有进一步的嵌套
              [new Cesium.PolygonHierarchy(
                // 这里实际上是不必要的嵌套,因为内部没有更多的多边形
                Cesium.Cartesian3.fromDegreesArray([
                  -103.0, 34.0,
                  -101.0, 34.0,
                  -101.0, 36.0,
                  -103.0, 36.0
                ])
              )] // 注意:这里的嵌套并没有实际效果,因为内部没有更多的多边形
            )]
          )]
        )
      });
    let geometry1 = Cesium.PolygonGeometry.createGeometry(polygon1); // 转换为可渲染的几何体

      // 2. 创建多边形几何体实例 (polygonInstance1)
    let polygonInstance1 = new Cesium.GeometryInstance({
        geometry: geometry1,
        attributes: {
          color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE) // 设置颜色为蓝色
        },
        id: 'polygonInstance1' // 设置实例ID
      });

      // 3. 从一组点创建一个多边形几何体 (polygon2)
      // 这是一个简单的多边形,没有嵌套孔
    let polygon2 = Cesium.PolygonGeometry.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 // 设置拉伸高度
      });
    let geometry2 = Cesium.PolygonGeometry.createGeometry(polygon2); // 转换为可渲染的几何体

      // 4. 创建多边形几何体实例 (polygonInstance2)
    let polygonInstance2 = new Cesium.GeometryInstance({
        geometry: geometry2,
        attributes: {
          color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.RED) // 设置颜色为红色
        },
        id: 'polygonInstance2' // 设置实例ID
      });

      // 5. 创建一个Primitive,用于将多边形实例添加到Cesium Viewer的场景中
    let primitive = new Cesium.Primitive({
        geometryInstances: [polygonInstance1, polygonInstance2], // 包含两个多边形实例
        asynchronous: false, // 渲染是否异步进行(但这里通常对Primitive的渲染没有影响)
        appearance: new Cesium.PerInstanceColorAppearance({
          translucent: false, // 是否半透明
          flat: true // 是否使用平面阴影(不考虑光照)
        })
      });

      // 6. 将Primitive添加到Cesium Viewer的场景中
      viewer.scene.primitives.add(primitive);

    2、RectangleOutlineGeometry

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

    属性名
    类型
    默认值
    描述
    rectangle
    Rectangle

    具有北、南、东、西属性的地理矩形,单位为弧度。
    ellipsoid
    Ellipsoid
    Ellipsoid.default
    可选的,矩形所在的椭球体。
    granularity
    number
    CesiumMath.RADIANS_PER_DEGREE
    可选的,每个经纬度之间的距离,单位为弧度。决定缓冲区中的位置数量。
    height
    number
    0.0
    可选的,矩形与椭球体表面之间的距离,单位为米。
    rotation
    number
    0.0
    可选的,矩形的旋转角度,单位为弧度。顺时针为正。
    extrudedHeight
    number

    可选的,矩形拉伸面与椭球体表面之间的距离,单位为米。

    以下是 RectangleOutlineGeometry 类构造函数可能抛出的错误:

    • DeveloperErroroptions.rectangle.north 必须在区间 [-PI/2, PI/2] 内。
    • DeveloperErroroptions.rectangle.south 必须在区间 [-PI/2, PI/2] 内。
    • DeveloperErroroptions.rectangle.east 必须在区间 [-PI, PI] 内。
    • DeveloperErroroptions.rectangle.west 必须在区间 [-PI, PI] 内。
    • DeveloperErroroptions.rectangle.north 必须大于 rectangle.south

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

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

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

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

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

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

    要打包的值。
    array
    Array.

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

    返回值:被打包的数组。

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

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

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

    用于存储结果的对象。

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

    案例

    addRectangleOutlineGeometry(viewer) {

      // 1. 创建一个矩形的轮廓线几何体
    let rectangle1 = new Cesium.RectangleOutlineGeometry({
        ellipsoid: Cesium.Ellipsoid.WGS84, // 使用WGS84椭球体
        rectangle: Cesium.Rectangle.fromDegrees(-80.0, 39.0, -74.0, 42.0), // 矩形的经纬度范围
        height: 10000.0 // 轮廓线的高度(但请注意,这通常对轮廓线没有直接影响,因为它只是线)
      });
    let geometry1 = Cesium.RectangleOutlineGeometry.createGeometry(rectangle1); // 将几何体转换为渲染引擎可以理解的格式

      // 创建一个矩形轮廓线的实例,但请注意,这里的颜色属性可能不会被正确应用
    let rectangleInstance1 = new Cesium.GeometryInstance({
        geometry: geometry1,
        attributes: {
          color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE) // 尝试设置颜色,但可能无效
        },
        id: 'rectangleInstance1' // 更正ID以反映其实际内容
      });

      // 2. 创建一个拉伸的矩形轮廓线(无顶部),但请注意拉伸对轮廓线没有直接影响
    let rectangle2 = new Cesium.RectangleOutlineGeometry({
        ellipsoid: Cesium.Ellipsoid.WGS84,
        rectangle: Cesium.Rectangle.fromDegrees(-80.0, 39.0, -74.0, 42.0),
        height: 200000.0, // 底部高度(对轮廓线无直接影响)
        extrudedHeight: 300000 // 拉伸高度(对轮廓线无直接影响)
      });
    let geometry2 = Cesium.RectangleOutlineGeometry.createGeometry(rectangle2);

      // 创建一个拉伸矩形轮廓线的实例,同样注意颜色属性可能无效
    let rectangleInstance2 = new Cesium.GeometryInstance({
        geometry: geometry2,
        attributes: {
          color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.RED) // 尝试设置颜色,但可能无效
        },
        id: 'rectangleInstance2' // 更正ID以反映其实际内容
      });

      // 创建一个Primitive对象,但请注意PerInstanceColorAppearance可能不适用于轮廓线
    let primitive = new Cesium.Primitive({
        geometryInstances: [rectangleInstance1, rectangleInstance2],
        asynchronous: false, // Cesium的Primitive通常不使用此属性来控制异步性
        appearance: new Cesium.PerInstanceColorAppearance({ // 这可能不适用于轮廓线
          translucent: false, // 半透明设置,但可能无效
          flat: true // 使用平面阴影,不考虑光照,但同样可能无效
        })
      });

      // 将Primitive对象添加到Cesium Viewer的场景中
      viewer.scene.primitives.add(primitive);

      // 注意:由于PerInstanceColorAppearance可能不适用于轮廓线,
      // 因此上述代码中的颜色和外观设置可能不会产生预期的效果。
      // 对于轮廓线,您可能需要使用PolylineCollection或其他适合线条的Cesium对象。
    }

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