SuperMap自定义ScaleBar控件

    在SuperMap IS.NET 2008(5.3.0及以上版本)的控件中有一个名为ScaleBarControl的控件,功能是与地图控件(MapControl)联动,实现地图按预定比例尺缩放。不过使用后,发现有几个诟病(也许是偶水平较低):

  • ScaleBar的小滑块(slider)很难通过控件的属性设置,让放大、缩小后的位置与背景的尺度条相匹配。
  • ScaleBar按钮图片和配饰的位置都比较难控制,特别是会受页面其他CSS影响。
  • 如果应用涉及多幅地图,必须在MapControl中逐个设置每幅地图的比例尺级别。

    所以...... 咱们动手来自己打造一个Custom ScaleBar,哈哈~~ 先上张最终成果图:

SuperMap自定义ScaleBar控件_第1张图片

    呵呵,有点感觉吧。是不是比ScaleBar更强大啊!废话少说,一起来看看实现方式思路:

  • 用DIV和Table在页面中构建ScaleBar
  • 采用AjaxScripts方式,用javaScript完成ScaleBar功能,并适当做些封装
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" >
  3. <head>    
  4.     <title>ScaleBar Demo</title>
  5.     <script type="text/javascript" src="scripts/SuperMap.IS.Include.js"></script>
  6.     <script type="text/javascript" src="scripts/Page.js"></script>
  7.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  8. </head>
  9. <!-- maybe we should put 'OnPageLoad' in jQuery $(document).ready() function -->
  10. <body onload="OnPageLoad('底图')" onunload="OnPageUnload()">
  11.     <!-- MapControl -->
  12.     <div id="myMap" style="width:744px; height:516px; overflow:hidden; margin:0;
  13.         padding:0; position:absolute; left:137px; top:153px; border:solid 1px gray">
  14.     </div>
  15.     
  16.     <!-- Scalebar slider -->
  17.     <div id="mapSlider" style="position: absolute; width: 14px; height: 8px; z-index: 2; left: 170px; top: 245px">
  18.         <img src="images/slider.png" style="width: 14px; height: 8px; border: 0px;" alt="" />
  19.     </div>
  20.     
  21.     <!-- Scalebar button -->
  22.     <div id="layer1" style="position: absolute; width: 54px; height: 225px; z-index: 1;
  23.         left: 150px; top: 146px;">
  24.         <table width="54" cellspacing="0" cellpadding="0" border="0" id="table1" style="position:relative; top:13px;">
  25.             <tbody>
  26.                 <tr height="18">
  27.                     <td></td>
  28.                     <td width="18" colspan="3">
  29.                         <img style="width: 18px; height: 18px; border: 0px;" onclick="OnClickPan(4)" src="images/north.png" />
  30.                     </td>
  31.                     <td></td>
  32.                 </tr>
  33.                 <tr height="18">
  34.                     <td width="18" align="right">
  35.                         <img style="width: 18px; height: 18px; border: 0px;" onclick="OnClickPan(2)" src="images/west.png" />
  36.                     </td>
  37.                     <td width="18" align="center">
  38.                         <img style="width: 18px; height: 18px; border: 0px;" onclick="ViewEntire()" src="images/middle.png" />
  39.                     </td>
  40.                     <td width="18" align="left">
  41.                         <img style="width: 18px; height: 18px; border: 0px;" onclick="OnClickPan(1)" src="images/east.png" />
  42.                     </td>
  43.                 </tr>
  44.                 <tr>
  45.                     <td></td>
  46.                     <td>
  47.                         <img height="18" width="18" border="0" style="" onclick="OnClickPan(3)" src="images/south.png" />
  48.                     </td>
  49.                     <td></td>
  50.                 </tr>
  51.                 <tr>
  52.                     <td></td>
  53.                     <td>
  54.                         <img height="18" width="18" border="0" style="" onclick="OnClickZoomIn()" src="images/zoom-plus.png" />
  55.                     </td>
  56.                     <td></td>
  57.                 </tr>
  58.                 <tr>
  59.                     <td></td>
  60.                     <td align="center">
  61.                         <img height="77" width="16" border="0" src="images/scalebar.gif" />
  62.                     </td>
  63.                     <td></td>
  64.                 </tr>
  65.                 <tr>
  66.                     <td></td>
  67.                     <td>
  68.                         <img height="18" width="18" border="0" style="" onclick="OnClickZoomOut()" src="images/zoom-minus.png" />
  69.                     </td>
  70.                     <td></td>
  71.                 </tr>
  72.             </tbody>
  73.         </table>
  74.     </div>
  75.     
  76.     <div id="info">
  77.         debug info</div>
  78. </body>
  79. </html>

Table的样式写法不是很好,没用css进行控制,大家有空改改吧。接着看对应的功能按钮实现:

  1. // 预设比例尺级别
  2. var ZoomLevels = 4;
  3. // scalebar slider.png距离scalebar.gif底部的像素距离
  4. var SliderStartAt = 298;    //pixelTop value
  5. var SliderStepMove = 16;    //pixel
  6. var map = null;
  7. var currentMapName="";
  8. //装载地图
  9. function OnPageLoad(mapName){
  10.     if(map==null)
  11.     {
  12.         var params = new Object();
  13.         params.mapHandler = "http://192.168.19.211/Web/";   //input your mapHandler
  14.         params.mapName = mapName;
  15.         currentMapName = mapName;
  16.         params.mapScales = [1/6278912,1/3139456,1/1569728,1/784864];
  17.         params.imageFormat = "gif";
  18.         params.x = -1082645.1410411300;
  19.         params.y = 2522135.1399492200;
  20.         params.zoomLevel = 1;
  21.         params.fixedView = false;
  22.         params.buffer = 256; // 预先进行下载的视图范围。
  23.         map = new SuperMap.IS.MapControl($("myMap"), params); 
  24.         map.Init();     
  25.         map.AttachEvent("onendzoom", RefreshSlider);
  26.         //map.AttachEvent("onchangeview", UpdateInfo);   for debug
  27.     }
  28.     else
  29.     {
  30.         map.Destroy();
  31.         map = null;
  32.     
  33.         var params = new Object();
  34.         params.mapHandler = "http://192.168.19.211/Web/";
  35.         params.mapName = mapName;
  36.         currentMapName = mapName;
  37.         params.mapScales = [1/6278912,1/3139456,1/1569728,1/784864];
  38.         params.imageFormat = "gif";
  39.         params.x = -1082645.1410411300;
  40.         params.y = 2522135.1399492200;
  41.         params.zoomLevel = 1;
  42.         params.fixedView = false;
  43.         params.buffer = 256; // 预先进行下载的视图范围。 
  44.         map = new SuperMap.IS.MapControl($("myMap"), params); 
  45.         map.Init();
  46.         map.AttachEvent("onendzoom", RefreshSlider);    //绑定OnEndZoom事件,在缩放完毕后调用RefreshSlider方法
  47.      }   
  48. }
  49. //卸载地图
  50. function OnPageUnload()
  51. {
  52.     map.Destroy();
  53.     map = null;
  54. }
  55. //[ScaleBar Function]
  56. //Scalebar Event Handler
  57. function RefreshSlider(eventArg)
  58. {
  59.     var zoomLevel = eventArg.param.zoomLevel;
  60.     MoveSlider(zoomLevel);
  61. }
  62. // "+" Button to ZoomIn
  63. function OnClickZoomIn()
  64. {
  65.     var mapLevel = map.GetZoomLevel();
  66.     if(mapLevel < ZoomLevels + 1)    // your map max level
  67.     {
  68.         mapLevel += 1;
  69.         map.SetZoomLevel(mapLevel);
  70.         MoveSlider(mapLevel);
  71.     }
  72. }
  73. // "-" Button to ZoomOut
  74. function OnClickZoomOut()
  75. {
  76.     var mapLevel = map.GetZoomLevel();
  77.     if(mapLevel > 1)
  78.     {
  79.         mapLevel -= 1;
  80.         map.SetZoomLevel(mapLevel);
  81.         MoveSlider(mapLevel);
  82.     }
  83. }
  84. //Move Slider when ZoomLevel change
  85. function MoveSlider(zoomlevel)
  86. {
  87.     var mapSlider = document.getElementById("mapSlider");
  88.     mapSlider.style.pixelTop = SliderStartAt - SliderStepMove * ( zoomlevel - 1 );
  89. }
  90. // East,West,South,North Pan Button
  91. function OnClickPan(tag)
  92. {
  93.     var x = map.GetMapCenterX();
  94.     var y = map.GetMapCenterY();
  95.     switch(tag)
  96.     {
  97.         case 1://east
  98.             x += 100000;
  99.             map.PanToMapCoord(x, y);
  100.             break;
  101.         case 2://west
  102.             x -= 100000;
  103.             map.PanToMapCoord(x, y);
  104.             break;
  105.         case 3://south
  106.             y -= 100000;
  107.             map.PanToMapCoord(x, y);
  108.             break;
  109.         case 4://north
  110.             y += 100000;
  111.             map.PanToMapCoord(x, y);
  112.             break;
  113.     }
  114. }
  115. // View Entire Map
  116. function ViewEntire() {
  117.     map.SetCenterAndZoom(-1187645.110411300,2372135.1399492200,0.00000016)   // x, y, zoomlevel= 1/6278912 = 0.00000016
  118. }
  119. // Debug Info
  120. function UpdateInfo(eventArg)
  121. {
  122.     var info = $("info");
  123.     if (!info) { return false; }
  124.     if(eventArg.param == null){
  125.         info.innerHTML = '<font color="red">error: ' + eventArg.error + '</font>';
  126.         return false;
  127.     }
  128.     info.innerHTML = 'mapName = ' + eventArg.param.mapName 
  129.         + ', zoomLevel=' + eventArg.param.zoomLevel
  130.         + ', mapCenter = ' + eventArg.param.mapCenter.ToString()
  131.         + ', pixelCenter = ' + eventArg.param.pixelCenter.ToString();
  132. }

代码中都尽量补充了一些注释,应该比较容易看懂。是不是很容易就搞定Custom ScaleBar啦,呵呵。也别高兴太早,剩下的还有几个问题待和大家一起解决和思考:

  • ScaleBar的脚本是否应该从page.js中抽离,单独放入SuperMap.IS.CustomScaleBar.js中啊?方便继续完善。(大家可下载源代码,对比SuperMap.IS.CustomScaleControl.js研究下。)
  • 在firefox中运行仍有问题,估计是CSS样式问题。
  • 还可以进一步将内部方法、属性包裹起来吗? 如果保留下来,以后开发用起来更方便呢?

好啦,先写到这里,欢迎大家多留言讨论。源文件请在此处下载!

PS:代码主要参考了http://www.supermap.com.cn/wenchuan/。

你可能感兴趣的:(JavaScript,css,table,null,firefox,border)