• [Cesium]设置点Entity的


    • 数据准备:

    Geoserver发布WFS(Web Feature Service)服务

    [GeoServer系列]Shapefile数据发布-CSDN博客

    数据加载:

    数据准备第二种方式加载数据,利用for循环加载多个图层。首先将获取数据(每获取一次获得pomise,将其加入数组中),其次利用Promise.all()异步加载所有图层

    1. loadVideoLayers(indexes) {
    2. let that = this;
    3. try {
    4. let proArr=[];
    5. // 添加视频监测图层
    6. for (const index of indexes) {
    7. // console.log(index)
    8. // 2. WMS服务 江苏省视频监
    9. let pro = axios({
    10. url: '/api' + this.videoLayer[index],
    11. method: 'get',
    12. })
    13. proArr.push(pro)
    14. }
    15. Promise.all(proArr).then(function(resolve) {
    16. console.log("resolve--", resolve);
    17. resolve.map(async(item, index) => {
    18. //返回promise
    19. let ds = Cesium.GeoJsonDataSource.load(item.data)
    20. let layer = await that.viewer.dataSources.add(ds)
    21. that.videoLayers.push(layer);
    22. })
    23. })
    24. }
    25. }

    样式设置(从Ant Design第三方库获取):

    Cesium中,修改点实体的样式可以通过使用billboard属性来设置自定义图标。为了使用自定义的Ant Design或Vue Icon库中的图标,需要先将图标转换成可以在Cesium中使用的格式,例如Canvas或者Data URL。

    以下是一个示例,展示了如何使用Ant Design图标库中的图标并将其设置为Cesium中的点实体的样式:

    1. 安装必要的库

      首先,确保安装了Cesium和Ant Design图标库。如果使用Vue,则还需要安装Vue的依赖。

      npm install cesium @ant-design/icons
    2. 创建一个Ant Design图标的Canvas绘制函数

      使用Canvas API来绘制Ant Design图标,并将其转换为Data URL。这个Data URL可以直接用作Cesium点实体的billboard图像。

    • 获取Ant Design的SVG元素
    1. <template>
    2. <a-icon type="video-camera" theme="filled" style="color:darkgray;" ref="lev1"/>
    3. </template>
    4. <script>
    5. export default{
    6. methods:{
    7. findSVGEkement(){
    8. let refName=lev1
    9. //vue中实现
    10. const iconElement = this.$refs[refName].$el; // 获取<a-icon>组件的DOM元素
    11. // 查询SVG元素
    12. let svg = iconElement.querySelector('svg')
    13. console.log(svg.outerHTML); // 输出SVG元素或进行其他操作
    14. return svg;
    15. //html中实现
    16. // console.log(element)
    17. // if (element.tagName.toLowerCase() === 'svg') {
    18. // return element;
    19. // }
    20. // for (let child of element.children) {
    21. // const found = this.findSVGElement(child);
    22. // if (found) return found;
    23. // }
    24. // return null;
    25. }
    26. }
    27. },
    28. }
    29. </script>
    • 转换为Data URL
    1. async getIconAsDataURL(index) {
    2. //递归获取svg标签
    3. //0-2=>1-3
    4. index=index+1;
    5. //通过变量动态地访问对象的属性
    6. let refName='lev'+index
    7. const svgElement = this.findSVGElement(this.$refs[refName]);
    8. if (!svgElement) {
    9. console.error('SVG element not found');
    10. return null;
    11. }
    12. if (index === 1){
    13. svgElement.style.fill = "darkgray";
    14. }
    15. else if(index===2) {
    16. svgElement.style.fill = "orange"
    17. }else {
    18. svgElement.style.fill ="red"
    19. }
    20. const svgString = new XMLSerializer().serializeToString(svgElement);
    21. const canvas = document.createElement('canvas');
    22. canvas.width = 64;
    23. canvas.height = 64;
    24. const ctx = canvas.getContext('2d');
    25. const img = new Image();
    26. img.src = 'data:image/svg+xml;base64,' + btoa(svgString);
    27. return new Promise((resolve) => {
    28. img.onload = () => {
    29. ctx.drawImage(img, 0, 0, 64, 64);
    30. resolve(canvas.toDataURL('image/png'));
    31. };
    32. });
    33. }

    在Cesium中创建点实体并设置自定义样式

    一旦我们有了图标的Data URL,可以将其用于Cesium实体的billboard属性。

    1. loadVideoLayers(indexes) {
    2. let that = this;
    3. try {
    4. let proArr=[];
    5. // 添加视频监测图层
    6. for (const index of indexes) {
    7. // console.log(index)
    8. // 2. WMS服务 江苏省视频监
    9. let pro = axios({
    10. url: '/api' + this.videoLayer[index],
    11. method: 'get',
    12. })
    13. proArr.push(pro)
    14. }
    15. Promise.all(proArr).then(function(resolve) {
    16. console.log("resolve--", resolve);
    17. resolve.map(async(item, index) => {
    18. //返回promise
    19. let ds = Cesium.GeoJsonDataSource.load(item.data)
    20. let layer = await that.viewer.dataSources.add(ds)
    21. that.videoLayers.push(layer);
    22. ds.then(datasource=>{
    23. datasource.entities.values.forEach(entity=>{
    24. let promiseRes = that.getIconAsDataURL(index)
    25. promiseRes.then(url=>{
    26. entity.billboard = {
    27. image: url,
    28. width: 12,
    29. height:12
    30. }
    31. })
    32. })
    33. })
    34. })
    35. })
    36. // //show属性控制图层是否可见
    37. // // layer.show=false
    38. // })
    39. }catch (e){
    40. console.log(e)
    41. }
    42. },
  • 相关阅读:
    SpringBoot整合RestHighLevelClient实现查询操作
    一篇带你搞定Javaの继承
    C. Most Similar Words
    【软件测试】(北京)字节跳动科技有限公司二面笔试题
    Java-IO流之字符流(下篇)
    【密码加密原则】
    基于美日 627 例患者的临床数据,谷歌证实 AI 辅助肺癌筛查的群体有效性
    高通平台稳定性分析-CFI failure
    uview的安装和功能
    WPF-后台设置控件Background
  • 原文地址:https://blog.csdn.net/m0_55049655/article/details/139419694