• cesium 实战记录(一) 底图动态配置,前端实现切换


    上帝希望:

    有个底图管理功能,用户配置好需要展示的底图后,在地图页面会出现相应的底图可供切换;

     大概就这样吧底图切换。

    思考:

    1、首先要想动态管理底图,地图页面动态渲染底部的basemap组件。

    那底图的前端渲染数据格式要确定,

    2、cesium 切换图层的方法

    3、看了网上大佬们写的cesium 底图切换,大部分都不算真正意义上的底图,脱离上帝太远了,落不了地

    设计思路:

    1、数据格式:看了页面长那样,大概知道了,数据需要:img , label,图层的类型type  以及构造 layer 的参数 params ;

    2、切换图层方法:

    我先插一下什么叫底图的切换底图就是最底层的图层,在底图切换的时候上面叠加的图层不会受到任何影响

    之前在arcgis 中实现底图的切换:arcgis 的map 类中 有一个basemap 的属性,只需要将底图加入basemap 中就可以了,切换的时候更改basemap 中的图层即可,不需要在考虑图层的顺序

    一开始我按照之前 arcgis 写的思路:寻找 view 中basemap 这个属性,但是 cesium 的 viewer 没有这个属性,他甚至没有底图这个概念,只有 imageryLayers 图像图层,大部分的图层都算这个子类。

    然后我就想把底图的图层都放在一个类似于 layersGroup 的图层组集合中,然后找到这个集合,每次切换的时候对这个集合进行操作,方便管理。

    cesium 的确实有 ImageryLayerCollection 这样的一个类,我尝试创建这样一个图层组集合,但是发现viewer 不支持直接加入这个集合;这个 ImageryLayerCollection 我认为只是 对于viewer.imageryLayers 返回这样一个图层集合,可在这里看到集合的操作方法等等。(暂时没看到其他用处)

    既然走不通,那就姥姥的踏踏实实的写切换方法把 ============》》》》 

    先移除之前的,然后在添加现在的,最后在调整下层级顺序





    上代码!

    首先是数据格式:

    1. tdtUrl: "https://t{s}.tianditu.gov.cn", //天地图主域名
    2. const basemapOptions =[
    3. /**
    4. * type代表地图服务类型
    5. * 0 代表ArcGisMapServerImageryProvider;
    6. * 1 代表createOpenStreetMapImageryProvider;
    7. * 2 代表WebMapTileServiceImageryProvider;
    8. * 3 代表createTileMapServiceImageryProvider;
    9. * 4 代表UrlTemplateImageryProvider;
    10. * 5 代表WebMapServiceImageryProviderr);
    11. */
    12. {
    13. id:'TDTSL',
    14. img:'',//缩略图
    15. type:2,
    16. label:'天地图矢量',
    17. params:[
    18. {
    19. url: tdtUrl + '/cva_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cva&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token,
    20. layer: 'veccva',
    21. style: 'default',
    22. format: 'tiles',
    23. tileMatrixSetID: 'w',
    24. subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
    25. credit: new Cesium.Credit('天地图矢量注记'),
    26. maximumLevel: 18
    27. },
    28. {
    29. url: tdtUrl + '/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=vec&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token,
    30. layer: 'vec',
    31. style: 'default',
    32. format: 'tiles',
    33. tileMatrixSetID: 'w',
    34. subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
    35. credit: new Cesium.Credit('天地图矢量'),
    36. maximumLevel: 18
    37. },
    38. ]
    39. },
    40. {
    41. id:'TDTYX',
    42. img:'',//缩略图
    43. type:2,
    44. label:'天地图影像',
    45. params:[
    46. {
    47. url: tdtUrl + '/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token,
    48. layer: 'imgcia',
    49. style: 'default',
    50. format: 'tiles',
    51. tileMatrixSetID: 'w',
    52. subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
    53. credit: new Cesium.Credit('天地图影像注记'),
    54. maximumLevel: 18
    55. },
    56. {
    57. url: tdtUrl + '/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token,
    58. layer: 'img',
    59. style: 'default',
    60. format: 'tiles',
    61. tileMatrixSetID: 'w',
    62. subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
    63. credit: new Cesium.Credit('天地图影像'),
    64. maximumLevel: 18
    65. },
    66. ]
    67. }
    68. ]

    大概就上面的吧。

    然后是切换方法:

    这个不想放啊,再放还不如直接放整个底图切换的 js 咯;

    算了,给你们抄吧,抄作业不得抄个爽!!!

    1. /**
    2. * @Description: 提供底图配置参数,底图切换方法
    3. * @author MrKuang
    4. * @VX k792794653
    5. * @date 2022/8/5 0005
    6. */
    7. const basemapOptions =[
    8. /**
    9. * type代表地图服务类型
    10. * 0 代表ArcGisMapServerImageryProvider;
    11. * 1 代表createOpenStreetMapImageryProvider;
    12. * 2 代表WebMapTileServiceImageryProvider;
    13. * 3 代表createTileMapServiceImageryProvider;
    14. * 4 代表UrlTemplateImageryProvider;
    15. * 5 代表WebMapServiceImageryProviderr);
    16. */
    17. {
    18. id:'TDTSL',
    19. img:'',//缩略图
    20. type:2,
    21. label:'天地图矢量',
    22. params:[
    23. {
    24. url: tdtUrl + '/cva_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cva&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token,
    25. layer: 'veccva',
    26. style: 'default',
    27. format: 'tiles',
    28. tileMatrixSetID: 'w',
    29. subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
    30. credit: new Cesium.Credit('天地图矢量注记'),
    31. maximumLevel: 18
    32. },
    33. {
    34. url: tdtUrl + '/vec_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=vec&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token,
    35. layer: 'vec',
    36. style: 'default',
    37. format: 'tiles',
    38. tileMatrixSetID: 'w',
    39. subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
    40. credit: new Cesium.Credit('天地图矢量'),
    41. maximumLevel: 18
    42. },
    43. ]
    44. },
    45. {
    46. id:'TDTYX',
    47. img:'',//缩略图
    48. type:2,
    49. label:'天地图影像',
    50. params:[
    51. {
    52. url: tdtUrl + '/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token,
    53. layer: 'imgcia',
    54. style: 'default',
    55. format: 'tiles',
    56. tileMatrixSetID: 'w',
    57. subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
    58. credit: new Cesium.Credit('天地图影像注记'),
    59. maximumLevel: 18
    60. },
    61. {
    62. url: tdtUrl + '/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=' + token,
    63. layer: 'img',
    64. style: 'default',
    65. format: 'tiles',
    66. tileMatrixSetID: 'w',
    67. subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
    68. credit: new Cesium.Credit('天地图影像'),
    69. maximumLevel: 18
    70. },
    71. ]
    72. }
    73. ]
    74. export const changeBasemap =(viewer,val)=>{
    75. const f =viewer.imageryLayers._layers.filter(item=>{
    76. return item.lyr_id;
    77. })
    78. if(f.length == 0){
    79. viewer.imageryLayers.remove(viewer.imageryLayers.get(0))
    80. const l = getLayer(getLayerOption('TDTSL'));//默认加载天地图矢量
    81. l.forEach(itme =>{
    82. viewer.imageryLayers.add(itme);
    83. viewer.imageryLayers.lowerToBottom(itme);
    84. })
    85. }else{
    86. for (const elem of f) {
    87. viewer.imageryLayers.remove(elem);
    88. }
    89. const l = getLayer(getLayerOption(val));//默认加载天地图矢量
    90. l.forEach(itme =>{
    91. viewer.imageryLayers.add(itme);
    92. viewer.imageryLayers.lowerToBottom(itme);
    93. })
    94. }
    95. }
    96. function getLayerOption(val){
    97. return basemapOptions.find(item =>{
    98. return item.id == val;
    99. })
    100. }
    101. function getLayer (val){
    102. let tempLayerList=[];
    103. switch (val.type){
    104. case 0:{
    105. break;
    106. }
    107. case 1:{
    108. break;
    109. }
    110. case 2:{
    111. val.params.forEach(item =>{
    112. let l =new Cesium.ImageryLayer(
    113. new Cesium.WebMapTileServiceImageryProvider(item)
    114. )
    115. l.lyr_id = 'basemapLayer';
    116. l.lyr_name = val.id;
    117. tempLayerList.push(
    118. l
    119. )
    120. })
    121. break;
    122. }
    123. }
    124. return tempLayerList;
    125. }

    索性前端页面调用方式也放出来吧:

    实例化viewer 之后添加这样就行

    切换的时候这样:

    我这边还是直接写的'TDTYX',

    因为我前端页面还没写好啊,哈哈哈,到时候写完直接把底图标签中数据的id 传进来就ok了。

    最后大概看下效果把:

     

  • 相关阅读:
    零基础自学javase黑马课程第十二天综合练习复习
    【Jfrog Artifactory】配置邮件服务器
    33 C++ Web 编程
    计算机基础知识35
    机器学习之算法优化(一)
    微信小程序-入门
    C#(四十五)之线程池
    jupyterlab教程
    通用人工智能技术(深度学习,大模型,Chatgpt,多模态,强化学习,具身智能)
    【毕设项目推荐】学长做过的那些有趣的毕设项目 - 毕设项目分享 (单片机 嵌入式 物联网 stm32)
  • 原文地址:https://blog.csdn.net/KK_bluebule/article/details/126177571