Cesium中的Entity API和Primitive API的区别(1)

Cesium开发高级篇 | 01空间数据可视化之Primitive 在基础篇中我们讲过空间数据可视化之Entity实体类,今天我们介绍另外一个比较接近渲染引擎底层的类Primitive,虽然两者都可用于绘制同样的几何图形,但考虑到性能问题,我们更推荐您使用Primitive类实现。在使用Primitive API之前,您最好具备WebGL基础知识,如果对WebGL不是太了解,建议先学习《WebGL编程指南》这本书。 Primitive介绍 1. Primitive组成 Primitive由两部分组成:几何形状(Geometry)和外观(Appearance)。几何形状定 阅读详情

提示:Cesium中提供两类API:

(1)面向图形开发人员的底层API,通常称为“Primitive API”。该API暴露最小限度的抽象,使用图形学术语,具有很大的灵活性,需要具有图形学编程的知识;

(2)高级别的数据驱动的API,称为“Entity API”。该API使用一致性设计的、高级别的对象来管理一组相关性的可视化对象,其底层使用Primitive API;



Entity API简介

Cesium提供Entity API来绘制空间数据,例如点、标记、标签、线、3D模型、形状、立体形状(volume)。下面是Entity API的简单例子,用红色半透明区域标记出美国怀俄明州:

1.  var viewer = new Cesium.Viewer('cesiumContainer'); //创建一个查看器(Viewer widget)  

2.  var wyoming = viewer.entities.add({  //添加一个实体,仅需要传递一个简单JSON对象,返回值是一个Entity对象  

3.    name : 'Wyoming',  

4.    polygon : {  

5.      hierarchy : Cesium.Cartesian3.fromDegreesArray([//一组地理坐标  

6.                                -109.080842,45.002073,  

7.                                -105.91517,45.002073,  

8.                                -104.058488,44.996596,  

9.                                -104.053011,43.002989,  

10.                               -104.053011,41.003906,  

11.                               -105.728954,40.998429,  

12.                               -107.919731,41.003906,  

13.                               -109.04798,40.998429,  

14.                               -111.047063,40.998429,  

15.                               -111.047063,42.000709,  

16.                               -111.047063,44.476286,  

17.                               -111.05254,45.002073]),  

18.     material : Cesium.Color.RED.withAlpha(0.5), //材质  

19.     outline : true, //是否显示轮廓  

20.     outlineColor : Cesium.Color.BLACK //轮廓的颜色  

21.   }  

22. });  

23. viewer.zoomTo(wyoming);//缩放、平移视图使实体可见   

形状与立体(Shapes and Volumes)

支持的形状与立体列表

(1) 立方体(Boxes):

[javascript] view plain copy

 print?

1.  var blueBox = viewer.entities.add({  

2.      name : 'Blue box',  

3.       //中心的位置  

4.      position: Cesium.Cartesian3.fromDegrees(-114.0, 40.0, 300000.0),  

5.      box : {  

6.          //长宽高  

7.          dimensions : new Cesium.Cartesian3(400000.0, 300000.0, 500000.0),  

8.          material : Cesium.Color.BLUE  

9.      }  

10. });  

11.    

12. var redBox = viewer.entities.add({  

13.     name : 'Red box with black outline',  

14.     position: Cesium.Cartesian3.fromDegrees(-107.0, 40.0, 300000.0),  

15.     box : {  

16.         dimensions : new Cesium.Cartesian3(400000.0, 300000.0, 500000.0),  

17.         material : Cesium.Color.RED,  

18.         outline : true, //显示轮廓  

19.         outlineColor : Cesium.Color.BLACK  

20.     }  

21. });  

22.    

23. var outlineOnly = viewer.entities.add({  

24.     name : 'Yellow box outline',  

25.     position: Cesium.Cartesian3.fromDegrees(-100.0, 40.0, 300000.0),  

26.     box : {  

27.         dimensions : new Cesium.Cartesian3(400000.0, 300000.0, 500000.0),  

28.         fill : false,  //不显示填充  

29.         outline : true,  

30.         outlineColor : Cesium.Color.YELLOW  

31.     }  

32. });  


(2)圆和椭圆(Circles Ellipses)

[javascript] view plain copy

 print?

1.  var viewer = new Cesium.Viewer('cesiumContainer');  

2.  //浮空的绿色圆形  

3.  var greenCircle = viewer.entities.add({  

4.      position: Cesium.Cartesian3.fromDegrees(-111.0, 40.0, 150000.0),  

5.      name : 'Green circle at height',  

6.      ellipse : {  

7.          semiMinorAxis : 300000.0,  

8.          semiMajorAxis : 300000.0,  

9.          height: 200000.0, //浮空  

10.         material : Cesium.Color.GREEN  

11.     }  

12. });  

13. //红色椭圆形,位于地表,带轮廓  

14. var redEllipse = viewer.entities.add({  

15.     //不带高度  

16.     position: Cesium.Cartesian3.fromDegrees(-103.0, 40.0),  

17.     name : 'Red ellipse on surface with outline',  

18.     ellipse : {  

19.         semiMinorAxis : 250000.0,  

20.         semiMajorAxis : 400000.0,  

21.         material : Cesium.Color.RED.withAlpha(0.5),  

22.         outline : true,  

23.         outlineColor : Cesium.Color.RED  

24.     }  

25. });  

26. //蓝色椭圆柱,旋转了角度  

27. var blueEllipse = viewer.entities.add({  

28.     position: Cesium.Cartesian3.fromDegrees(-95.0, 40.0, 100000.0),  

29.     name : 'Blue translucent, rotated, and extruded ellipse',  

30.     ellipse : {  

31.         semiMinorAxis : 150000.0,  

32.         semiMajorAxis : 300000.0,  

33.         extrudedHeight : 200000.0,  //拉伸  

34.         rotation : Cesium.Math.toRadians(45), //旋转  

35.         material : Cesium.Color.BLUE.withAlpha(0.7),  

36.         outline : true  

37.     }  

38. });  

39.    

40. viewer.zoomTo(viewer.entities);  

(3)走廊(Corridor)

[javascript] view plain copy

 print?

1.  var redCorridor = viewer.entities.add({  

2.      name : 'Red corridor on surface with rounded corners and outline',  

3.      corridor : {  

4.          positions : Cesium.Cartesian3.fromDegreesArray([  

5.                                                          -100.0, 40.0,  

6.                                                          -105.0, 40.0,  

7.                                                          -105.0, 35.0  

8.                                                      ]),  

9.                                                      width : 200000.0,  

10.         material : Cesium.Color.RED.withAlpha(0.5),  

11.         outline : true,  

12.         outlineColor : Cesium.Color.RED  

13.     }  

14. });  

15.    

16. var greenCorridor = viewer.entities.add({  

17.     name : 'Green corridor at height with mitered corners',  

18.     corridor : {  

19.         positions : Cesium.Cartesian3.fromDegreesArray(  

20.         [    -90.0, 40.0,  

21.              -95.0, 40.0,  

22.              -95.0, 35.0  

23.         ]),  

24.         height: 100000.0,  

25.         width : 200000.0,  

26.         cornerType: Cesium.CornerType.MITERED,  

27.         material : Cesium.Color.GREEN  

28.     }  

29. });  

30.    

31. var blueCorridor = viewer.entities.add({  

32.     name : 'Blue extruded corridor with beveled corners and outline',  

33.     corridor : {  

34.         positions : Cesium.Cartesian3.fromDegreesArray(  

35.         [    80.0, 40.0,  

36.              -85.0, 40.0,  

37.              -85.0, 35.0  

38.         ]),  

39.         height : 200000.0,  

40.         extrudedHeight : 100000.0,  

41.         width : 200000.0,  

42.         cornerType: Cesium.CornerType.BEVELED,  

43.         material : Cesium.Color.BLUE.withAlpha(0.5),  

44.         outline : true,  

45.         outlineColor : Cesium.Color.BLUE  

46.     }  

47. });  


(4)圆柱和圆锥(Cylinder Cones)

[javascript] view plain copy

 print?

1.  var greenCylinder = viewer.entities.add({  

2.      name : 'Green cylinder with black outline',  

3.      position: Cesium.Cartesian3.fromDegrees(-100.0, 40.0, 200000.0),  

4.      cylinder : { //圆柱  

5.          length : 400000.0,  

6.          topRadius : 200000.0,  

7.          bottomRadius : 200000.0,  

8.          material : Cesium.Color.GREEN,  

9.          outline : true,  

10.         outlineColor : Cesium.Color.DARK_GREEN  

11.     }  

12. });  

13.    

14. var redCone = viewer.entities.add({  

15.     name : 'Red cone',  

16.     position: Cesium.Cartesian3.fromDegrees(-105.0, 40.0, 200000.0),  

17.     cylinder : {//圆锥  

18.         length : 400000.0,  

19.         topRadius : 0.0,  

20.         bottomRadius : 200000.0,  

21.         material : Cesium.Color.RED  

22.     }  

23. });  


(5) 
多边形(Polygons)

[javascript] view plain copy

 print?

1.  var redPolygon = viewer.entities.add({  

2.      name : '贴着地表的多边形',  

3.      polygon : {  

4.          hierarchy : Cesium.Cartesian3.fromDegreesArray([-115.0, 37.0,  

5.                                                          -115.0, 32.0,  

6.                                                          -107.0, 33.0,  

7.                                                          -102.0, 31.0,  

8.                                                          -102.0, 35.0]),  

9.          material : Cesium.Color.RED  

10.     }  

11. });  

12.    

13. var greenPolygon = viewer.entities.add({  

14.     name : '绿色拉伸多边形',  

15.     polygon : {  

16.         hierarchy : Cesium.Cartesian3.fromDegreesArray([-108.0, 42.0,  

17.                                                         -100.0, 42.0,  

18.                                                         -104.0, 40.0]),  

19.         extrudedHeight: 500000.0,  

20.         material : Cesium.Color.GREEN  

21.     }  

22. });  

23.    

24. var orangePolygon = viewer.entities.add({  

25.     name : '每个顶点具有不同拉伸高度的橘色多边形',  

26.     polygon : {  

27.         hierarchy : Cesium.Cartesian3.fromDegreesArrayHeights(  

28.             [-108.0, 25.0, 100000,  

29.              -100.0, 25.0, 100000,  

30.              -100.0, 30.0, 100000,  

31.              -108.0, 30.0, 300000]),  

32.         extrudedHeight: 0,  

33.         perPositionHeight : true,  

34.         material : Cesium.Color.ORANGE,  

35.         outline : true,  

36.         outlineColor : Cesium.Color.BLACK  

37.     }  

38. });  

39.    

40. var bluePolygon = viewer.entities.add({  

41.     name : '具有挖空效果的蓝色多边形',  

42.     polygon : {  

43.         hierarchy : {  

44.             positions : Cesium.Cartesian3.fromDegreesArray(  

45.                 [-99.0, 30.0,  

46.                  -85.0, 30.0,  

47.                  -85.0, 40.0,  

48.                  -99.0, 40.0]),  

49.             holes : [{  

50.                 positions : Cesium.Cartesian3.fromDegreesArray([  

51.                     -97.0, 31.0,  

52.                     -97.0, 39.0,  

53.                     -87.0, 39.0,  

54.                     -87.0, 31.0  

55.                 ]),  

56.                 holes : [{  

57.                     positions : Cesium.Cartesian3.fromDegreesArray([  

58.                         -95.0, 33.0,  

59.                         -89.0, 33.0,  

60.                         -89.0, 37.0,  

61.                         -95.0, 37.0  

62.                     ]),  

63.                     holes : [{  

64.                         positions : Cesium.Cartesian3.fromDegreesArray([  

65.                             -93.0, 34.0,  

66.                             -91.0, 34.0,  

67.                             -91.0, 36.0,  

68.                             -93.0, 36.0  

69.                         ])  

70.                     }]  

71.                 }]  

72.             }]  

73.         },  

74.         material : Cesium.Color.BLUE,  

75.         outline : true,  

76.         outlineColor : Cesium.Color.BLACK  

77.     }  

78. });  


(6)多段线(Polylines)

[javascript] view plain copy

 print?

1.  var redLine = viewer.entities.add({  

2.      name : '沿着地球表面的红线',  

3.      polyline : {  

4.          positions : Cesium.Cartesian3.fromDegreesArray(  

5.              [-75, 35,  

6.               -125, 35]),  

7.          width : 5,  

8.          material : Cesium.Color.RED  

9.      }  

10. });  

11.    

12. var glowingLine = viewer.entities.add({  

13.     name : '具有发光效果的线',  

14.     polyline : {  

15.         positions : Cesium.Cartesian3.fromDegreesArray(  

16.             [-75, 37, -125, 37]  

17.         ),  

18.         width : 10,  

19.         material : new Cesium.PolylineGlowMaterialProperty({  

20.             glowPower : 0.2,  

21.             color : Cesium.Color.BLUE  

22.         })  

23.     }  

24. });  

25.    

26. var orangeOutlined = viewer.entities.add({  

27.     name : '具有一定高度的线',  

28.     polyline : {  

29.         positions : Cesium.Cartesian3.fromDegreesArrayHeights(  

30.             [-75, 39, 250000,-125, 39, 250000]  

31.         ),  

32.         width : 5,  

33.         material : new Cesium.PolylineOutlineMaterialProperty({  

34.             color : Cesium.Color.ORANGE,  

35.             outlineWidth : 2,  

36.             outlineColor : Cesium.Color.BLACK  

37.         })  

38.     }  

39. });  

40.    

41. var yellowLine = viewer.entities.add({  

42.     name : '不贴着地表的线',  

43.     polyline : {  

44.         positions : Cesium.Cartesian3.fromDegreesArrayHeights(  

45.             [-75, 43, 500000,-125, 43, 500000]  

46.         ),  

47.         width : 3,  

48.         followSurface : false,  //是否贴着地表  

49.         material : Cesium.Color.PURPLE  

50.     }  

51. });  

(7)多段线体(Polyline Volumes)

[javascript] view plain copy

 print?

1.  var viewer = new Cesium.Viewer('cesiumContainer');  

2.     

3.  function computeCircle(radius) {  

4.      var positions = [];  

5.      for (var i = 0; i < 360; i++) {  

6.          var radians = Cesium.Math.toRadians(i);  

7.          positions.push(new Cesium.Cartesian2(  

8.              radius * Math.cos(radians), radius * Math.sin(radians)));  

9.      }  

10.     return positions;  

11. }  

12.    

13. function computeStar(arms, rOuter, rInner) {  

14.     var angle = Math.PI / arms;  

15.     var length = 2 * arms;  

16.     var positions = new Array(length);  

17.     for (var i = 0; i < length; i++) {  

18.         var r = (i % 2) === 0 ? rOuter : rInner;  

19.         positions[i] = new Cesium.Cartesian2(  

20.             Math.cos(i * angle) * r, Math.sin(i * angle) * r);  

21.     }  

22.     return positions;  

23. }  

24.    

25. var redTube = viewer.entities.add({  

26.     name : 'Red tube with rounded corners',  

27.     polylineVolume : {  

28.         positions : Cesium.Cartesian3.fromDegreesArray(  

29.             [-85.0, 32.0,  

30.              -85.0, 36.0,  

31.              -89.0, 36.0]),  

32.         shape : computeCircle(60000.0),  

33.         material : Cesium.Color.RED  

34.     }  

35. });  

36.    

37. var greenBox = viewer.entities.add({  

38.     name : 'Green box with beveled corners and outline',  

39.     polylineVolume : {  

40.         positions : Cesium.Cartesian3.fromDegreesArrayHeights(  

41.             [-90.0, 32.0, 0.0,  

42.              -90.0, 36.0, 100000.0,  

43.              -94.0, 36.0, 0.0]),  

44.         shape :[new Cesium.Cartesian2(-50000, -50000),  

45.                 new Cesium.Cartesian2(50000, -50000),  

46.                 new Cesium.Cartesian2(50000, 50000),  

47.                 new Cesium.Cartesian2(-50000, 50000)],  

48.         cornerType : Cesium.CornerType.BEVELED,  

49.         material : Cesium.Color.GREEN,  

50.         outline : true,  

51.         outlineColor : Cesium.Color.BLACK  

52.     }  

53. });  

54.    

55. var blueStar = viewer.entities.add({  

56.     name : 'Blue star with mitered corners and outline',  

57.     polylineVolume : {  

58.         positions : Cesium.Cartesian3.fromDegreesArrayHeights(  

59.             [-95.0, 32.0, 0.0,  

60.              -95.0, 36.0, 100000.0,  

61.              -99.0, 36.0, 200000.0]),  

62.         shape : computeStar(7, 70000, 50000),  

63.         cornerType : Cesium.CornerType.MITERED,  

64.         material : Cesium.Color.BLUE,  

65.         outline : true,  

66.         outlineColor : Cesium.Color.BLACK  

67.     }  

68. });  

69.    

70. viewer.zoomTo(viewer.entities);  


(8)矩形(Rectangles)

[javascript] view plain copy

 print?

1.  <strong>//红色矩形  

2.  var redRectangle = viewer.entities.add({  

3.      name : 'Red translucent rectangle with outline',  

4.      rectangle : {  

5.          coordinates : Cesium.Rectangle.fromDegrees(-110.0, 20.0, -80.0, 25.0),  

6.          material : Cesium.Color.RED.withAlpha(0.5),  

7.          outline : true,  

8.          outlineColor : Cesium.Color.RED  

9.      }  

10. });  

11. //绿色旋转、拉伸的矩形  

12. var greenRectangle = viewer.entities.add({  

13.     name : 'Green translucent, rotated, and extruded rectangle',  

14.     rectangle : {  

15.         coordinates : Cesium.Rectangle.fromDegrees(-100.0, 30.0, -90.0, 40.0),  

16.         material : Cesium.Color.GREEN.withAlpha(0.5),  

17.         rotation : Cesium.Math.toRadians(45),  

18.         extrudedHeight : 300000.0,  

19.         height : 100000.0,  

20.         outline : true,  

21.         outlineColor : Cesium.Color.GREEN  

22.     }  

23. });</strong>  


(9)球和椭球(Spheres Ellipsoids)

[javascript] view plain copy

 print?

1.  <pre name="code" class="javascript">var blueEllipsoid = viewer.entities.add({  

2.      name : 'Blue ellipsoid',  

3.      position: Cesium.Cartesian3.fromDegrees(-114.0, 40.0, 300000.0),  

4.      ellipsoid : {  

5.          //可以指定三个轴的半径  

6.          radii : new Cesium.Cartesian3(200000.0, 200000.0, 300000.0),  

7.          material : Cesium.Color.BLUE  

8.      }  

9.  });  

10.    

11. var redSphere = viewer.entities.add({  

12.     name : 'Red sphere with black outline',  

13.     position: Cesium.Cartesian3.fromDegrees(-107.0, 40.0, 300000.0),  

14.     ellipsoid : {  

15.         //正球体  

16.         radii : new Cesium.Cartesian3(300000.0, 300000.0, 300000.0),  

17.         material : Cesium.Color.RED,  

18.         outline : true,  

19.         outlineColor : Cesium.Color.BLACK  

20.     }  

21. });  

22.    

23. var outlineOnly = viewer.entities.add({  

24.     name : 'Yellow ellipsoid outline',  

25.     position: Cesium.Cartesian3.fromDegrees(-100.0, 40.0, 300000.0),  

26.     ellipsoid : {  

27.         radii : new Cesium.Cartesian3(200000.0, 200000.0, 300000.0),  

28.         fill : false,  

29.         outline : true,  

30.         outlineColor : Cesium.Color.YELLOW,  

31.         slicePartitions : 24, //横向切割线  

32.         stackPartitions : 36  //纵向切割线  

33.     }  

34. });  




(10) 墙(Walls)

[javascript] view plain copy

 print?

1.  //东西方向的横墙  

2.  var redWall = viewer.entities.add({  

3.      name : 'Red wall at height',  

4.      wall : {  

5.          positions : Cesium.Cartesian3.fromDegreesArrayHeights(  

6.               [-115.0, 44.0, 200000.0,//坐标点  

7.                -90.0, 44.0, 200000.0]  

8.          ),  

9.          minimumHeights : [100000.0, 100000.0], //按坐标点的最小高度数组  

10.         material : Cesium.Color.RED  

11.     }  

12. });  

13. //四边围墙  

14. var greenWall = viewer.entities.add({  

15.     name : 'Green wall from surface with outline',  

16.     wall : {  

17.         positions : Cesium.Cartesian3.fromDegreesArrayHeights(  

18.             [-107.0, 43.0, 100000.0,  

19.              -97.0, 43.0, 100000.0,  

20.              -97.0, 40.0, 100000.0,  

21.              -107.0, 40.0, 100000.0,  

22.              -107.0, 43.0, 100000.0]),  

23.         material : Cesium.Color.GREEN,  

24.         outline : true,  

25.         outlineColor : Cesium.Color.BLACK  

26.     }  

27. });  

28. //曲折的墙  

29. var blueWall = viewer.entities.add({  

30.     name : 'Blue wall with sawtooth heights and outline',  

31.     wall : {  

32.         //坐标点,不指定高度  

33.         positions : Cesium.Cartesian3.fromDegreesArray(  

34.             [-115.0, 50.0,  

35.              -112.5, 50.0,  

36.              -110.0, 50.0,  

37.              -107.5, 50.0,  

38.              -105.0, 50.0,  

39.              -102.5, 50.0,  

40.              -100.0, 50.0,  

41.              -97.5, 50.0,  

42.              -95.0, 50.0,  

43.              -92.5, 50.0,  

44.              -90.0, 50.0]),  

45.         maximumHeights : [ //上高  

46.             100000, 200000, 100000, 200000, 100000, 200000,   

47.             100000, 200000, 100000, 200000, 100000],  

48.         minimumHeights : [  //下高  

49.             0, 100000,  0, 100000, 0, 100000, 0, 100000, 0,  

50.             100000, 0],  

51.         material : Cesium.Color.BLUE,  

52.         outline : true,  

53.         outlineColor : Cesium.Color.BLACK  

54.     }  

55. });  



材质(Material)与轮廓(Outline)

多数形状均支持通过一致的方式来设置属性、控制外观:

1.      (1)fill:布尔型,用于指定目标形状是否被填充

2.      (2)outline:布尔型,用于指定是否绘制形状的边缘

3.      (3)material:如果fill为true,该属性可以控制填充的材质类型

一个例外是多段线,可以设置outlineWidth 、outlineColor、glowPower 等属性。

高度与拉伸(Extrusion)

所有的形状均默认均是沿着地表的,目前圆形、椭圆、矩形可以在一定高度浮空显示,或者拉伸为Volume。

需要注意:Cesium总是使用米、弧度、秒为度量单位。下面是一个例子:

1.  wyoming.polygon.height = 200000;         //设置高度  

2.  wyoming.polygon.extrudedHeight = 250000; //设置拉伸高度  

在Viewer中可用的Entity特性

除非显式禁用,点击实体后会显示SelectionIndicator小器件,以及一个信息框。通过设置Entity.description,可以在信息框中显示任何HTML内容。

镜头控制

zoomTo方法可以立即定位到某个位置,而flyTo则是通过动画方式转移到某个位置,这两个方法均可以传递EntityCollection对象,并且均是异步方法,返回一个Promises对象

默认情况下,镜头是朝北、45度倾斜查看地球。下面的代码可以让镜头朝东、倾斜三十度查看:

1.  //镜头顺时针旋转九十度,即东向  

2.  var heading = Cesium.Math.toRadians(90);  

3.  //镜头倾斜30度俯视  

4.  var pitch = Cesium.Math.toRadians(-30);  

5.  viewer.zoomTo(wyoming, new Cesium.HeadingPitchRange(heading, pitch)).then(function(result){  

6.      //执行完毕后,进行的动作  

7.      if (result) { //如果镜头切换成功,则result=true  

8.          viewer.selectedEntity = wyoming;  

9.      }  

10. });  


有时需要镜头跟踪某个实体(使居中)而不是地球,可以使用如下代码:

1.  wyoming.position = Cesium.Cartesian3.fromDegrees(-107.724, 42.68);  

2.  viewer.trackedEntity = wyoming;  //跟踪某个实体。如果调用zoomTo、flyTo自动取消跟踪  

管理Entity

EntityCollection对象是一个从Entity Id到Entity的关联数组,其提供例如add、remove、removeAll之类的常规函数,用于添加或者删除某个Entity:

1.  //添加一个实体,并且提供ID  

2.  viewer.entities.add({  

3.    id : '182bdba4-2b3e-47ae-bf0b-83f6fde285fd'  

4.  });  

5.  //获取一个实体  

6.  var entity = viewer.entities.getById('uniqueId')  

7.  //获取一个实体,如果不存在则创建之  

8.  var entity = viewer.entities.getOrCreateEntity('uniqueId');  

9.     

10. //当添加、删除、修改EntityCollection中的Entity时,可以获得事件通知  

11. function onChanged(collection, added, removed, changed){  

12.     //add、removed、changed是增删改的Entity数组  

13.     for(var i = 0; i < added.length; i++) {  

14.           

15.     }  

16. }  

17. viewer.entities.collectionChanged.addEventListener(onChanged);  

18.    

19. //大批量操作时,临时禁用事件可以提高性能  

20. viewer.entities.suspendEvents();  

21. //执行各种Entity操作  

22. viewer.entities.resumeEvents();  

点、图标和标签

添加一个点、标签或者图标很简单:

1.  var viewer = new Cesium.Viewer( 'cesiumContainer' );  

2.     

3.  var citizensBankPark = viewer.entities.add( {  

4.      name : 'Citizens Bank Park',  

5.      position : Cesium.Cartesian3.fromDegrees( -75.166493, 39.9060534 ),  

6.      point : { //点  

7.          pixelSize : 5,  

8.          color : Cesium.Color.RED,  

9.          outlineColor : Cesium.Color.WHITE,  

10.         outlineWidth : 2  

11.     },  

12.     label : { //文字标签  

13.         text : 'Citizens Bank Park',  

14.         font : '14pt monospace',  

15.         style : Cesium.LabelStyle.FILL_AND_OUTLINE,  

16.         outlineWidth : 2,  

17.         verticalOrigin : Cesium.VerticalOrigin.BOTTOM, //垂直方向以底部来计算标签的位置  

18.         pixelOffset : new Cesium.Cartesian2( 0, -9 )   //偏移量  

19.     }  

20.     billboard : { //图标  

21.         image : 'http://localhost:81/images/2015/02-02/Philadelphia_Phillies.png',  

22.         width : 64,  

23.         height : 64  

24.     },  

25. } );  

26.    

27. viewer.zoomTo( viewer.entities );  

3D模型

Cesium支持glTF格式的3D模型,glTF是WebGL、 OpenGL ES、 OpenGL的一种运行时模型格式,在Cesium中创建3D模型很简单:

[javascript] view plain copy

 print?

1.  var viewer = new Cesium.Viewer('cesiumContainer');  

2.  var entity = viewer.entities.add({  

3.      position : Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706),  

4.      model : {  

5.          uri : '../../SampleData/models/CesiumGround/Cesium_Ground.gltf'  

6.      },  

7.      scale : 1,//和原始大小相比的缩放比例  

8.      minimumPixelSize :100 //最小尺寸,防止太小而看不见  

9.  });  

10. viewer.trackedEntity = entity;  


默认情况下,模型竖直放置、并且面向东面。可以指定四元组(Quaternion)给Entity.orientation属性,以改变放置的方向:

1.  var viewer = new Cesium.Viewer('cesiumContainer');  

2.  var position = Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706); //位置  

3.  var heading = Cesium.Math.toRadians(45.0);//绕垂直于地心的轴旋转  

4.  var pitch = Cesium.Math.toRadians(15.0);  //绕纬度线旋转  

5.  var roll = Cesium.Math.toRadians(0.0);    //绕经度线旋转  

6.  var orientation = Cesium.Transforms.headingPitchRollQuaternion(position, heading, pitch, roll);  

7.     

8.  var entity = viewer.entities.add({  

9.      position : position,  

10.     orientation : orientation,  

11.     model : {  

12.         uri : '../../SampleData/models/CesiumGround/Cesium_Ground.gltf'  

13.     }  

14. });  

15. viewer.trackedEntity = entity;  

例子中的heading(yaw)、pitch、roll对应了绕Z(垂直轴)、Y(维度方向)、X(经度方向)进行旋转,正数表示顺时针旋转(由于相对运动,在浏览器上看起来是地球在逆时针旋转),可以参考下图理解(人面向北面,摇头heading、点头pitch、歪头roll):

                           

属性系统

Cesium提供了一些快捷方式来设置属性,例如outline:true,但是尝试使用e.polygon.outline这样的形式来获取轮廓时,会得到一个ConstantProperty对象,如果不使用快捷方式,则需要编写更多的代码,例如:

1.  polygon.outline = new Cesium.ConstantProperty(true);  

2.  polygon.outlineColor = new Cesium.ConstantProperty(Cesium.Color.BLACK);  

 

所有属性的实例均是Property的子类型,引入属性类层次而不是使用基本类型的原因是,某些属性是随着时间而变化的。

要得到属性的原始值,需要调用Property.getValue()方法,例如:

1.  //获取当前时间点,多边形轮廓是否存在  

2.  polygon.outline.getValue(viewer.clock.currentTime)  


cesium 的 API 结构及Viewer的介绍 阅读详情

相关推荐

Cesium进阶学习一、Primitive

Cesium进阶学习Primitive

程迷学习的博客 2445

Cesium中图元Primitive详细介绍及案例

Cesium中图元Primitive详细介绍及案例

纸飞机的旅行的博客 4702

Cesium基础-(Primitive)-(Primitive 与 Entity 区别)

Entity和Primitive在Cesium中都有各自的应用场景。选择哪个取决于项目的具体需求。

纸飞机的旅行的博客 1466

Cesium中Primitive与Entity详细介绍

cesium中的primitive与entity详细介绍

专注GIS开发 7759

Cesium 快速入门(八)Primitive(图元)系统深度解析

本文深入解析了Cesium中的Primitive(图元)系统,作为底层核心渲染单元,它与高层Entity API形成鲜明对比。Primitive提供了对WebGL渲染管线的精细控制,包括几何定义、实例化、外观定义、批处理等关键步骤,能够实现高性能复杂场景的构建。文章通过代码示例展示了Primitive的完整使用流程,并对比了Primitive与Entity在抽象层级、性能控制、内存占用、动态更新和学习曲线等方面的核心差异。Primitive适合需要极致性能控制的场景,而Entity则提供了更易用的声明式AP

yy的博客 1651

Cesium快速入门到精通系列教程八:Primitive和Entity的相似点与不同点

选择 Primitive 当​​:需要极致性能、自定义渲染或处理超大规模静态数据。​​选择 Entity 当​​:追求开发效率、动态属性管理及交互功能。​​混合使用​​:对静态背景用 Primitive 批量渲染,动态对象用 Entity 单独控制。二者本质是互补关系:Entity 通过封装 Primitive 实现高级抽象,而 Primitive 为 Entity 提供底层支撑。实际开发需根据性能瓶颈灵活选择。

duansamve的博客 1006

cesium对entity和Primitive的管理思想及常见问题解决

文章目录需求需求分析用到的技术需要验证的问题验证截图 需求 我需要在项目中,对一些绘制的图形进行管理,能够进行分类;比如,我画一类广告牌,广告牌可以进行二次分类;我能根据分类进行删除;数据量不会很大,大概以千位单位;80%的问题都是可以解决的. 需求分析 相当于就是对绘制图形的一个管理,cesium在绘制图形时,基本开放了两个套路;一个是entity,一个是Primitive的管理方式;后者一般是给底层用的;前者是高度集合的,用于业务开发比较方便;这里我会重点研究entity,顺便了解下primitive的

李卓书 5294

告别卡顿!Cesium海量点渲染性能对比:Entity vs Primitive深度解析

本文深度解析了Cesium中Entity与Primitive两种API在海量点渲染场景下的性能差异。通过原理剖析与实测对比,揭示了Entity因高级抽象层带来的高开销是导致卡顿和内存飙升的主因,而接近底层的Primitive API则能高效处理百万级数据,实现流畅渲染。文章提供了性能优化策略与混合架构建议,帮助开发者告别卡顿。

silver的专栏 716

Cesium 中 Primitive 和 Entity 的区别、适用场景及使用方法

Cesium中的Entity和Primitive是两种不同的可视化API,各有特点。Entity是高级抽象的数据驱动API,封装了位置、形状等属性,易于使用且支持内置动画和数据绑定,适合大多数通用场景。Primitive则是底层图形API,提供精细的渲染控制和极致性能,适合处理大量静态对象或自定义特效。对比来看,Entity更易用但灵活性有限,Primitive则性能更高但编程复杂度大。开发者可根据需求选择:快速开发选Entity,追求性能或自定义效果选Primitive。两者都提供了代码示例,展示了如何创

double徐 1242

cesium小知识:Primitive和entity详解,两者对比

特性PrimitiveEntity抽象层次低级别的图形API高层次的数据驱动API性能更高效,适用于大规模静态内容简便但可能不如Primitive高效灵活性极大的灵活性,支持自定义着色器等较少的灵活性,更适合常规需求学习曲线需要更深入的图形学知识更容易上手动态支持有限的动态支持强大的时间动态和事件处理支持开发难度较高,需要更多的代码和理解较低,通过JSON配置即可适用场景大规模静态内容、高级定制化动态和交互性强的内容、快速开发。

大剑师兰特的GIS世界 649

Primitive与Entity的区别

每个Entity 都可以代表一个现实世界中的对象,并且可以携带各种属性(如位置、速度、模型、纹理等),这些属性会自动映射到底层的Primitive 上。每个Entity实例都有不同的属性,例如位置、姿态、缩放、颜⾊、贴图等,并且可以通过编程⽅式创建、修改、删除。例如,我们可以使用Primitive来绘制点、线、多边形、体积、⽂本等基本图形。5、如果应用需要动态更新模型的位置、旋转或颜色,那么使用Entity 就更加方便,因为我们可以直接修改Entity 的属性,而不需要直接操作Primitive。

D_bel的博客 383

cesium面试题3-Primitive 与 Entity 在 Cesium 中的性能差异及适用场景

Cesium中Entity与Primitive的性能差异与适用场景 在Cesium中,Entity是高层级抽象,适合快速开发和简单场景,通过简洁API即可实现图形展示;Primitive是低层级抽象,直接控制WebGL绘制单元,适合复杂场景和性能优化。主要差异在于:Entity封装了渲染细节但性能较低,适合少量要素;Primitive可合并几何数据减少绘制调用,适合大规模数据。复杂场景建议使用Primitive,因其能手动优化批次合并、实例化渲染等,显著提升性能。

God's asylum的博客 787

BambuStudio学习笔记:OpenCSG - 实时构造实体几何(CSG)渲染的 OpenGL 方案

**OpenCSG** 是一个基于 **OpenGL** 的 **构造实体几何(CSG)** 实时渲染库,通过 **深度剥离算法** 实现布尔运算(并集、交集、差集)的可视化。其核心目标是简化复杂几何体的交互式建模,适用于 CAD 原型设计、3D 打印预览、教育工具等场景。

zzzkk2009的专栏 929

Cesium学习笔记-用primitive画虚线

一些基本概念 entity和primitive比较 (1)面向图形开发人员的底层API,通常称为“Primitive API”。该API暴露最小限度的抽象,使用图形学术语,具有很大的灵活性,需要具有图形学编程的知识。 (2)高级别的数据驱动的API,称为“Entity API”。该API使用一致性设计的、高级别的对象来管理一组相关性的可视化对象,本质是用Primitive封装的api。 primitive基础概念 Primitive由两个部分组成: (1)几何形状(Geometry):定义了Primiti

靜哥哥的博客 6493

一文解释电路中常用电子元器件应用和选型01

电容和二极管是电路中最常用的两个电子元器件,种类和系列众多,这里简单总结一下应用场景和选型方式 电容(Capacitor) 电容的种类(20种以上)和应用非常广泛,但是我经常遇到的无非就是下面这几种: 应用 1.隔直流。 2.旁路(去耦) 3.耦合 4.滤波 5.温度补偿 6.计时 7.调谐 8.整流 9.储能 种类 1. 陶瓷电容 2. 云母电容 3. 铝电解电容 4. 钽

weixin_43904073的博客 2236

LoRaWAN协议-物理层(PHY)详解

目录 1 前言 2 物理层包格式 2.1 LoRa调制 2.2 FSK调制 2.3 LR-FHSS 3 Uplink 4 Downlink 1 前言 如图所示,LoRaWAN是一种开放式网络协议,可提供由LoRa联盟标准化和维护的安全双向通信,移动性和本地化服务。该协议做为MAC层,属于数据链路层。其物理层(PHY)实现与其他设备的通信,目前物理层支持LoRa,FSK,LR-FHSS调制。 下图的PHY只标准了LoRa调制,是因为LoRaWAN实际应用中基...

只想.静静的博客 8773

Cesium海量点渲染优化:从Entity到Primitive的性能飞跃

本文深入探讨了Cesium中海量点渲染的性能优化方案,针对使用Entity API导致的卡顿甚至崩溃问题,提出了转向Primitive API的解决方案。通过对比两者在抽象层级、更新机制和性能上的本质区别,并结合GPU硬件加速原理,详细阐述了如何利用PointPrimitiveCollection实现十万级点数据的流畅渲染,最终带来显著的性能飞跃。

www00的博客 717

cosi-corr操作详细步骤

cosi-corr是一个可以加载到ENVI的软件包,由加利福尼亚理工学院的François Ayoub,  Sébastien Leprince,  and Lionel Keene开发,并且提供源代码,该软件受到了NSF的资助。软件的主要功能是可以满足各种影响的正射校正和影像配准。 针对下载下来的软件包参考《cosi-corr_guide.pdf》,进行配置使用具体详细过程如下: (本机环境

u013299471的专栏 1万+

Cesium中的Entity(实体)与Primitive(图元)

/ 自定义材质的GLSL着色器fabric: {time: 0.0,},source: `});// 每一帧更新时间uniform});// 创建Primitive使用自定义材质})});Entity是“开箱即用”的高层工具,专注于开发效率与易用性,适合大多数快速开发场景Primitive是“底层手术刀”,专注于性能与定制化,适合大规模数据与复杂渲染需求在实际项目中,建议混合使用。

ct978的博客 536

微信小程序 - 最新详细实现跳转打开第三方网站方法流程及示例代码,在小程序内直接打开H5页面或微信公众号文章后台业务域名配置及下载校验文件上传服务器,嵌入外部网站跳转第三方h5网页(详细配置及代码)

微信小程序,打开第三方网站,放校验文件,怎么配置业务域名,后台配置,怎么打开外部没有关联的网站,小程序直接打开公众号文章,指定页面,跳转第三方url,跳转到外部网站,小程序跳转到任意外部网页,网站链接,跳转到其他网页(外部链接),小程序嵌入外部h5链接,校验文件怎么放到对方服务器上,要跳转到网站没权限放过去,校验文件验证域名,把校验文件放到对面网站,别人的服务器也打不开没权限怎么放呢,勾选不校验合法域名,txt,打不开别人的网页怎么办,真机调试打不开,无法跳转,有什么其他办法不放校验文件吗,别人不可能同意,

🏆 前端领域优质创作者 1万+

2023华为od机试C卷【推荐多样性】Java&Go 实现

推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略1.各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一元素,再从第二个列表中为每屏选择一个元素,依次类推2.每个列表的元素尽量均分为N份,如果不够N个,也要全部分配完,

MISAYAONE的博客 2180

Cesium中的Entity API和Primitive API的区别(2)

提示:Cesium中提供两类API: (1)面向图形开发人员的底层API,通常称为“Primitive API”。该API暴露最小限度的抽象,使用图形学术语,具有很大的灵活性,需要具有图形学编程的知识; (2)高级别的数据驱动的API,称为“Entity API”。该API使用一致性设计的、高级别的对象来管理一组相关性的可视化对象,其底层使用Primitive API;

XLSMN的博客 4592

盲孔、埋孔、通孔、一阶HDI、二阶HDI概念

文章目录1. 盲孔和埋孔2. 一阶、二阶HDI3. PADS软件设置盲埋孔 1. 盲孔和埋孔 HDI板是高密度互连(High Density Interconnector)的缩写,是生产印制板的一种技术,使用微盲埋孔技术的一种线路分布密度比较高的电路板,也被称为盲埋孔板,下图就是一个6层HDI板,其中C和D就是盲孔,B是埋孔,A是通孔。 盲孔(Blind Via)指连接外层到内层的金属化孔,D是V13孔,连接顶层和第3层,C是V56孔,连接第5层和底层。 埋孔(Buried Via)指连接内层到内层的金属

记得诚 3万+

cesium API介绍

Cesium为开发者提供了丰富的图形绘制和空间数据管理的API,可以分为两类,一类是面向图形开发人员的低层次API,通常被称为Primitive API,另一类是用于驱动数据可视化的高层次API,称为Entity API。(2)Appearance:外观,定义了Primitive的着色(shading),包括顶点着色器(vertex shader)、片元着色器(fragment shader),以及渲染状态(render state)。(3)低级别访问,易于修改着色器,使用自定义的渲染状态。

weixin_42700914的博客 1128

YOLOv8集成CPCA(Combined Parallel Convolutional Attention)注意力机制模块YOLOv8深度教程

YOLOv8集成CPCA注意力模块教程摘要 本教程详细介绍了如何将YOLOv8 CPCA(Combined Parallel Convolutional Attention)注意力模块集成到YOLOv8目标检测框架中。CPCA模块结合了通道注意力和多尺度空间注意力机制,通过全局池化和双路径融合增强通道特征,并利用多尺度深度可分离卷积捕获空间上下文信息。YOLOv8 教程包含完整的实现步骤:创建CPCA模块代码、修改YOLOv8模型解析逻辑、编写自定义配置文件,YOLOv8YOLOv8YOLOv8YOLOv8

FJN110的博客 1620

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: 关于Cesium中的常用坐标系及说明
下一篇: Cesium中的Entity API和Primitive API的区别(2)
龙之吻number7
博客等级 码龄10年 99粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值