Cesium 学习记录(5)一次刷新出多个自定义气泡窗口

转载:https://blog.csdn.net/zlx312/article/details/79825111

上一篇文章——Cesium 学习记录(4)自定义气泡窗口 中讲述了如何自定义leaflet风格气泡窗口,并且点击物体后根据物体id获取需要的信息填充进气泡窗口中。

但是有时候可能会需要打开一个页面就自动出来好多气泡(气泡中可能展示一些实时信息),而不是点击一个出现一个。

我的方法比较笨,求轻喷,欢迎大神有更好的方法讨论指教。o(^▽^)o


1、CSS 

CSS和上一节一样,没有什么改变


    
    
  1. @ CHARSET "UTF-8";
  2. /*leaflet风格气泡窗口样式模板*/
  3. .leaflet-popup {
  4. position: absolute;
  5. text-align: center;
  6. }
  7. .leaflet-popup-close-button {
  8. position: absolute;
  9. top: 0;
  10. right: 0;
  11. padding: 4px 4px 0 0;
  12. text-align: center;
  13. width: 18px;
  14. height: 14px;
  15. font: 16px/ 14px Tahoma, Verdana, sans-serif;
  16. color: #c3c3c3;
  17. text-decoration: none;
  18. font-weight: bold;
  19. background: transparent;
  20. }
  21. .leaflet-popup-content-wrapper {
  22. text-align: center;
  23. max-height: 200px;
  24. overflow-y: auto;
  25. background: white;
  26. box-shadow: 0 3px 14px rgba(0,0,0,0.4);
  27. padding: 1px;
  28. text-align: left;
  29. border-radius: 12px;
  30. }
  31. .leaflet-popup-content {
  32. margin: 13px 19px;
  33. line-height: 1.4;
  34. }
  35. .leaflet-popup-tip-container {
  36. margin: 0 auto;
  37. width: 200px;
  38. height: 100px;
  39. position: relative;
  40. overflow: hidden;
  41. }
  42. .leaflet-popup-tip {
  43. background: white;
  44. box-shadow: 0 3px 14px rgba(0,0,0,0.4);
  45. width: 17px;
  46. height: 17px;
  47. padding: 1px;
  48. margin: - 10px auto 0;
  49. -webkit-transform: rotate(45deg);
  50. -moz-transform: rotate(45deg);
  51. -ms-transform: rotate(45deg);
  52. -o-transform: rotate(45deg);
  53. transform: rotate(45deg);
  54. }
  55. /*按钮样式*/
  56. .add-button{
  57. }
2.JS

动态生成DIV,因为有多个DIV,所以每一个名字、ID都要都不一样

我的这一段代码是放在ajax请求后台返回数据成功后的$.each循环中的,代码中的“s”代表的就是每次循环动态添加的实体,所以每一个“s”的id都是不一样的。

需要注意的是,由于变量名不能使用字符串动态拼接,所以可以用window[变量名]来实现字符串解析,达到动态变量名的效果。

除了div变量名不同,同样气泡窗口的trackPopUp等id名也需要加上唯一的s.id,否则会出现id名相同添加content时内容都一样,或者是关闭时一起关闭的情况。所以要得到完全不同的DIV必须id名也都唯一。

window[newDiv]
    
    

    
    
  1. var newDiv = "div"+s.id; //生成函数名
  2. window[newDiv]= '<div id="trackPopUp-'+s.id+ '" style="display:block;">'+
  3. '<div id="trackPopUpContent-'+s.id+ '" class="leaflet-popup" style="top:5px;left:0;">'+
  4. '<a id="leaflet-popup-close-button-'+s.id+ '" class="leaflet-popup-close-button" href="#">×</a>'+
  5. '<div class="leaflet-popup-content-wrapper">'+
  6. '<div id="trackPopUpLink-'+s.id+ '" class="leaflet-popup-content" style="max-width: 300px;"></div>'+
  7. '</div>'+
  8. '<div class="leaflet-popup-tip-container">'+
  9. '<div class="leaflet-popup-tip"></div>'+
  10. '</div>'+
  11. '</div>'+
  12. '</div>';
  13. $( "#cesiumContainer").append( window[newDiv]);
  14. var info =
  15. '<table><tbody><tr><th style="color:black;">站名</th><td><input style="color:black;" value='+station[id].stadiacode+ '></td></tr>'+
  16. '<tr><th style="color:black;">经度</th><td><input id="x" style="color:black;" value='+(x_k*station[id].x+x_off).toFixed( 6)+ '></td></tr>'+
  17. '<tr><th style="color:black;">纬度</th><td><input id="y" style="color:black;" value='+(y_k*station[id].y+y_off).toFixed( 6)+ '></td></tr>'+
  18. '</tbody></table>' ;
  19. var obj = { station:s, position:s._position._value, content:info};
  20. autoInfoWindow(obj);

接下来是autoInfoWindow函数的写法

将ID的名称都加上了唯一的s,id来进行字符串拼接

 var trackPopUpLink="#trackPopUpLink-"+obj.station.id;
 var trackPopUp="#trackPopUp-"+obj.station.id;
  var trackPopUpContent="#trackPopUpContent-"+obj.station.id;
  var close="#leaflet-popup-close-button-"+obj.station.id;


    
    
  1. function autoInfoWindow(obj) {
  2. var trackPopUpLink= "#trackPopUpLink-"+obj.station.id;
  3. var trackPopUp= "#trackPopUp-"+obj.station.id;
  4. var trackPopUpContent= "#trackPopUpContent-"+obj.station.id;
  5. var close= "#leaflet-popup-close-button-"+obj.station.id;
  6. $( ".cesium-selection-wrapper").show();
  7. $(trackPopUpLink).empty();
  8. $(trackPopUpLink).append(obj.content);
  9. function positionPopUp (c) {
  10. var x = c.x - ($(trackPopUpContent).width()) / 2;
  11. var y = c.y - ($(trackPopUpContent).height());
  12. $(trackPopUpContent).css( 'transform', 'translate3d(' + x + 'px, ' + y + 'px, 0)');
  13. }
  14. var c = new Cesium.Cartesian2(obj.position.x, obj.position.y);
  15. $(trackPopUp).show();
  16. positionPopUp(c);
  17. //动态变量名
  18. var stationHandler = obj.station.id; //生成函数名
  19. window[stationHandler] = viewer.scene.postRender.addEventListener( function () {
  20. var changedC = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, obj.station._position._value);
  21. // If things moved, move the
  22. // popUp too
  23. if ((c.x !== changedC.x) || (c.y !== changedC.y)) {
  24. positionPopUp(changedC);
  25. c = changedC;
  26. }
  27. });
  28. // PopUp close button event handler
  29. $(close).click( function() {
  30. $(trackPopUp).hide();
  31. $(trackPopUpLink).empty();
  32. $( ".cesium-selection-wrapper").hide();
  33. window[stationHandler].call();
  34. return false;
  35. });
  36. }

这样一进入页面就可以看到很多个DIV了,每一个信息都是根据自己对应的entity获取的,关闭按钮也是一一对应的。

效果如下:



上一篇文章——Cesium 学习记录(4)自定义气泡窗口 中讲述了如何自定义leaflet风格气泡窗口,并且点击物体后根据物体id获取需要的信息填充进气泡窗口中。

但是有时候可能会需要打开一个页面就自动出来好多气泡(气泡中可能展示一些实时信息),而不是点击一个出现一个。

我的方法比较笨,求轻喷,欢迎大神有更好的方法讨论指教。o(^▽^)o


1、CSS 

CSS和上一节一样,没有什么改变


  
  
  1. @ CHARSET "UTF-8";
  2. /*leaflet风格气泡窗口样式模板*/
  3. .leaflet-popup {
  4. position: absolute;
  5. text-align: center;
  6. }
  7. .leaflet-popup-close-button {
  8. position: absolute;
  9. top: 0;
  10. right: 0;
  11. padding: 4px 4px 0 0;
  12. text-align: center;
  13. width: 18px;
  14. height: 14px;
  15. font: 16px/ 14px Tahoma, Verdana, sans-serif;
  16. color: #c3c3c3;
  17. text-decoration: none;
  18. font-weight: bold;
  19. background: transparent;
  20. }
  21. .leaflet-popup-content-wrapper {
  22. text-align: center;
  23. max-height: 200px;
  24. overflow-y: auto;
  25. background: white;
  26. box-shadow: 0 3px 14px rgba(0,0,0,0.4);
  27. padding: 1px;
  28. text-align: left;
  29. border-radius: 12px;
  30. }
  31. .leaflet-popup-content {
  32. margin: 13px 19px;
  33. line-height: 1.4;
  34. }
  35. .leaflet-popup-tip-container {
  36. margin: 0 auto;
  37. width: 200px;
  38. height: 100px;
  39. position: relative;
  40. overflow: hidden;
  41. }
  42. .leaflet-popup-tip {
  43. background: white;
  44. box-shadow: 0 3px 14px rgba(0,0,0,0.4);
  45. width: 17px;
  46. height: 17px;
  47. padding: 1px;
  48. margin: - 10px auto 0;
  49. -webkit-transform: rotate(45deg);
  50. -moz-transform: rotate(45deg);
  51. -ms-transform: rotate(45deg);
  52. -o-transform: rotate(45deg);
  53. transform: rotate(45deg);
  54. }
  55. /*按钮样式*/
  56. .add-button{
  57. }
2.JS

动态生成DIV,因为有多个DIV,所以每一个名字、ID都要都不一样

我的这一段代码是放在ajax请求后台返回数据成功后的$.each循环中的,代码中的“s”代表的就是每次循环动态添加的实体,所以每一个“s”的id都是不一样的。

需要注意的是,由于变量名不能使用字符串动态拼接,所以可以用window[变量名]来实现字符串解析,达到动态变量名的效果。

除了div变量名不同,同样气泡窗口的trackPopUp等id名也需要加上唯一的s.id,否则会出现id名相同添加content时内容都一样,或者是关闭时一起关闭的情况。所以要得到完全不同的DIV必须id名也都唯一。

window[newDiv]
  
  

  
  
  1. var newDiv = "div"+s.id; //生成函数名
  2. window[newDiv]= '<div id="trackPopUp-'+s.id+ '" style="display:block;">'+
  3. '<div id="trackPopUpContent-'+s.id+ '" class="leaflet-popup" style="top:5px;left:0;">'+
  4. '<a id="leaflet-popup-close-button-'+s.id+ '" class="leaflet-popup-close-button" href="#">×</a>'+
  5. '<div class="leaflet-popup-content-wrapper">'+
  6. '<div id="trackPopUpLink-'+s.id+ '" class="leaflet-popup-content" style="max-width: 300px;"></div>'+
  7. '</div>'+
  8. '<div class="leaflet-popup-tip-container">'+
  9. '<div class="leaflet-popup-tip"></div>'+
  10. '</div>'+
  11. '</div>'+
  12. '</div>';
  13. $( "#cesiumContainer").append( window[newDiv]);
  14. var info =
  15. '<table><tbody><tr><th style="color:black;">站名</th><td><input style="color:black;" value='+station[id].stadiacode+ '></td></tr>'+
  16. '<tr><th style="color:black;">经度</th><td><input id="x" style="color:black;" value='+(x_k*station[id].x+x_off).toFixed( 6)+ '></td></tr>'+
  17. '<tr><th style="color:black;">纬度</th><td><input id="y" style="color:black;" value='+(y_k*station[id].y+y_off).toFixed( 6)+ '></td></tr>'+
  18. '</tbody></table>' ;
  19. var obj = { station:s, position:s._position._value, content:info};
  20. autoInfoWindow(obj);

接下来是autoInfoWindow函数的写法

将ID的名称都加上了唯一的s,id来进行字符串拼接

 var trackPopUpLink="#trackPopUpLink-"+obj.station.id;
 var trackPopUp="#trackPopUp-"+obj.station.id;
  var trackPopUpContent="#trackPopUpContent-"+obj.station.id;
  var close="#leaflet-popup-close-button-"+obj.station.id;


  
  
  1. function autoInfoWindow(obj) {
  2. var trackPopUpLink= "#trackPopUpLink-"+obj.station.id;
  3. var trackPopUp= "#trackPopUp-"+obj.station.id;
  4. var trackPopUpContent= "#trackPopUpContent-"+obj.station.id;
  5. var close= "#leaflet-popup-close-button-"+obj.station.id;
  6. $( ".cesium-selection-wrapper").show();
  7. $(trackPopUpLink).empty();
  8. $(trackPopUpLink).append(obj.content);
  9. function positionPopUp (c) {
  10. var x = c.x - ($(trackPopUpContent).width()) / 2;
  11. var y = c.y - ($(trackPopUpContent).height());
  12. $(trackPopUpContent).css( 'transform', 'translate3d(' + x + 'px, ' + y + 'px, 0)');
  13. }
  14. var c = new Cesium.Cartesian2(obj.position.x, obj.position.y);
  15. $(trackPopUp).show();
  16. positionPopUp(c);
  17. //动态变量名
  18. var stationHandler = obj.station.id; //生成函数名
  19. window[stationHandler] = viewer.scene.postRender.addEventListener( function () {
  20. var changedC = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, obj.station._position._value);
  21. // If things moved, move the
  22. // popUp too
  23. if ((c.x !== changedC.x) || (c.y !== changedC.y)) {
  24. positionPopUp(changedC);
  25. c = changedC;
  26. }
  27. });
  28. // PopUp close button event handler
  29. $(close).click( function() {
  30. $(trackPopUp).hide();
  31. $(trackPopUpLink).empty();
  32. $( ".cesium-selection-wrapper").hide();
  33. window[stationHandler].call();
  34. return false;
  35. });
  36. }

这样一进入页面就可以看到很多个DIV了,每一个信息都是根据自己对应的entity获取的,关闭按钮也是一一对应的。

效果如下:



猜你喜欢

转载自blog.csdn.net/sinat_38818576/article/details/83650215
今日推荐