Cesium实践(4)——空间数据加载


前言

本文介绍Cesium如何加载空间数据,空间数据即明确定义在三维空间中的数据,空间数据包括以下几类:1、几何形体(点、线、面、体)2、标签(文字图标等)3、几何文件(geojson、kml、czml)4、三维模型(gltf、gltf)。3D Tiles 作为Cesium提出的处理大型三维数据的格式暂不在本文介绍。


几何形体

在前一篇文章中讲到,Entity 是由 Primitive 封装而来API,空间几何数据的实现几乎是由他们提供,几何要素从类型上区分可划分为点、线、面、体等,如下表所示。

功能Entity APIPrimitive API
创建点要素,可控制点颜色、轮廓等PointGraphics-
创可设定宽度的折线PolylineGraphicsPolylineGeometry
各种几何要素轮廓线、不可设置宽度,轮廓线种类包括:立方体、圆/椭圆、廊、圆柱/锥、球/椭球、矩形、多边形、面、墙、管状线等-SimplePolylineGeometry
圆形面要素-CircleGeometry
廊状面要素CorridorGraphicsCorridorGeometry
椭圆状面要素EllipseGraphicsEllipseGeometry
矩形面要素RectangleGraphicsRectangleGeometry
多边形面要素PolygonGraphicsPolygonGeometry
平面要素PlaneGraphicsPlaneGeometry
立方体要素BoxGraphicsBoxGeometry
圆柱、圆锥体要素CylinderGraphicsCylinderGeometry
椭圆体要素EllipsoidGraphicsEllipseGeometry
管状体要素PolylineGraphicsPolylineGeometry
球体要素-SphereGeometry
墙体要素WallGraphicsWallGeometry

Entity支持的属性如下,Entity添加几何体后返回Viewer对象
在这里插入图片描述

  const point = viewer.entities.add({
    // 定位点
    position: Cesium.Cartesian3.fromDegrees(117, 40, 100),
    // 点
    point: {
      pixelSize: 10,// 大小
      color: Cesium.Color.RED, //点的颜色
      outlineWidth: 4, // 外框大小
      outlineColor: Cesium.Color.WHITE, //外框颜色
    },
  });

在这里插入图片描述

线

  • 普通线
  const line = viewer.entities.add({
      name: "red_line",
      polyline: {
        positions: Cesium.Cartesian3.fromDegreesArray([117, 40, 118, 40]), //线位置
        width: 5, // 宽度
        material: Cesium.Color.RED, // 材质
        clampToGround: true, // 贴地
      }
  });

在这里插入图片描述

  • 轮廓线——通过Entity
  const outlineOnly = viewer.entities.add({
    name: "red_box_outline",
    position: Cesium.Cartesian3.fromDegrees(117.2, 40.0, 300.0),
    box: {
    	// 维度
      dimensions: new Cesium.Cartesian3(300.0, 300.0, 300.0),
      fill: false, // 填充面
      outline: true, // 开启边框
      outlineColor: Cesium.Color.RED ,// 边框颜色
    },
  });

在这里插入图片描述

  • 轮廓线——通过Primitive
  const box = Cesium.BoxOutlineGeometry.fromDimensions({
    dimensions: new Cesium.Cartesian3(500000.0, 500000.0, 500000.0),
  });
  const geometry = Cesium.BoxOutlineGeometry.createGeometry(box);
  // 创建boxOutline的几何实例
  let boxOutlineInstance = new Cesium.GeometryInstance({
    geometry: geometry,
    modelMatrix: Cesium.Matrix4.multiplyByTranslation(
      Cesium.Transforms.eastNorthUpToFixedFrame(
        Cesium.Cartesian3.fromDegrees(170, 40)
      ),
      new Cesium.Cartesian3(0.0, 0.0, 1000.0),
      new Cesium.Matrix4()
    ),
    id: "boxOutline",
    attributes: {
      color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.RED),
    },
  });
  // 创建图元
  let primitive = new Cesium.Primitive({
    geometryInstances: boxOutlineInstance,
    appearance: new Cesium.PerInstanceColorAppearance({
      flat: true,
      faceForward: true,
      translucent: false,
      closed: false,
    }),
    asynchronous: false,
    show: true,
    modelMatrix: Cesium.Matrix4.IDENTITY,
    vertexCacheOptimize: false,
    interleave: false,
    compressVertices: true,
    releaseGeometryInstances: true,
    allowPicking: true,
    cull: true,

    debugShowBoundingVolume: false,
    shadows: Cesium.ShadowMode.DISABLED,
  });
  viewer.scene.primitives.add(primitive);

在这里插入图片描述

  const redPlane = viewer.entities.add({
    name: "red_plane",
    position: Cesium.Cartesian3.fromDegrees(117.1, 40.0, 300.0),
    plane: {
      plane: new Cesium.Plane(Cesium.Cartesian3.UNIT_Y, 0.0),
      dimensions: new Cesium.Cartesian2(500.0, 300.0),
      material: Cesium.Color.RED.withAlpha(0.5),
      outline: true,
      outlineColor: Cesium.Color.BLACK,
    },
  });

在这里插入图片描述

  const redBox = viewer.entities.add({
    name: "red_box",
    position: Cesium.Cartesian3.fromDegrees(117.3, 40.0, 400.0),
    box: {
      dimensions: new Cesium.Cartesian3(400.0, 200.0, 300.0),
      material: Cesium.Color.RED.withAlpha(0.5),
      outline: true,
      outlineColor: Cesium.Color.BLACK,
    },
  });

在这里插入图片描述

标签

文字

  const label = viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(117.4, 40, 1500),
    label: {
      text: "这是一团火",
      font: "24px sans-serif", // 大小 字型
      fillColor: Cesium.Color.WHITE, //字体颜色
      outlineColor: Cesium.Color.BLACK, //字体外框颜色
      outlineWidth: 4, // 字边宽
      style: Cesium.LabelStyle.FILL_AND_OUTLINE, // FILL填充文字,OUTLINE勾勒标签,FILL_AND_OUTLINE填充文字和勾勒标签
      pixelOffset: new Cesium.Cartesian2(0, -24),// 设置文字的偏移量  
      horizontalOrigin: Cesium.HorizontalOrigin.CENTER, // 设置文字的显示位置,LEFT /RIGHT /CENTER
      verticalOrigin: Cesium.VerticalOrigin.BOTTOM,       // 设置文字的显示位置
    },
  });

图标

  const label = viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(117.4, 40, 1500),
    billboard: {
      image: "../texture/Fire.png",
      width: 50,
      height: 50,
      verticalOrigin: Cesium.VerticalOrigin.TOP, //垂直显示位置
      horizontalOrigin: Cesium.HorizontalOrigin.CENTER,  // 水平显示位置
    },
  });

在这里插入图片描述

几何文件

常见的几何文件包括GeoJson、KML,除此外,Cesium还在JSON数据的基础上扩充了CZML类型来自持更大的数据流。DataSoureCollection 是 Cesium中加载矢量数据的主要方式之一,最大特点是支持加载矢量数据集与外部文件的调用,主要分为CzmlDataSourceKmlDataSourceGeoJsonDataSource三种,分别对应加载CZMLKMLGeoJSON 格式数据。

更多代码示例见官网:https://sandcastle.cesium.com/?src=KML.html&label=DataSources

GeoJson

  // geojson
  const chinaGeoJson = Cesium.GeoJsonDataSource.load(
    "https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json",
    {
      stroke: Cesium.Color.RED, // 边线默认色
      fill: Cesium.Color.SKYBLUE.withAlpha(0.5), // 默认填充色
      strokeWidth: 4, // 多边形线条和多边形轮廓的默认宽
    }
  );


  chinaGeoJson.then((dataSources) => { // geojson加载完成的回调
    viewer.dataSources.add(dataSources);
    const entities = dataSources.entities.values;
    entities.forEach((entity, i) => {
      entity.polygon.material = new Cesium.ColorMaterialProperty(
        Cesium.Color.fromRandom({ // 每个json随机赋色
          alpha: 1,
        })
      );
      entity.polygon.outline = false;
      entity.polygon.extrudedHeight = 1000 // 拉伸高
    });
  });

在这里插入图片描述

KML

  const kmlDataPromise = Cesium.KmlDataSource.load(kmlUrl, {
    camera: viewer.scene.camera,
    canvas: viewer.scene.canvas,
    screenOverlayContainer: viewer.container,
  });

  kmlDataPromise.then(function (dataSource) {
    viewer.dataSources.add(dataSource);
  });

在这里插入图片描述

CZML

CZML的使用可见 Cesium_CZML

三维模型

  // 创建模型
  function createModel(url, height) {

    const position = Cesium.Cartesian3.fromDegrees(117, 40.01, height);
    const heading = Cesium.Math.toRadians(135);
    const pitch = 0;
    const roll = 0;
    const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll);
    const orientation = Cesium.Transforms.headingPitchRollQuaternion(
      position,
      hpr
    );

    const entity = viewer.entities.add({
      name: url,
      position: position,
      orientation: orientation,
      model: {
        uri: url,
        minimumPixelSize: 128,
        maximumScale: 20000,
      },
    });
    viewer.trackedEntity = entity;
  }
  createModel("../model/Air.glb", 1000)
  createModel("../Assets/CesiumMilkTruck.glb",150)

在这里插入图片描述

总结

  • 几何形体:点、线、面、体

  • 标签:文字、图标

  • 几何文件:GeoJson、KML、CZML

  • 三维模型:glb/gltf

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值