wave.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. /**
  2. * 海浪 浪高
  3. */
  4. define(['meteoDir/other/smooth'], function (smooth) {
  5. var wave = {
  6. id: 'wave',
  7. title: '海浪',
  8. legend: 'images/meteo/legend/wave.png',
  9. slat: null, //开始lat
  10. slng: null, //开始lng
  11. elat: null, //结束lat
  12. elng: null, //结束lng
  13. delta: null, //每个数据地理间隔
  14. rowNum: null, //lng跨度
  15. colNum: null, //lat跨度
  16. wd: null, //流向数组
  17. image: null, //图标所在图片
  18. interval: 1, //绘制间隔(控制疏密程度)
  19. timeOutId: null,
  20. elem: 'HS',
  21. layer: null, //为了方便图层控制,使用了一个对象来控制多个图层
  22. isInit: false,
  23. isoData: null,
  24. data: null,
  25. isHide: false,
  26. getData: function () {
  27. var dateStr = meteo.c.time.getTime();
  28. var vti = meteo.c.time.getVti();
  29. var params = {
  30. elem: wave.elem,
  31. level: '9999',
  32. vti: vti,
  33. dateStr: dateStr,
  34. };
  35. var params2 = {
  36. vti: vti,
  37. dateStr: dateStr,
  38. };
  39. // meteo.c.http.httpFunction(meteo.c.http.oceanD, null, params2, function (json) { //海浪方向
  40. // wave.slat = json.slat;
  41. // wave.slng = json.slng;
  42. // wave.elat = json.elat;
  43. // wave.elng = json.elng;
  44. // wave.delta = json.delta;
  45. // wave.rowNum = json.rowNum;
  46. // wave.colNum = json.colNum;
  47. // wave.wd = json.vals;
  48. meteo.c.http.httpFunction(meteo.c.http.oceanCI, null, params, function (json) {
  49. meteo.c.title.updateTitle(wave.id, meteo.c.process.setTitleTime(json.odate, json.vti, wave.title, ''));
  50. $('#meteo-video-query-startDate').val(json.odate);
  51. json = JSON.parse(json.data);
  52. wave.data = json;
  53. wave.showWave(json);
  54. }, function () {
  55. // ONEMAP.C.publisher.publish({ type: 'warning', message: '浪高暂无当前时次/层次数据' }, 'noteBar::add');
  56. // meteo.c.title.updateTitle(wave.id, '浪高暂无当前时次/层次数据');
  57. });
  58. // }, function () {
  59. // })
  60. params.vti = parseInt(vti) + 3;
  61. meteo.c.http.httpFunction(meteo.c.http.oceanCI, null, params, function (json) {
  62. json = json.data;
  63. json = JSON.parse(json);
  64. wave.loadImage(json);
  65. }, function () {
  66. })
  67. // meteo.c.http.httpFunction(meteo.c.http.oceanC, null, params, function (json) {
  68. // wave.isoData = json['000_HS_9999'];
  69. // var params2 = {};
  70. //
  71. // })
  72. },
  73. showWave: function (data) {
  74. var images = [];
  75. var latI = (data.elat - data.slat) / data.row;
  76. var lngI = (data.elng - data.slng) / data.col;
  77. for (var i = 0; i < data.files.length; i++) {
  78. var value = data.files[i];
  79. if (value) {
  80. var str = value.split("\.")[0];
  81. str = str.split("_");
  82. var x = str[0];
  83. var y = str[1];
  84. var slat = data.slat + x * latI;
  85. var slng = data.slng + y * lngI;
  86. var elat = slat + latI;
  87. var elng = slng + lngI;
  88. elat = elat > data.elat ? data.elat : elat;
  89. elng = elng > data.elng ? data.elat : elng;
  90. images.push(meteo.c.map.addImage(data.url + value + '.mkt', slat, slng, elat, elng));
  91. // L.imageOverlay(
  92. // data.url + value + '.mkt',
  93. // // "scripts/meteo/test/wyl/WYL_2017122320_000_TT_0000_" + x + "_" + y + ".png.mkt",
  94. // L.latLngBounds(L.latLng(slat, slng), L.latLng(elat, elng))
  95. // ).addTo(layer);
  96. }
  97. }
  98. if (!wave.layer|| !wave.layer.tLayer || wave.isHide) {
  99. for (var i = 0; i < images.length; i++) {
  100. meteo.c.map.removeImage(images[i]);
  101. }
  102. } else {
  103. if (wave.layer.images) {
  104. wave.removeImage();
  105. }
  106. wave.layer.images = images;
  107. }
  108. // setTimeout(function () {
  109. //
  110. // }, 300);
  111. // wave.showWaveWD();
  112. },
  113. loadImage:function (data) { //预先加载图片
  114. for (var key in data.files) {
  115. var value = data.files[key];
  116. if (value) {
  117. var url = data.url + value + '.mkt';
  118. var img = $('<img />').attr('src', url);
  119. img = null;
  120. }
  121. }
  122. },
  123. showWaveWD: function () {
  124. if (!wave.layer) {
  125. return;
  126. }
  127. //计算当前屏幕内显示的索引
  128. var zoom = meteo.c.map.getZoom();
  129. var interval =
  130. zoom < 4 ? 10 :
  131. zoom < 5 ? 8 :
  132. zoom < 6 ? 6 :
  133. zoom < 7 ? 4 :
  134. zoom < 8 ? 2 :
  135. 1;
  136. var se = meteo.c.map.getBounds();
  137. var layerId = meteo.c.map.createLayer();
  138. var layer = map2DViewer.groups[layerId];
  139. //计算流向绘制屏幕内的初始索引
  140. var istart = (wave.elat - se[2]) / wave.delta >> 0;
  141. var jstart = (se[1] - wave.slng) / wave.delta >> 0;
  142. if (istart < 0) istart = 0;
  143. if (jstart < 0) jstart = 0;
  144. //计算流向绘制屏幕内的最大索引
  145. var row = Math.abs(se[0] - wave.elat) / wave.delta + 1;
  146. // var row = Math.abs(se[2] - wave.slat) / wave.delta + 1;
  147. var col = Math.abs(se[3] - wave.slng) / wave.delta + 1;
  148. if (row > wave.rowNum) row = wave.rowNum;
  149. if (col > wave.colNum) col = wave.colNum;
  150. for (var i = istart; i < row; i += interval) {
  151. for (var j = jstart; j < col; j += interval) {
  152. var lat = wave.elat - i * wave.delta;
  153. var lng = wave.slng + j * wave.delta;
  154. var wd = wave.wd[i][j];
  155. // if (wd == 0 || wd == -9999) continue;
  156. // if (wd == -9999) continue;
  157. if (wd < 0) continue;
  158. var icon = wave.getIcon(wd, 30);
  159. L.marker([lat, lng], {icon: icon}).addTo(layer);
  160. // meteo.c.map.addText('', i + "*" + j, 16, "#000000", 1, lat, lng, layerId); //打印数据
  161. }
  162. }
  163. if (!wave.layer || !wave.layer.tLayer || wave.isHide) {
  164. meteo.c.map.removeLayer(layerId);
  165. return;
  166. }
  167. if (wave.layer.cLayer != null) {
  168. meteo.c.map.removeLayer(wave.layer.cLayer);
  169. }
  170. wave.layer.cLayer = layerId;
  171. //判断延时是否取消
  172. if (wave.timeOutId) wave.timeOutId = null;
  173. },
  174. getIcon: function (wd, size) { //获得图标
  175. size = size;
  176. var width = size * 1.2;
  177. var a = size * 0.6;
  178. var b = size / 2;
  179. var canvas = document.createElement('canvas');
  180. canvas.width = width;
  181. canvas.height = width;
  182. if (canvas.getContext) {
  183. //获取对应的CanvasRenderingContext2D对象(画笔)
  184. var ctx = canvas.getContext("2d");
  185. ctx.save();
  186. ctx.translate(a, a);
  187. ctx.rotate(wd * Math.PI / 180);
  188. // ctx.rotate(0.5 * Math.PI);
  189. // ctx.rotate(wd);
  190. ctx.translate(-a, -a);
  191. ctx.drawImage(wave.image, a - b / 2, a - b, b, size);
  192. ctx.restore();
  193. var url = canvas.toDataURL('image/png');
  194. return L.icon({
  195. iconUrl: url,
  196. iconSize: [size, size],
  197. iconAnchor: [size / 2, size / 2],
  198. });
  199. }
  200. return null;
  201. },
  202. create: function () {
  203. wave.layer = {
  204. tLayer: meteo.c.map.createLayer(), //图层控制
  205. // cLayer: null, //等值线图层
  206. images: null, //图片图层列表
  207. }
  208. },
  209. remove: function () {
  210. if (wave.layer) {
  211. meteo.c.map.removeLayer(wave.layer.tLayer);
  212. // meteo.c.map.removeLayer(wave.layer.cLayer);
  213. wave.removeImage();
  214. wave.layer = null;
  215. }
  216. },
  217. removeImage: function () {
  218. if (wave.layer.images) {
  219. for (var i = 0; i < wave.layer.images.length; i++) {
  220. meteo.c.map.removeImage(wave.layer.images[i]);
  221. }
  222. wave.layer.images = null;
  223. }
  224. },
  225. show: function () {
  226. wave.isHide = false;
  227. wave.showWave(wave.data);
  228. },
  229. hide: function () {
  230. wave.isHide = true;
  231. if (wave.layer) {
  232. // meteo.c.map.removeLayer(wave.layer.cLayer);
  233. wave.removeImage();
  234. }
  235. },
  236. open: function () {
  237. if (ONEMAP.M.myLayers.checkLength() >= map23DConfig.layerMaxLength) {
  238. ONEMAP.C.publisher.publish({type: 'warning', message: '图层数量已达上限'}, 'noteBar::add');
  239. return;
  240. }
  241. //-------------创建图层------------------
  242. if (wave.layer) {
  243. wave.remove();
  244. }
  245. wave.create();
  246. //----------------图层管理-------------------
  247. var options = {
  248. action: "add",
  249. // mod: "qixiang",
  250. DOM: {
  251. guid: wave.layer.tLayer,
  252. type: "group",
  253. name: wave.title,
  254. },
  255. }
  256. var guid = ONEMAP.M.myLayers.myLayerControl(options);
  257. ONEMAP.C.publisher.subscribe(function (option) {
  258. switch (option.action) {
  259. case 'remove':
  260. wave.close();
  261. break;
  262. case 'opacity':
  263. if (option.options.opacity) {
  264. wave.show();
  265. } else {
  266. wave.hide();
  267. }
  268. break;
  269. }
  270. }, guid);
  271. //-------------------------------------
  272. $("#meteo-bt-wave").parent().addClass('current');
  273. meteo.c.title.addTitle(wave.id);
  274. meteo.c.legend.addLegend(wave.id, wave.legend);
  275. meteo.c.time.open(true);
  276. wave.isHide = false;
  277. wave.getData();
  278. },
  279. close: function () {
  280. var options = {
  281. action: "remove",
  282. DOMid: wave.layer.tLayer,
  283. }
  284. ONEMAP.M.myLayers.myLayerControl(options);
  285. $("#meteo-bt-wave").parent().removeClass('current');
  286. meteo.c.title.removeTitle(wave.id);
  287. meteo.c.legend.removeLegend(wave.id);
  288. meteo.c.time.close();
  289. wave.remove();
  290. },
  291. onMove: function () {
  292. // if (wave.layer && !wave.isHide && meteo.c.map.mapType == '2d') {
  293. // if (wave.timeOutId) { //如果有未开始的流向绘制,就取消对应任务
  294. // window.clearTimeout(wave.timeOutId);
  295. // }
  296. // wave.timeOutId = window.setTimeout(function () {
  297. // wave.showWaveWD();
  298. // }, 800)
  299. // }
  300. },
  301. update: function () { //用于时间变化时更新数据
  302. if (!wave.layer || wave.isHide) return;
  303. // var option = {
  304. // action: 'update',
  305. // DOMid: wave.layer.tLayer,
  306. // DOM: {
  307. // name: '海浪浪高'
  308. // }
  309. // }
  310. // ONEMAP.M.myLayers.myLayerControl(option);
  311. wave.getData()
  312. },
  313. init: function () {
  314. wave.image = new Image();
  315. wave.image.src = meteo.c.http.myImageUrlJs + "oceanCurrent/red.png";
  316. $('#meteo-bt-wave').click(function () {
  317. if (meteo.f.wave.layer) {
  318. meteo.f.wave.close();
  319. } else {
  320. meteo.f.wave.open();
  321. }
  322. });
  323. }
  324. }
  325. meteo.f.wave = wave;
  326. return meteo.f.wave;
  327. })