typhoon.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. /**
  2. * 本地数据台风功能 typhoon
  3. * Created by Administrator on 2017/10/20.
  4. */
  5. define([], function (_myLayerActions) {
  6. var typhoon = {
  7. layers: [],
  8. radiusLayers: [], //大风半径所在图层
  9. data: null,
  10. markerIds: [],
  11. markerDatas: [],
  12. popup:null,
  13. getTyphIndex: function (callback) { //台风列表
  14. meteo.c.http.httpFunction(meteo.c.http.typhIndex, null, null, function (json) {
  15. typhoon.data = [];
  16. for (var i = 0; i < json.length; i++) {
  17. if (json[i].cccc == 'BABJ')
  18. typhoon.data.push(json[i]);
  19. }
  20. // typhoon.data = json;
  21. typhoon.showTyphList(typhoon.data);
  22. callback ? callback() : null;
  23. }, function (error) {
  24. })
  25. },
  26. showTyphList: function (json) { //填充台风列表
  27. var content = '';
  28. for (var i = 0; i < json.length; i++) {
  29. content += " <li class='meteo-twoLi meteo-lastLi'>" +
  30. "<a href='javascript:;' id='meteo-typhoon-item" + i + "' class='meteo-twoBtn meteo-lastBtn meteo-typh-item'"
  31. + " onclick='meteo.f.typhoon.clickTyphoonList(" + i + ")'>";
  32. // content += typhoon.getId(adata.id) + " " + adata.cname + " " + adata.ccc;
  33. var name = json[i].cname ? json[i].cname : json[i].ename;
  34. content += json[i].id1 + " " + name + " " + json[i].cccc;
  35. content += "</a></li>";
  36. }
  37. $('#meteo-list-typh').html(content);
  38. },
  39. showTyphoon: function (index) {
  40. var data = typhoon.data[index].data;
  41. if (data) {
  42. var layerId = meteo.c.map.createLayer();
  43. var layer = map2DViewer.groups[layerId];
  44. typhoon.radiusLayers[index] = meteo.c.map.createLayer();
  45. var hLatlngs = []; //台风历史路径点的位置集合(用来绘制台风路径
  46. //1.遍历所有点,找到预报第一个点的编号
  47. var count = 0;
  48. for (var i = 0; i < data.length; i++) {
  49. if (data[i].vti != 0) {
  50. break;
  51. }
  52. count = i;
  53. }
  54. //1.绘制台风的历史路径点
  55. for (var i = 0; i < count - 1; i++) {
  56. var point = data[i];
  57. // var latlng = [point.clat, point.clng];
  58. var latlng = [point.clng, point.clat];
  59. var url = typhoon.getIcon(point.cws);
  60. hLatlngs.push(latlng);
  61. // var icon = L.icon({
  62. // iconUrl: url,
  63. // iconSize: [16, 16],
  64. // iconAnchor: [8, 8],
  65. // })
  66. // L.marker(latlng, {
  67. // icon: icon,
  68. // typhIndex: index,
  69. // pointIndex: i
  70. // }).addTo(layer).on('click', function (e) {
  71. // typhoon.showTyphPopup(e);
  72. // });
  73. // var content = typhoon.getPopup();
  74. var markerId = meteo.c.map.addMarker('', url, 14, 0, '', point.clat, point.clng, layerId);
  75. var marker = map2DViewer.markers[markerId];
  76. map23DData.markers[markerId].typhIndex = index;
  77. map23DData.markers[markerId].pointIndex = i;
  78. marker.on('click', function (e) {
  79. typhoon.showTyphPopup(e);
  80. })
  81. }
  82. //2.绘制台风当前位置
  83. //2.1 绘制位置点
  84. var point = data[count];
  85. // var latlng = [point.clat, point.clng];
  86. var latlng = [point.clng, point.clat];
  87. // var icon;
  88. // if (typhoon.data[index].cccc == 'BABJ') {
  89. // icon = L.icon({
  90. // iconUrl: meteo.c.http.markerUrl + 'typhoon/typhoon.png',
  91. // iconSize: [30, 30],
  92. // iconAnchor: [15, 15],
  93. // })
  94. // } else {
  95. // icon = L.icon({
  96. // iconUrl: typhoon.getIcon(point.cws),
  97. // iconSize: [16, 16],
  98. // iconAnchor: [8, 8],
  99. // })
  100. // }
  101. hLatlngs.push(latlng);
  102. // L.marker(latlng, {
  103. // icon: icon,
  104. // typhIndex: index,
  105. // pointIndex: count
  106. // }).addTo(layer).on('click', function (e) {
  107. // typhoon.showTyphPopup(e);
  108. // });
  109. var markerId1 = meteo.c.map.addMarker('', meteo.c.http.markerUrl + 'typhoon/typhoon.png', 32, 0, '',
  110. point.clat, point.clng, layerId);
  111. var marker1 = map2DViewer.markers[markerId1];
  112. map23DData.markers[markerId1].typhIndex = index;
  113. map23DData.markers[markerId1].pointIndex = count;
  114. marker1.on('click', function (e) {
  115. typhoon.showTyphPopup(e);
  116. })
  117. //移动到当前位置点
  118. map23DControl.setView({
  119. center: {
  120. lat: point.clat,
  121. lng: point.clng,
  122. },
  123. zoom: 6,
  124. tilt: 0
  125. })
  126. //2.2 标台风名称
  127. var color = typhoon.getTyphoonColor(typhoon.data[index].cccc);
  128. if (point.ename == "TD") name = '热带低压';//标热带低压
  129. var name = point.cname ? point.cname : point.ename;
  130. if (name)
  131. meteo.c.map.addText(name, name, 16, color, 1, hLatlngs[0][1], hLatlngs[0][0],
  132. layerId, true, -3, -3);
  133. //2.3 绘制风圈
  134. //测试用大风半径
  135. // point.r30 = [{wd: 45, radius: 300}, {wd: 135, radius: 280},
  136. // {wd: 225, radius: 250}, {wd: 315, radius: 370}];
  137. // point.r50 = [{wd: 45, radius: 200}, {wd: 135, radius: 180},
  138. // {wd: 225, radius: 150}, {wd: 315, radius: 270}];
  139. typhoon.drawTyphoonRange(
  140. point.clat, point.clng, point.r30, '#00ff00',typhoon.radiusLayers[index]);
  141. typhoon.drawTyphoonRange(
  142. point.clat, point.clng, point.r50, '#ffff00',typhoon.radiusLayers[index]);
  143. typhoon.drawTyphoonRange(
  144. point.clat, point.clng, point.r70, '#ff0000',typhoon.radiusLayers[index]);
  145. //3.绘制台风的历史路径
  146. if (hLatlngs.length >= 2) {
  147. // L.polyline(hLatlngs, {color: '#4b73f6'}).addTo(layer);
  148. meteo.c.map.addPolyline('', '#4b73f6', 2, false, hLatlngs, layerId, true);
  149. }
  150. // 5.绘制台风预测路径(已消亡台风不绘制)
  151. var nLatlngs = [latlng];
  152. for (var i = count + 1; i < data.length; i++) {
  153. var point = data[i];
  154. // var latlng = [point.clat, point.clng];
  155. var latlng = [point.clng, point.clat];
  156. var url = typhoon.getIcon(point.cws);
  157. nLatlngs.push(latlng);
  158. // var icon = L.icon({
  159. // iconUrl: url,
  160. // iconSize: [16, 16],
  161. // iconAnchor: [8, 8],
  162. // })
  163. // L.marker(latlng, {
  164. // icon: icon,
  165. // typhIndex: index,
  166. // pointIndex: i
  167. // }).addTo(layer).on('click', function (e) {
  168. // typhoon.showTyphFcstPopup(e);
  169. // });
  170. var markerId = meteo.c.map.addMarker('', url, 16, 0, '', point.clat, point.clng, layerId);
  171. var marker = map2DViewer.markers[markerId];
  172. map23DData.markers[markerId].typhIndex = index;
  173. map23DData.markers[markerId].pointIndex = i;
  174. map23DData.markers[markerId].isFcst = true;
  175. marker.on('click', function (e) {
  176. typhoon.showTyphFcstPopup(e);
  177. })
  178. }
  179. if (nLatlngs.length >= 2) {
  180. // L.polyline(nLatlngs, {
  181. // color: color,
  182. // dashArray: '5'
  183. // }).addTo(layer);
  184. meteo.c.map.addPolyline('', color, 2, '5', nLatlngs, layerId, true);
  185. }
  186. //6.加入台风
  187. if (!typhoon.layers[index] || !typhoon.layers[index].tLayer || typhoon.layers[index].isHide) {
  188. meteo.c.map.removeLayer(layerId);
  189. return;
  190. }
  191. if (typhoon.layers[index].tLayer) {
  192. if (typhoon.layers[index].cLayer) {
  193. meteo.c.map.removeLayer(typhoon.layers[index].cLayer);
  194. }
  195. typhoon.layers[index].cLayer = layerId;
  196. } else {
  197. meteo.c.map.removeLayer(layerId);
  198. }
  199. }
  200. },
  201. getIcon: function (ws) { //根据台风中心风速更改台风marker图标
  202. var url = ws >= 51.0 ? 'point_red.png' :
  203. ws >= 41.5 ? 'point_purple.png' :
  204. ws >= 32.7 ? 'point_orange.png' :
  205. ws >= 24.5 ? 'point_yellow.png' :
  206. ws >= 17.2 ? 'point_blue.png' :
  207. 'point_green.png';
  208. url = meteo.c.http.markerUrl + 'typhoon/' + url;
  209. return url;
  210. },
  211. drawTyphoonRange: function (lat, lng, rValues, color,layer) { //台风影响范围
  212. if (rValues != null) {
  213. var circle;
  214. if (!rValues.length) {
  215. // circle = L.circle([lat, lng], {radius: rValues * 1000, color: color});
  216. circle = meteo.c.map.addCircle('', rValues * 1000, color, '', lat, lng, layer);
  217. } else if (rValues.length == 4) { //不规则风圈
  218. var radiusPoint = [];
  219. for (var i = rValues.length - 1; i >= 0; i--) {
  220. var wd = rValues[i].wd < 90 ? 45 :
  221. rValues[i].wd < 180 ? 135 :
  222. rValues[i].wd < 270 ? 225 :
  223. 315;
  224. wd = 90 - wd;
  225. var deltaDegree = 1.0; //间隔的角度
  226. var sDegree = wd - 45.0; //开始的角度
  227. var eDegree = wd + 45.0; //结束的角度
  228. var num = Math.round((eDegree - sDegree) / deltaDegree);
  229. var resR = (rValues[i].radius * 1.0) / 110.0; //todo:目前认为1经纬度相当于110公里!
  230. for (var j = 0; j < num; j++) {
  231. radiusPoint.push([lat + Math.sin((sDegree + j * deltaDegree) * Math.PI / 180.0) * resR,
  232. lng + Math.cos((sDegree + j * deltaDegree) * Math.PI / 180.0) * resR]);
  233. }
  234. }
  235. if (radiusPoint.length >= 2) {
  236. // circle = L.polygon(radiusPoint, {color: color});
  237. circle = meteo.c.map.addPolygon('', color, '', radiusPoint, '', layer)
  238. }
  239. }
  240. return circle;
  241. }
  242. },
  243. getTyphoonColor: function (ccc) { //传入观测站,得到台风预测路径颜色
  244. switch (ccc) {
  245. case "BABJ":
  246. return '#ff0000';
  247. case "日本":
  248. return '#00ff00';
  249. // case "美国":
  250. // break;
  251. // case "欧洲":
  252. // break;
  253. // case "韩国":
  254. // break;
  255. // case "":
  256. // break;
  257. }
  258. return '#4b73f6';
  259. },
  260. //显示台风数据
  261. showTyphPopup: function (e) {
  262. var marker = map23DData.markers[e.target.guid];
  263. var ti = marker.typhIndex;
  264. var pi = marker.pointIndex;
  265. var data = typhoon.data[ti];
  266. var title = data.cname ? data.cname : data.ename;
  267. var cccc = data.cccc;
  268. data = data.data[pi];
  269. var html = "<div class='popup_html'>"
  270. + "<div class='popup-lt'></div>"
  271. + "<div class='popup-lb'></div>"
  272. + "<div class='popup-rt'></div>"
  273. + "<div class='popup-rb'></div>"
  274. + "<div class='popup-ct'>"
  275. + "<div class='meteo-menu-top meteo-menu-top-airport'>"
  276. + "<h3 class='meteo-title meteo-title-airport'>" + title + "</h3>"
  277. + "</div>"
  278. + "</div>"
  279. + "<div class='popup-cb' style='padding-bottom:20px;'>"
  280. + "<div class='meteo-popup-typhoon-warp content_scroll'>"
  281. + "<ul class='meteo-popup-typhoonUl'>"
  282. // + "<li><span>发布:</span><span>" + cccc + "</span></li>"
  283. + "<li class='meteo-popup-airport-li'><span>观测时间:</span><span>" + meteo.c.process.setData(data.odate, "") + "</span></li>"
  284. + "<li class='meteo-popup-airport-li'><span>中心位置:</span><span>" + meteo.c.process.setLatlng(data.clat, data.clng) + "</span></li>"
  285. + "<li class='meteo-popup-airport-li'><span>最大风速:</span><span>" + meteo.c.process.setWs(data.cws) + "</span></li>"
  286. + "<li class='meteo-popup-airport-li'><span>中心气压:</span><span>" + meteo.c.process.setPr(data.cpress) + "</span></li>"
  287. + "<li class='meteo-popup-airport-li'><span>移动速度:</span><span>" + meteo.c.process.setWs(data.pastWS) + "</span></li>"
  288. + "<li class='meteo-popup-airport-li'><span>移动方向:</span><span>" + meteo.c.process.setWd(data.pastWd) + "</span></li>"
  289. + "<li class='meteo-popup-airport-li'><span>七级风圈半径:</span><span>" + meteo.c.process.setdistance(data.r30) + "</span></li>"
  290. + "<li class='meteo-popup-airport-li'><span>十级风圈半径:</span><span>" + meteo.c.process.setdistance(data.r50) + "</span></li>"
  291. + "<li class='meteo-popup-airport-li'><span>十二级风圈半径:</span><span>" + meteo.c.process.setdistance(data.r70) + "</span></li>"
  292. + "</ul>"
  293. + "</div>";
  294. +"</div>";
  295. +"</div>";
  296. typhoon.popup = L.popup().setLatLng(e.latlng).setContent(html);
  297. typhoon.popup.openOn(map2DViewer.map);
  298. // meteo.c.map.clearLayer(fqlayerid);
  299. if(typhoon.radiusLayers[ti]){
  300. meteo.c.map.removeLayer(typhoon.radiusLayers[ti]);
  301. typhoon.radiusLayers[ti] = meteo.c.map.createLayer();
  302. }
  303. typhoon.drawTyphoonRange(
  304. data.clat, data.clng, data.r30, '#00ff00',typhoon.radiusLayers[ti]);
  305. typhoon.drawTyphoonRange(
  306. data.clat, data.clng, data.r50, '#ffff00',typhoon.radiusLayers[ti]);
  307. typhoon.drawTyphoonRange(
  308. data.clat, data.clng, data.r70, '#ff0000',typhoon.radiusLayers[ti]);
  309. },
  310. //预报点数据弹窗
  311. showTyphFcstPopup: function (e) {
  312. var marker = map23DData.markers[e.target.guid];
  313. var ti = marker.typhIndex;
  314. var pi = marker.pointIndex;
  315. var data = typhoon.data[ti];
  316. var title = data.cname ? data.cname : data.ename;
  317. var cccc = data.cccc;
  318. data = data.data[pi];
  319. var html = "<div class='popup_html'>"
  320. + "<div class='popup-lt'></div>"
  321. + "<div class='popup-lb'></div>"
  322. + "<div class='popup-rt'></div>"
  323. + "<div class='popup-rb'></div>"
  324. + "<div class='popup-ct'>"
  325. + "<div class='meteo-menu-top meteo-menu-top-airport'>"
  326. + "<h3 class='meteo-title meteo-title-airport'>" + title + "</h3>"
  327. + "</div>"
  328. + "</div>"
  329. + "<div class='popup-cb' style='padding-bottom:20px;'>"
  330. + "<div class='meteo-popup-typhoon-warp content_scroll'>"
  331. + "<ul class='meteo-popup-typhoonUl'>"
  332. // + "<li><span>发布:</span><span>" + cccc + "</span></li>"
  333. + "<li class='meteo-popup-airport-li'><span>预报时间:</span><span>" + data.foreDate + "</span></li>"
  334. + "<li class='meteo-popup-airport-li'><span>中心位置:</span><span>" + meteo.c.process.setLatlng(data.clat, data.clng) + "</span></li>"
  335. + "<li class='meteo-popup-airport-li'><span>最大风速:</span><span>" + meteo.c.process.setWs(data.cws) + "</span></li>"
  336. + "<li class='meteo-popup-airport-li'><span>中心气压:</span><span>" + meteo.c.process.setPr(data.cpress) + "</span></li>"
  337. + "<li class='meteo-popup-airport-li'><span>移动速度:</span><span>" + meteo.c.process.setWs(data.pastWs) + "</span></li>"
  338. + "<li class='meteo-popup-airport-li'><span>移动方向:</span><span>" + meteo.c.process.setWd(data.pastWd) + "</span></li>"
  339. + "<li class='meteo-popup-airport-li'><span>七级风圈半径:</span><span>" + meteo.c.process.setdistance(data.r30) + "</span></li>"
  340. + "<li class='meteo-popup-airport-li'><span>十级风圈半径:</span><span>" + meteo.c.process.setdistance(data.r50) + "</span></li>"
  341. + "<li class='meteo-popup-airport-li'><span>十二级风圈半径:</span><span>" + meteo.c.process.setdistance(data.r70) + "</span></li>"
  342. + "</ul>"
  343. + "</div>";
  344. +"</div>";
  345. +"</div>";
  346. typhoon.popup = L.popup().setLatLng(e.latlng).setContent(html);
  347. typhoon.popup.openOn(map2DViewer.map);
  348. },
  349. showTyphPopup3d: function (options) { //显示台风数据
  350. var marker = map23DData.markers[options.feature.name];
  351. var ti = marker.typhIndex;
  352. var pi = marker.pointIndex;
  353. if ((ti != 0 && !ti) || (pi != 0 && !pi)) return;
  354. var data = typhoon.data[ti];
  355. var title = data.cname ? data.cname : data.ename;
  356. var cccc = data.cccc;
  357. data = data.data[pi];
  358. var html = "<div class='popup_html TD'>"
  359. + "<div class='popup-lt'></div>"
  360. + "<div class='popup-lb'></div>"
  361. + "<div class='popup-rt'></div>"
  362. + "<div class='popup-rb'></div>"
  363. + "<div class='popup-ct'>"
  364. + "<div class='meteo-menu-top meteo-menu-top-airport'>"
  365. + "<h3 class='meteo-title meteo-title-airport'>" + title + "</h3>"
  366. + "</div>"
  367. + "</div>"
  368. + "<div class='popup-cb' style='padding-bottom:20px;'>"
  369. + "<div class='meteo-popup-typhoon-warp content_scroll'>"
  370. + "<ul class='meteo-popup-typhoonUl'>"
  371. // + "<li><span>发布:</span><span>" + cccc + "</span></li>"
  372. + "<li class='meteo-popup-airport-li'><span>观测时间:</span><span>" + meteo.c.process.setData(data.odate, "") + "</span></li>"
  373. + "<li class='meteo-popup-airport-li'><span>中心位置:</span><span>" + meteo.c.process.setLatlng(data.clat, data.clng) + "</span></li>"
  374. + "<li class='meteo-popup-airport-li'><span>最大风速:</span><span>" + meteo.c.process.setWs(data.cws) + "</span></li>"
  375. + "<li class='meteo-popup-airport-li'><span>中心气压:</span><span>" + meteo.c.process.setPr(data.cpress) + "</span></li>"
  376. + "<li class='meteo-popup-airport-li'><span>移动速度:</span><span>" + meteo.c.process.setWs(data.pastWS) + "</span></li>"
  377. + "<li class='meteo-popup-airport-li'><span>移动方向:</span><span>" + meteo.c.process.setWd(data.pastWd) + "</span></li>"
  378. + "<li class='meteo-popup-airport-li'><span>七级风圈半径:</span><span>" + meteo.c.process.setdistance(data.r30) + "</span></li>"
  379. + "<li class='meteo-popup-airport-li'><span>十级风圈半径:</span><span>" + meteo.c.process.setdistance(data.r50) + "</span></li>"
  380. + "<li class='meteo-popup-airport-li'><span>十二级风圈半径:</span><span>" + meteo.c.process.setdistance(data.r70) + "</span></li>"
  381. + "</ul>"
  382. + "</div>";
  383. +"</div>";
  384. +"</div>";
  385. map3DViewer.showPopup({
  386. x: options.evt.X,
  387. y: options.evt.Y,
  388. width: 150,//容器宽
  389. height: 200,//容器高
  390. content: html //冒泡窗内容
  391. })
  392. },
  393. showTyphFcstPopup3d: function (options) { //预报点数据弹窗
  394. var marker = map23DData.markers[options.feature.name];
  395. var ti = marker.typhIndex;
  396. var pi = marker.pointIndex;
  397. if ((ti != 0 && !ti) || (pi != 0 && !pi)) return;
  398. var data = typhoon.data[ti];
  399. var title = data.cname ? data.cname : data.ename;
  400. var cccc = data.cccc;
  401. data = data.data[pi];
  402. var html = "<div class='popup_html TD'>"
  403. + "<div class='popup-lt'></div>"
  404. + "<div class='popup-lb'></div>"
  405. + "<div class='popup-rt'></div>"
  406. + "<div class='popup-rb'></div>"
  407. + "<div class='popup-ct'>"
  408. + "<div class='meteo-menu-top meteo-menu-top-airport'>"
  409. + "<h3 class='meteo-title meteo-title-airport'>" + title + "</h3>"
  410. + "</div>"
  411. + "</div>"
  412. + "<div class='popup-cb' style='padding-bottom:20px;'>"
  413. + "<div class='meteo-popup-typhoon-warp content_scroll'>"
  414. + "<ul class='meteo-popup-typhoonUl'>"
  415. // + "<li><span>发布:</span><span>" + cccc + "</span></li>"
  416. + "<li class='meteo-popup-airport-li'><span>预报时间:</span><span>" + meteo.c.process.setData(data.fcstdate) + "</span></li>"
  417. + "<li class='meteo-popup-airport-li'><span>中心位置:</span><span>" + meteo.c.process.setLatlng(data.clat, data.clng) + "</span></li>"
  418. + "<li class='meteo-popup-airport-li'><span>最大风速:</span><span>" + meteo.c.process.setWs(data.cws) + "</span></li>"
  419. + "<li class='meteo-popup-airport-li'><span>中心气压:</span><span>" + meteo.c.process.setPr(data.cpress) + "</span></li>"
  420. + "<li class='meteo-popup-airport-li'><span>移动速度:</span><span>" + meteo.c.process.setWs(data.pastWs) + "</span></li>"
  421. + "<li class='meteo-popup-airport-li'><span>移动方向:</span><span>" + meteo.c.process.setWd(data.pastWd) + "</span></li>"
  422. + "<li class='meteo-popup-airport-li'><span>七级风圈半径:</span><span>" + meteo.c.process.setdistance(data.r30) + "</span></li>"
  423. + "<li class='meteo-popup-airport-li'><span>十级风圈半径:</span><span>" + meteo.c.process.setdistance(data.r50) + "</span></li>"
  424. + "<li class='meteo-popup-airport-li'><span>十二级风圈半径:</span><span>" + meteo.c.process.setdistance(data.r70) + "</span></li>"
  425. + "</ul>"
  426. + "</div>";
  427. +"</div>";
  428. +"</div>";
  429. map3DViewer.showPopup({
  430. x: options.evt.X,
  431. y: options.evt.Y,
  432. width: 150,//容器宽
  433. height: 200,//容器高
  434. content: html //冒泡窗内容
  435. })
  436. },
  437. clickTyphoonList: function (index) { //点击台风数据
  438. if (typhoon.layers[index] != null) {
  439. typhoon.removeTyphoon(index);
  440. } else {
  441. typhoon.createTyphoon(index);
  442. }
  443. },
  444. getTyphInfo: function (index) { //获取台风数据,并且在获取数据后绘制台风
  445. var params = {
  446. id: typhoon.data[index].id1,
  447. cccc: typhoon.data[index].cccc
  448. };
  449. meteo.c.http.httpFunction(meteo.c.http.typhInfo, null, params, function (json) {
  450. typhoon.data[index].data = json;
  451. typhoon.showTyphoon(index);
  452. })
  453. },
  454. createTyphoon: function (index) { //创建台风所需图层,同时去获取台风数据
  455. if(ONEMAP.M.myLayers.checkLength() >= map23DConfig.layerMaxLength) {
  456. ONEMAP.C.publisher.publish({ type: 'warning', message: '图层数量已达上限' }, 'noteBar::add');
  457. return;
  458. }
  459. $("#meteo-typhoon-item" + index).parent().addClass('current'); //选中台风按钮
  460. typhoon.layers[index] = {
  461. tLayer: meteo.c.map.createLayer(),
  462. cLayer: null,
  463. }
  464. //----------------图层管理-------------------
  465. var name = typhoon.data[index].cname ?
  466. typhoon.data[index].cname :
  467. typhoon.data[index].ename;
  468. var options = {
  469. action: "add",
  470. // mod: "qixiang",
  471. DOM: {
  472. guid: typhoon.layers[index].tLayer,
  473. type: "group",
  474. name: name + " " + typhoon.data[index].cccc,
  475. },
  476. }
  477. var guid = ONEMAP.M.myLayers.myLayerControl(options);
  478. ONEMAP.C.publisher.subscribe(function (option) {
  479. switch (option.action) {
  480. case 'remove':
  481. typhoon.removeTyphoon(index);
  482. break;
  483. case 'opacity':
  484. if (option.options.opacity) {
  485. typhoon.show(index);
  486. } else {
  487. typhoon.hide(index);
  488. }
  489. break;
  490. }
  491. }, guid);
  492. //-------------------------------------
  493. typhoon.getTyphInfo(index); //获取台风数据
  494. },
  495. removeTyphoon: function (index) { //删除指定台风,
  496. if (typhoon.layers[index]) {
  497. $("#meteo-typhoon-item" + index).parent().removeClass('current'); //取消台风按钮的选中
  498. //---------------------图层管理----------------------
  499. var options = {
  500. action: "remove",
  501. DOMid: typhoon.layers[index].tLayer,
  502. }
  503. ONEMAP.M.myLayers.myLayerControl(options);
  504. meteo.c.map.removeLayer(typhoon.layers[index].tLayer);
  505. meteo.c.map.removeLayer(typhoon.layers[index].cLayer);
  506. typhoon.layers[index] = null;
  507. meteo.c.map.removeLayer(typhoon.radiusLayers[index]); //风圈图层
  508. typhoon.radiusLayers[index] = null;
  509. //------------------------取消弹窗--------------------------
  510. if (typhoon.popup) {
  511. typhoon.popup.remove();
  512. typhoon.popup = null;
  513. }
  514. }
  515. },
  516. hide: function (index) { //台风隐藏
  517. if (typhoon.layers[index]) {console.log(typhoon.radiusLayers[index])
  518. meteo.c.map.removeLayer(typhoon.layers[index].cLayer);
  519. meteo.c.map.removeLayer(typhoon.radiusLayers[index]); //风圈图层
  520. // typhoon.radiusLayers[index] = null;
  521. //------------------------取消弹窗--------------------------
  522. if (typhoon.popup) {
  523. typhoon.popup.remove();
  524. typhoon.popup = null;
  525. }
  526. }
  527. },
  528. show: function (index) { //台风显示
  529. typhoon.showTyphoon(index);
  530. },
  531. open: function () { //开启台风功能
  532. },
  533. close: function () { //关闭台风功能
  534. var isOpen = false;
  535. for (var i = 0; i < typhoon.layers.length; i++) {
  536. if (typhoon.layers[i] != null) {
  537. typhoon.removeTyphoon(i);
  538. isOpen = true;
  539. }
  540. }
  541. return isOpen;
  542. },
  543. init: function () {
  544. $('#meteo-bt-controld').click(function () {
  545. if (!typhoon.data) {
  546. typhoon.getTyphIndex();
  547. }
  548. });
  549. $("#meteo-bt-sc-typh").click(function () {
  550. //如果有台风,则全部删除
  551. var isOpen = typhoon.close();
  552. if (isOpen) return false;
  553. typhoon.getTyphIndex(function () {
  554. var count = 0;
  555. for (var i = 0; i < typhoon.data.length; i++) {
  556. if (!typhoon.data[i].finish) {
  557. // if (i == 5) {
  558. typhoon.clickTyphoonList(i);
  559. count = 1;
  560. }
  561. }
  562. if (count == 0) {
  563. alert('没有未消亡台风');
  564. }
  565. })
  566. return false;
  567. });
  568. PubSub.subscribe('map3D.featureClick', function (msg, options) {
  569. markerData = map23DData.markers[options.feature.name];
  570. if (markerData.isFcst) {
  571. typhoon.showTyphFcstPopup3d(options);
  572. } else {
  573. typhoon.showTyphPopup3d(options)
  574. }
  575. });
  576. }
  577. }
  578. meteo.f.typhoon = typhoon;
  579. return meteo.f.typhoon;
  580. })