html点实现从2d地图到cesium,输出文档后发现cesium没有html点绘制的api,比如cesium的label只能绘制文字点,billboard绘制图片点根本达不到html字符串的灵活度。几经查找,发现大家都是通过css定位来模拟的,即创建一个div元素插入到页面中,然后相对于cesium的canvas进行相对定位。这里的核心是将你的目标经纬度转换成css定位的位置。但是上面还有一个致命的问题,就是你的div元素使用了css定位。当地图滑动的时候,你的css定位会立刻暴露出来,并且无法随着地图的经纬度进行实时修正。需要完成上面的实时校正操作,即将经纬度实时转换成css定位单位(点数多了,性能可想而知)。稍后会添加代码。飞到指定位置是一个常见的操作,比如初始化到一个坐标点。目前我主要使用过下面列出的API,分别是viewer.camera.flyToviewer.flyTo(target,options)。这个target有点强,支持的target很多。实体|数组。<实体>|实体集合|数据源|意象图层|Cesium3DTileset|时间动态点云|Promise.<(Entity|Array.|EntityCollection|DataSource|ImageryLayer|Cesium3DTileset|TimeDynamicPointCloud)>清理Entitygeojson的数据转换由于后台提供了多边形数据,而我只是想绘制行政区域的边界线.多边形数据会画出面(当然也可以将面设置为透明来达到线条的效果,但不知为何还是需要画折线),所以需要转成折线并再次使用它。经过一番查找,我发现,turf库提供了一种转换方法,而且使用起来相当简单。代码如下:constmultiLineString=turf.polygonToLine(geojson);点聚合的方式是通过cesiumConfigurationEnableAggregationSetIconDefaultStyleandNon-AggregationStyleMapInitializationLoadCompleteEventconsthelper=newwindow.Cesium,在地图上正常绘制点(这里我使用dataSource绘制)。事件助手();helper.add(viewer.scene.globe.tileLoadProgressEvent,(number)=>{if(number>0){return;}number为加载的剩余tile个数,当number小于等于0时,可以确定地图已初始化this.props.onLoaded();});控制在一个高度范围内是否可见,比如当前观测高度是1000米,那么我如下配置后,这个元素就会是不可见,当我把观察高度调到999以下时,可以看到distanceDisplayCondition:newwindow.Cesium.DistanceDisplayCondition(1,999,)事件绑定点聚合,初始化不生效配置聚合后,发现当初始化,icon没有聚合,需要缩放地图,触发聚合的clusterEvent事件回调,icon会开始聚合,然后查找后发现entity.billboard的width和height没有设置初始化时,即如果你的icon是使用billboard的,需要为其设置宽高,否则初始化不能自动聚合//指定默认icondataSource.entities.values.forEach((entity)=>{entity.billboard.image=icon;entity.billboard.width=20;entity.billboard.height=18;});