layerSwitcher.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. ol.control.LayerSwitcher = function(opt_options) {
  2. var this_ = this;
  3. var options = opt_options || {};
  4. var layers = [];
  5. if(window.parent.googleStatus == "true"){
  6. layers.push({"mapType":"googleMap","jiupian":"1","showText":"Google Map","layer":null});
  7. layers.push({"mapType":"googleMapSate","jiupian":"0","showText":"Google Sate Map","layer":null});
  8. }
  9. if(window.parent.baiduStatus == "true"){
  10. layers.push({"mapType":"baiduMap","jiupian":"2","showText":"Baidu Map","layer":null});
  11. layers.push({"mapType":"baiduMapSate","jiupian":"2","showText":"Baidu Sate Map","layer":null});
  12. }
  13. if(window.parent.gaodeStatus == "true"){
  14. layers.push({"mapType":"gaodeMap","jiupian":"1","showText":"Gaode Map","layer":null});
  15. layers.push({"mapType":"gaodeMapSate","jiupian":"1","showText":"Gaode Sate Map","layer":null});
  16. }
  17. layers.push({"mapType":"openStreetMap","jiupian":"0","showText":"OpenStreetMap","layer":null});
  18. for(var i=0;i<layers.length; i++){
  19. var maplayer = this_.getLayer(layers[i].mapType);
  20. layers[i].layer = maplayer;
  21. map.addLayer(maplayer);
  22. }
  23. this.shownClassName = 'shown';
  24. var element = document.createElement('div');
  25. element.className = 'ol-unselectable ol-control layer-switcher';
  26. var layer_select = document.createElement('div');
  27. element.appendChild(layer_select);
  28. this.select_text = document.createElement('span');
  29. this.select_text.className = 'selected';
  30. layer_select.appendChild(this.select_text);
  31. var arrow = document.createElement('span');
  32. arrow.className = 'arrow';
  33. layer_select.appendChild(arrow);
  34. var ul = document.createElement('ul');
  35. element.appendChild(ul);
  36. for (var i = 0; i < layers.length; i++) {
  37. var li = document.createElement('li');
  38. li.setAttribute('mapType', layers[i].mapType);
  39. li.innerHTML = layers[i].showText;
  40. li.onclick = function() {
  41. this_.selectLayer(layers,this.getAttribute('mapType'));
  42. ul.classList.remove('shown');
  43. };
  44. li.onmouseover = function(e) {
  45. this.classList.add("hover");
  46. };
  47. li.onmouseout = function(e) {
  48. this.classList.remove("hover");
  49. };
  50. ul.appendChild(li);
  51. }
  52. layer_select.onclick = function() {
  53. if (!ul.classList.contains('shown')) {
  54.             ul.classList.add('shown');
  55.         }else{
  56. ul.classList.remove('shown');
  57. }
  58. };
  59. this_.selectLayer(layers,OL.CONSTANT.CURRENT_MAP_TYPE);//默认开启
  60. // function selectLayer(layerName) {
  61. // for (var i = 0; i < layers.length; i++) {
  62. //// alert("layerName="+layerName+"="+layers[i].name);
  63. // layers[i].layer.setVisible(layers[i].mapType === layerName);
  64. // if(layers[i].mapType === layerName){
  65. // select_text.innerHTML = layers[i].showText;
  66. // OL.CONSTANT.CURRENT_MAP_TYPE = layers[i].mapType.replace("Sate","");
  67. // OL.CONSTANT.CURRENT_MAP_JIUPIAN = layers[i].jiupian;
  68. // }
  69. // }
  70. // }
  71. // element.onmouseover = function(e) {
  72. // this_.showPanel();
  73. // };
  74. // element.onmouseout = function(e) {
  75. // e = e || window.event;
  76. // if (!element.contains(e.toElement)) {
  77. // this_.hidePanel();
  78. // }
  79. // };
  80. ol.control.Control.call(this, {
  81. element: element
  82. // target: options.target
  83. });
  84. };
  85. ol.inherits(ol.control.LayerSwitcher, ol.control.Control);
  86. ol.control.LayerSwitcher.prototype.showPanel = function() {
  87. if (!this.element.lastChild.classList.contains(this.shownClassName)) {
  88. this.element.lastChild.classList.add(this.shownClassName);
  89. }
  90. };
  91. ol.control.LayerSwitcher.prototype.hidePanel = function() {
  92. if (this.element.lastChild.classList.contains(this.shownClassName)) {
  93. this.element.lastChild.classList.remove(this.shownClassName);
  94. }
  95. };
  96. ol.control.LayerSwitcher.prototype.selectLayer = function(layers,layerName) {
  97. for (var i = 0; i < layers.length; i++) {
  98. layers[i].layer.setVisible(layers[i].mapType === layerName);
  99. if(layers[i].mapType === layerName){
  100. this.select_text.innerHTML = layers[i].showText;
  101. OL.CONSTANT.CURRENT_MAP_TYPE = layers[i].mapType.replace("Sate","");
  102. OL.CONSTANT.CURRENT_MAP_JIUPIAN = layers[i].jiupian;
  103. }
  104. }
  105. };
  106. ol.control.LayerSwitcher.prototype.getLayer = function(mapType) {
  107. var source;
  108. if (mapType === 'openStreetMap') {// Open Street Map 地图层
  109. source = new ol.source.XYZ({
  110. url: 'http://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png',
  111. attributions : [
  112. 'Map data &copy; <a href="http://www.openstreetmap.org" target="_blank">OpenStreetMap</a>'
  113. ]
  114. })
  115. // source = new ol.source.OSM({
  116. // attributions : [
  117. // new ol.Attribution({html: 'Map data &copy;2017'}),
  118. // new ol.Attribution({html : '<a href="http://www.openstreetmap.org" target="_blank">OpenStreetMap</a>'})
  119. // ]
  120. // })
  121. } else if (mapType === 'gaodeMap' || mapType === 'gaodeMapSate') {// 高德地图层
  122. var url;
  123. if(mapType == 'gaodeMap'){
  124. url = "http://webrd0{1-4}.is.autonavi.com/appmaptile?size=1&scale=1&style=7&x={x}&y={y}&z={z}";
  125. }else if(mapType == 'gaodeMapSate'){
  126. url = "http://webst0{1-4}.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}";
  127. }
  128. source = new ol.source.XYZ({
  129. url : url,
  130. attributions : [
  131. 'Map data &copy; <a href="http://ditu.amap.com/" target="_blank">高德地图</a>'
  132. ]
  133. })
  134. } else if (mapType === 'googleMap' || mapType === 'googleMapSate') {// google地图层
  135. //var url = 'http://mt{0-4}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}?hl='+locale;
  136. var url = '';
  137. if(mapType == 'googleMap'){
  138. url = 'http://mt{0-3}.google.com/vt/lyrs=m&x={x}&y={y}&z={z}';
  139. }else if(mapType == 'googleMapSate'){
  140. url = 'http://mt{0-3}.google.com/vt/lyrs=y&x={x}&y={y}&z={z}';
  141. }
  142. source = new ol.source.XYZ({
  143. url: url,
  144. attributions : [
  145. 'Map data &copy; <a href="https://maps.google.com/maps" target="_blank">Google Map</a>'
  146. ]
  147. })
  148. } else if (mapType === 'baiduMap' || mapType === 'baiduMapSate') {// 百度地图层
  149. var projection = ol.proj.get("EPSG:3857");
  150. var resolutions = [];
  151. for (var i = 0; i < 19; i++) {
  152. resolutions[i] = Math.pow(2, 18 - i);
  153. }
  154. var tilegrid = new ol.tilegrid.TileGrid({
  155. // origin : [ 0,0 ],
  156. origin : [ -110,16600 ],
  157. resolutions : resolutions
  158. });
  159. var source = new ol.source.TileImage({
  160. projection : projection,
  161. tileGrid : tilegrid,
  162. crossOrigin: 'anonymous', //跨域
  163. tileUrlFunction : function(tileCoord, pixelRatio, proj){
  164. if (!tileCoord) {
  165. return "";
  166. }
  167. var z = tileCoord[0];
  168. var x = tileCoord[1];
  169. var y = tileCoord[2];
  170. if (x < 0) {
  171. x = "M" + (-x);
  172. }
  173. if (y < 0) {
  174. y = "M" + (-y);
  175. }
  176. if(mapType == 'baiduMap'){
  177. return "http://online3.map.bdimg.com/onlinelabel/?qt=tile&x="+x+"&y="+y+"&z="+z+"&styles=pl&udt=20170301&scaler=1&p=1";
  178. }else if(mapType == 'baiduMapSate'){
  179. return "http://shangetu3.map.bdimg.com/it/u=x="+x+";y="+y+";z="+z+";v=009;type=sate&fm=46&udt=20170301";
  180. }
  181. },
  182. attributions : [
  183. 'Map data &copy; <a href="http://map.baidu.com" target="_blank">Baidu Map</a>'
  184. ]
  185. });
  186. }
  187. var layer = new ol.layer.Tile({
  188. visible: false,//不可见
  189. source : source
  190. });
  191. return layer;
  192. };