toolTuFu.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  1. /**
  2. * [ONEMAP.M.toolTuFu]
  3. * @return {[object]}
  4. */
  5. define(function (tplLayout) {
  6. /**
  7. * 模块数据 用于数据存储和外部调用
  8. * @type {Object}
  9. * 数据存放
  10. */
  11. var modValue = {
  12. lines: [],
  13. canvas: L.canvas(),
  14. tufuNum: ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "I", "S", "T", "U", "V", "W", "X", "Y", "Z"],
  15. handler: null,
  16. zoom: 0
  17. }
  18. /**
  19. * 模块界面样式 例如:宽,高
  20. * @type {Object}
  21. */
  22. var styles = {}
  23. /**
  24. * 模块状态,用于存储模块的状态 例如:收起,关闭
  25. * @type {Object}
  26. */
  27. var status = {
  28. initialized: false
  29. }
  30. /**
  31. * 初始化并订阅事件
  32. * @return {[type]} [description]
  33. */
  34. function init() {
  35. if (!status.initialized) {
  36. buildTuFu();
  37. subscribe();
  38. status.initialized = true;
  39. } else {
  40. //clearSquareGrid();
  41. //status.initialized = false;
  42. }
  43. }
  44. function buildTuFu() {
  45. // getMapNum(39,116,1000000)
  46. //图幅代码
  47. var lon_num, lat_num, lon_offset = -1,
  48. lat_offset = 4,
  49. father_lon_offset = -1,
  50. father_lat_offset = -1,
  51. row_column = 0;
  52. var mErrorInfo;
  53. var father_lon_offset_map = {
  54. "1000000": [6.0, 12.0, 24.0],
  55. "100000": [6.0, 12.0, 24.0],
  56. "250000": [6.0, 12.0, 24.0],
  57. "500000": [6.0, 12.0, 24.0],
  58. "50000": [0.5, 1.0, 2.0],
  59. "25000": [0.25, 0.5, 1.0],
  60. "10000": [0.125, 0.25, 0.5]
  61. };
  62. var father_lat_offset_map = {
  63. "1000000": 4.0,
  64. "100000": 4.0,
  65. "250000": 4.0,
  66. "500000": 4.0,
  67. "50000": 0.333333333333,
  68. "25000": 0.166666666667,
  69. "10000": 0.833333333333
  70. };
  71. var row_column_map = {
  72. "1000000": 12,
  73. "100000": 12,
  74. "250000": 4,
  75. "500000": 2,
  76. "50000": 2,
  77. "25000": 2,
  78. "10000": 2
  79. };
  80. /**
  81. * 计算在100万地图中的经纬度编号
  82. * @param lat
  83. * @param lon
  84. */
  85. function getLatlonNum(lat, lon) {
  86. if (lat >= -60 & lat < 60) {
  87. lon_offset = 6;
  88. } else if ((lat >= 60 & lat < 76) || (lat >= -76 & lat < -60)) {
  89. lon_offset = 12;
  90. } else if ((lat >= 76 & lat < 88) || (lat >= -88 & lat < -76)) {
  91. lon_offset = 24;
  92. } else {
  93. mErrorInfo = "您输入的纬度不在范围内";
  94. return null;
  95. }
  96. //1.计算经度列号
  97. lon_num = JSON.stringify(1 + Math.floor((180 + lon) / lon_offset));
  98. var lat_over_num = Math.floor((lat + 88) / lat_offset);
  99. if (lat >= 0) {
  100. lat_num = JSON.stringify(lat_over_num - 21);
  101. } else {
  102. lat_num = JSON.stringify(22 - lat_over_num);
  103. }
  104. lat_num = addPreZero(2, lat_num)
  105. lon_num = addPreZero(2, lon_num)
  106. return modValue.tufuNum[lat_num - 1] + "-" + lon_num;
  107. }
  108. function addPreZero(wei, num) {
  109. var t = (num + '').length,
  110. s = '';
  111. if (t < wei) {
  112. for (var i = 0; i < wei - t; i++) {
  113. s += '0';
  114. }
  115. return s + num;
  116. } else {
  117. return num.substring(0, wei)
  118. }
  119. }
  120. /**
  121. * 计算在父级地图中的行列排列的编号
  122. * @param lat
  123. * @param lon
  124. * @param scale
  125. */
  126. function getRowColumnNum(lat, lon, scale) {
  127. var father_lon_offsets;
  128. $.each(father_lat_offset_map, function (i, t) {
  129. if (scale == i) {
  130. father_lon_offsets = father_lon_offset_map[i];
  131. if (lat >= -60 & lat < 60) {
  132. father_lon_offset = father_lon_offsets[0];
  133. } else if ((lat >= 60 & lat < 76) | (lat >= -76 & lat < -60)) {
  134. father_lon_offset = father_lon_offsets[1];
  135. } else if ((lat >= 76 & lat < 88) | (lat >= -88 & lat < -76)) {
  136. father_lon_offset = father_lon_offsets[2];
  137. } else {
  138. mErrorInfo = "您输入的纬度不在范围内";
  139. return null;
  140. }
  141. //父级纬度偏差
  142. father_lat_offset = father_lat_offset_map[i];
  143. //父级分成几行几列
  144. row_column = row_column_map[i];
  145. }
  146. })
  147. //3.计算在父级地图中的编号
  148. //行偏差
  149. var row_offset;
  150. var new_lat = (lat + 88);
  151. var latd = new_lat / father_lat_offset;
  152. var latd_int = parseInt(latd);
  153. row_offset = Math.floor((latd - latd_int) * row_column);
  154. //列偏差
  155. var column_offset;
  156. var new_lon = lon + 180;
  157. var lond = new_lon / father_lon_offset;
  158. var lond_int = parseInt(lond);
  159. column_offset = Math.floor((lond - lond_int) * row_column);
  160. //行号
  161. var row = row_column - row_offset;
  162. //列号
  163. var column = column_offset + 1;
  164. //计算旧图幅的尾号
  165. var old_tail = row_column * (row - 1) + column;
  166. old_tail = JSON.stringify(old_tail)
  167. var rowColumnNum = "";
  168. if (scale == 100000) { //10万地图为三位数
  169. rowColumnNum = addPreZero(3, old_tail);
  170. rowColumnNum = "-" + rowColumnNum;
  171. } else if (scale == 250000) { //25万为两位数
  172. rowColumnNum = addPreZero(2, old_tail);
  173. rowColumnNum = "-[" + rowColumnNum + "]"
  174. } else { //其余都是2行2列 为1位数
  175. rowColumnNum = addPreZero(1, old_tail);
  176. rowColumnNum = "-" + modValue.tufuNum[rowColumnNum - 1]
  177. }
  178. return rowColumnNum;
  179. }
  180. modValue.getMapNum = function (lat, lon, scale) {
  181. if (lon >= 360 || lon <= -360) {
  182. lon = lon % 360
  183. }
  184. if (lon > 180) {
  185. lon = lon - 360;
  186. }
  187. if (lon < -180) {
  188. lon = lon + 360;
  189. }
  190. if (lon == 180) {
  191. lon = 179;
  192. }
  193. var latlonNum = getLatlonNum(lat, lon);
  194. var rowColumnNum10 = getRowColumnNum(lat, lon, 100000); //0 父级 1尾号
  195. var rowColumnNum5 = getRowColumnNum(lat, lon, 50000);
  196. var rowColumnNum2 = getRowColumnNum(lat, lon, 25000);
  197. var rowColumnNum1 = getRowColumnNum(lat, lon, 10000);
  198. if (latlonNum == null || rowColumnNum1 == null || rowColumnNum2 == null || rowColumnNum5 == null || rowColumnNum10 == null) {
  199. return null;
  200. }
  201. if (scale == 1000000) {
  202. return latlonNum;
  203. } else if (scale == 100000 | scale == 250000 | scale == 500000) {
  204. return latlonNum + "" + getRowColumnNum(lat, lon, scale);
  205. } else if (scale == 50000) {
  206. return latlonNum + "" + rowColumnNum10 + "" + rowColumnNum5;
  207. } else if (scale == 25000) {
  208. return latlonNum + "" + rowColumnNum10 + "" + rowColumnNum5 + rowColumnNum2;
  209. } else if (scale == 10000) {
  210. return latlonNum + "" + rowColumnNum10 + "" + rowColumnNum5 + rowColumnNum2 + rowColumnNum1;
  211. }
  212. mErrorInfo = "您输入的比例尺不在计算范围内";
  213. return null;
  214. }
  215. var E6 = 10 ^ 6;
  216. var DEG2MIN = 60;
  217. var MIN2SEC = 60;
  218. var DEG2SEC = DEG2MIN * MIN2SEC;
  219. var mMinLat;
  220. var mMaxLat;
  221. var mMinLon;
  222. var mMaxLon;
  223. var offsetX = {
  224. "1000000": 6,
  225. "500000": 3,
  226. "250000": 1.5,
  227. "100000": 0.5,
  228. "50000": 0.25,
  229. "25000": 0.125,
  230. "10000": 0.0625,
  231. }
  232. var offsetY = {
  233. "1000000": 4,
  234. "500000": 2,
  235. "250000": 1,
  236. "100000": 0.3333,
  237. "50000": 0.16666,
  238. "25000": 0.08333,
  239. "10000": 0.0416667,
  240. }
  241. modValue.tf = map23DControl.group({
  242. action: 'add'
  243. })
  244. var arrayPointX = [];
  245. var arrayPointY = [];
  246. modValue.drawSafe = function (bouns, scale) {
  247. var mOffsetX = offsetX[scale];
  248. var mOffsetY = offsetY[scale];
  249. var curOffsetX = mOffsetX;
  250. var curOffsetY = mOffsetY;
  251. if (mOffsetX < 0 || mOffsetY < 0) {
  252. return;
  253. }
  254. mMinLat = bouns._southWest.lat;
  255. mMaxLat = bouns._northEast.lat;
  256. mMinLon = bouns._southWest.lng;
  257. mMaxLon = bouns._northEast.lng;
  258. dMinLat = mMinLat = Math.floor(mMinLat - mMinLat % mOffsetY + mOffsetY);
  259. dMaxLat = mMaxLat = Math.ceil(mMaxLat - mMaxLat % mOffsetY);
  260. //mMinLon = Math.floor(mMinLon - mMinLon % mOffsetX + mOffsetX);
  261. //mMaxLon = Math.ceil(mMaxLon - mMaxLon % mOffsetX);
  262. mMinLon1 = Math.floor(mMinLon / mOffsetX) * mOffsetX; //-60,60
  263. mMaxLon1 = Math.ceil(mMaxLon / mOffsetX) * mOffsetX; //-60,60
  264. var mOffsetX2 = mOffsetX * 2;
  265. mMinLon2 = Math.floor(mMinLon / mOffsetX2) * mOffsetX2 - mOffsetX2; //-78, -60
  266. mMaxLon2 = Math.ceil(mMaxLon / mOffsetX2) * mOffsetX2 + mOffsetX2; //78, -60
  267. var mOffsetX3 = mOffsetX * 4;
  268. mMinLon3 = Math.floor(mMinLon / mOffsetX3) * mOffsetX3 - mOffsetX * 6; // -88, -78,
  269. mMaxLon3 = Math.ceil(mMaxLon / mOffsetX3) * mOffsetX3 + mOffsetX * 6; // 88, 78,
  270. var arrayPoint = [];
  271. returnX(mMinLon1, mMaxLon1, dMinLat, dMaxLat, curOffsetX, -60, 60, curOffsetY, bouns, scale);
  272. returnX(mMinLon2, mMaxLon2, dMinLat, dMaxLat, curOffsetX * 2, 60, 76, curOffsetY, bouns, scale);
  273. returnX(mMinLon3, mMaxLon3, dMinLat, dMaxLat, curOffsetX * 4, 76, 88, curOffsetY, bouns, scale);
  274. returnX(mMinLon2, mMaxLon2, dMinLat, dMaxLat, curOffsetX * 2, -76, -60, curOffsetY, bouns, scale);
  275. returnX(mMinLon3, mMaxLon3, dMinLat, dMaxLat, curOffsetX * 4, -88, -76, curOffsetY, bouns, scale);
  276. }
  277. function returnX(mMinLon, mMaxLon, dMinLat, dMaxLat, offsetx, minlat, maxlat, curOffsetY, bouns, scale) {
  278. if (dMinLat > maxlat || minlat > dMaxLat) {
  279. return;
  280. }
  281. arrayPointX = [];
  282. arrayPointY = [];
  283. for (var y = minlat; y <= maxlat; y += curOffsetY) {
  284. arrayPointY.push(y)
  285. }
  286. for (var x = mMinLon; x <= mMaxLon; x += offsetx) {
  287. arrayPointX.push(x)
  288. }
  289. drawLine(minlat, maxlat, arrayPointX, arrayPointY, bouns, scale, mMinLon, mMaxLon)
  290. }
  291. function drawLine(minlat, maxlat, arrayPointX, arrayPointY, bouns, scale, mMinLon, mMaxLon) {
  292. mMinLat = minlat;
  293. mMaxLat = maxlat;
  294. mMinLon = mMinLon;
  295. mMaxLon = mMaxLon;
  296. dfLon = (mMaxLon - mMinLon) / 4
  297. middleLon = (mMaxLon + mMinLon) / 2
  298. for (var i = 0; i < arrayPointY.length; i++) {
  299. if (map23DData.display.map2D) {
  300. map2DViewer.polyline({
  301. action: 'add',
  302. groupId: modValue.tf,
  303. geojson: {
  304. "type": "Feature",
  305. "properties": {
  306. title: '测试polyline',
  307. color: '#00ffcc',
  308. weight: 1,
  309. opacity: 1,
  310. },
  311. "geometry": {
  312. "coordinates": [
  313. [mMinLon, arrayPointY[i]],
  314. [mMaxLon, arrayPointY[i]]
  315. ]
  316. }
  317. }
  318. })
  319. }
  320. if (map23DData.display.map3D) {
  321. if (arrayPointY[i] >= 0) {
  322. var center = [0, 90]
  323. } else {
  324. var center = [0, -90]
  325. }
  326. var point1cartographic = Cesium.Cartographic.fromCartesian(Cesium.Cartesian3.fromDegrees(center[0], center[1]));
  327. var point2cartographic = Cesium.Cartographic.fromCartesian(Cesium.Cartesian3.fromDegrees(0, arrayPointY[i]));
  328. /**根据经纬度计算出距离**/
  329. var geodesic = new Cesium.EllipsoidGeodesic();
  330. geodesic.setEndPoints(point1cartographic, point2cartographic);
  331. map3DViewer.circle({
  332. action: 'add',
  333. groupId: modValue.tf,
  334. geojson: {
  335. "type": "Feature",
  336. "properties": {
  337. title: '测试圆',
  338. color: '#00ffcc',
  339. weight: 1,
  340. fillColor: '#00ffcc',
  341. opacity: 1,
  342. fillOpacity: 0,
  343. altitudeMode: 0, //海拔模式
  344. radius: geodesic.surfaceDistance
  345. },
  346. "geometry": {
  347. "type": "Circle",
  348. "coordinates": center
  349. }
  350. }
  351. })
  352. }
  353. }
  354. for (var i = 0; i < arrayPointX.length; i++) {
  355. map23DControl.polyline({
  356. action: 'add',
  357. groupId: modValue.tf,
  358. geojson: {
  359. "type": "Feature",
  360. "properties": {
  361. title: '测试polyline',
  362. color: '#00ffcc',
  363. weight: 1,
  364. opacity: 1,
  365. },
  366. "geometry": {
  367. "coordinates": [
  368. [arrayPointX[i], mMaxLat],
  369. [arrayPointX[i], mMinLat]
  370. ]
  371. }
  372. }
  373. })
  374. }
  375. }
  376. map2DViewer.map.on('moveend', modValue.zoomSelect)
  377. map2DViewer.map.on('mousemove', modValue.addTips)
  378. modValue.handler = new Cesium.ScreenSpaceEventHandler(map3DViewer.map.scene.canvas);
  379. //鼠标移动
  380. modValue.handler.setInputAction(function (e) {
  381. var mousePosition = map3DViewer.screenToLatLng(e.endPosition.x, e.endPosition.y)
  382. if (!mousePosition) {
  383. return
  384. }
  385. var obj = {
  386. latlng: {
  387. lat: mousePosition.lat,
  388. lng: mousePosition.lng
  389. },
  390. originalEvent: {
  391. clientX: e.endPosition.x,
  392. clientY: e.endPosition.y
  393. }
  394. }
  395. modValue.addTips(obj)
  396. }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  397. PubSub.subscribe('map3D.setView', cameraMoveEnd)
  398. if (map23DData.display.map2D) {
  399. var center = map2DViewer.map.getCenter()
  400. var jzoom = map2DViewer.map.getZoom();
  401. } else if (map23DData.display.map3D) {
  402. var center = map3DViewer.get3DViewCenter()
  403. var jzoom = map3DViewer.getZoomFrom3DZoom(center.alt)
  404. if (!jzoom) {
  405. if (center.alt > 100000) {
  406. jzoom = 9
  407. } else {
  408. jzoom = 10
  409. }
  410. }
  411. }
  412. modValue.zoom = jzoom //当前缩放级别
  413. modValue.bili = 1000000;
  414. if (jzoom < 7) {
  415. modValue.bili = 1000000;
  416. } else if (7 <= jzoom && jzoom < 8) {
  417. modValue.bili = 500000;
  418. } else if (8 <= jzoom && jzoom < 9) {
  419. modValue.bili = 250000;
  420. } else if (9 <= jzoom && jzoom < 10) {
  421. modValue.bili = 100000;
  422. } else if (10 <= jzoom) {
  423. modValue.bili = 50000;
  424. }
  425. map23DControl.setView({
  426. center: {
  427. lat: center.lat,
  428. lng: center.lng
  429. },
  430. zoom: jzoom
  431. });
  432. }
  433. function cameraMoveEnd() {
  434. modValue.zoomSelect()
  435. }
  436. modValue.addTips = function (e) {
  437. modValue.mouseE = e;
  438. var lat = e.latlng.lat;
  439. var lng = e.latlng.lng;
  440. $("#tufuTips").show();
  441. var oEvent = e.originalEvent;
  442. var oDiv = document.getElementById('tufuTips');
  443. var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
  444. var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
  445. oDiv.style.left = oEvent.clientX + scrollLeft + 'px';
  446. oDiv.style.top = oEvent.clientY + scrollTop + 'px';
  447. // console.log(.)
  448. var num = modValue.getMapNum(lat, lng, modValue.bili);
  449. $("#tufuTips").text(num);
  450. }
  451. modValue.zoomSelect = function () {
  452. if (map23DData.display.map2D) {
  453. var bouns = map2DViewer.map.getBounds();
  454. var jzoom = map2DViewer.map.getZoom();
  455. modValue.zoom == jzoom
  456. }
  457. if (map23DData.display.map3D) {
  458. var center = map3DViewer.get3DViewCenter()
  459. var jzoom = map3DViewer.getZoomFrom3DZoom(center.alt)
  460. if (!jzoom) {
  461. jzoom = 0
  462. modValue.zoom = 0;
  463. }
  464. if (modValue.zoom == jzoom) {
  465. return
  466. } else {
  467. if (modValue.zoom < 7 || modValue.zoom > 10) {
  468. modValue.zoom = jzoom
  469. return
  470. }
  471. }
  472. modValue.zoom = jzoom
  473. if (jzoom < 7) {
  474. var bouns = {
  475. _southWest: {
  476. lng: -180,
  477. lat: -88
  478. },
  479. _northEast: {
  480. lng: 180,
  481. lat: 88
  482. },
  483. }
  484. } else {
  485. var rec = map3DViewer.map.camera.computeViewRectangle()
  486. var south = Cesium.Math.toDegrees(rec.south)
  487. var west = Cesium.Math.toDegrees(rec.west)
  488. var north = Cesium.Math.toDegrees(rec.north)
  489. var east = Cesium.Math.toDegrees(rec.east)
  490. var bouns = {
  491. _southWest: {
  492. lng: west,
  493. lat: south
  494. },
  495. _northEast: {
  496. lng: east,
  497. lat: north
  498. },
  499. }
  500. }
  501. }
  502. cleanlines();
  503. if (jzoom < 7) {
  504. modValue.bili = 1000000;
  505. } else if (7 <= jzoom && jzoom < 8) {
  506. modValue.bili = 500000;
  507. } else if (8 <= jzoom && jzoom < 9) {
  508. modValue.bili = 250000;
  509. } else if (9 <= jzoom && jzoom < 10) {
  510. modValue.bili = 100000;
  511. // }else if(10<=jzoom && jzoom<11){
  512. } else if (10 <= jzoom) {
  513. modValue.bili = 50000;
  514. }
  515. // else if(11<=jzoom && jzoom<13){
  516. // modValue.bili = 25000;
  517. // }else if(13<=jzoom){
  518. // modValue.bili = 10000;
  519. // }
  520. modValue.drawSafe(bouns, modValue.bili)
  521. if (modValue.mouseE) {
  522. modValue.addTips(modValue.mouseE)
  523. }
  524. }
  525. function cleanlines() {
  526. if (modValue.tf) {
  527. map23DControl.group({
  528. action: 'cleanAll',
  529. guid: modValue.tf
  530. });
  531. }
  532. }
  533. function clearTufu() {
  534. if ($("#mapBaseLayerControl .choosemap .tufu-control input").is(":checked")) {
  535. $("#mapBaseLayerControl .choosemap .tufu-control input").click();
  536. }
  537. }
  538. function removelines() {
  539. $("#tufuTips").hide();
  540. if (modValue.tf) {
  541. map23DControl.group({
  542. action: 'remove',
  543. guid: modValue.tf
  544. });
  545. }
  546. map2DViewer.map.off('moveend', modValue.zoomSelect)
  547. map2DViewer.map.off('mousemove', modValue.addTips)
  548. PubSub.unsubscribe('map3D.setView', cameraMoveEnd)
  549. if (modValue.handler) {
  550. modValue.handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  551. modValue.handler = null
  552. }
  553. status.initialized = false;
  554. }
  555. /**
  556. * 设置界面
  557. */
  558. function setLayout() {
  559. }
  560. /**
  561. * 界面事件绑定
  562. * @return {[type]} [description]
  563. */
  564. function bindEvent() {
  565. }
  566. /**
  567. * 界面重置
  568. * @return {[type]} [description]
  569. */
  570. function layoutResize() {
  571. }
  572. /**
  573. * 注册订阅
  574. * @type {Function}
  575. * 推送:ONEMAP.C.publisher.publish(options,'moduleName::type');
  576. * 订阅:ONEMAP.C.publisher.subscribe(layoutResize,'sideBarLayoutChange');
  577. */
  578. function subscribe() {
  579. ONEMAP.C.publisher.subscribe(clearTufu, 'cleanMap');
  580. }
  581. /**
  582. * 取消订阅
  583. * @type {Function}
  584. * 取消订阅:ONEMAP.C.publisher.unSubscribe(layoutResize,'sideBarLayoutChange');
  585. */
  586. function unSubscribe() {}
  587. /**
  588. * 模块移除
  589. * @return {[type]} [description]
  590. */
  591. function remove() {
  592. //取消订阅
  593. unSubscribe();
  594. }
  595. return ONEMAP.M.toolTuFu = {
  596. init: init,
  597. removelines: removelines
  598. }
  599. });