toolSquareGrid.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. /**
  2. * [ONEMAP.M.toolSquareGrid]
  3. * @return {[object]}
  4. */
  5. define(function (tplLayout) {
  6. /**
  7. * 模块数据 用于数据存储和外部调用
  8. * @type {Object}
  9. * 数据存放
  10. */
  11. var modValue = {
  12. LG: null,
  13. }
  14. //var LG = null; // to draw
  15. var LH = null;
  16. var delta = 100; // in meters
  17. var bea = 0; // in degrees
  18. var invxy = 0, // 1 if inverse x & y
  19. revy = 0;
  20. var xlabels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'ag', 'ah', 'ai', 'aj', 'ak', 'al', 'am', 'an'];
  21. var ylabels = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40'];
  22. var Nx0 = xlabels.length,
  23. Ny0 = ylabels.length;
  24. var egli = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"];
  25. var delta_list = [1000] // larger than 5 meters
  26. /**
  27. * 模块界面样式 例如:宽,高
  28. * @type {Object}
  29. */
  30. var styles = {}
  31. /**
  32. * 模块状态,用于存储模块的状态 例如:收起,关闭
  33. * @type {Object}
  34. */
  35. var status = {
  36. initialized: false //是否初始化
  37. };
  38. /**
  39. * 初始化并订阅事件
  40. * @return {[type]} [description]
  41. */
  42. function init() {
  43. if (!status.initialized) {
  44. modValue.daihao = map23DControl.curZoingNum || 3;
  45. buildSquareGrid();
  46. //提示
  47. addtip();
  48. subscribe();
  49. status.initialized = true;
  50. } else {
  51. //clearSquareGrid();
  52. //status.initialized = false;
  53. }
  54. }
  55. function addtip() {
  56. $('body').append('<div class="toolSquareGridTip">方里网在13-16级上显示</br>当前级别为<span>&nbsp;' + map2DViewer.map.getZoom() + '</span></div>')
  57. }
  58. function removetip() {
  59. if ($('.toolSquareGridTip').length > 0) {
  60. $('.toolSquareGridTip').remove();
  61. }
  62. }
  63. function buildSquareGrid() {
  64. SGrid()
  65. map2DViewer.map.on('zoomend move', SGrid)
  66. var handler = new Cesium.ScreenSpaceEventHandler(map3DViewer.map.scene.canvas);
  67. //鼠标移动
  68. handler.setInputAction(function (e) {
  69. SGrid()
  70. }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  71. }
  72. function SGrid() {
  73. var zoom = map2DViewer.map.getZoom();
  74. //刷新显示级别
  75. $('.toolSquareGridTip span').html(zoom + '&nbsp;');
  76. if (zoom > 12 && zoom <= 16) {
  77. var bounds = map2DViewer.map.getBounds();
  78. var latlng = [];
  79. var IntMeter = getIntMeter(bounds._northEast.lat, bounds._northEast.lng);
  80. bounds._northEast.lat = IntMeter.lat;
  81. bounds._northEast.lng = IntMeter.lon;
  82. window.gauss = GaussUtil.fromLatLon(bounds._northEast.lat, bounds._northEast.lng, modValue.daihao);
  83. gauss.x = Math.ceil(gauss.x / 1000) * 1000;
  84. gauss.y = parseInt(gauss.y / 1000) * 1000;
  85. gauss.y = parseInt(JSON.stringify(gauss.zoneNum) + JSON.stringify(gauss.y))
  86. var IntMeter = getIntMeter(bounds._southWest.lat, bounds._southWest.lng);
  87. bounds._southWest.lat = IntMeter.lat;
  88. bounds._southWest.lng = IntMeter.lon;
  89. latlng.push({
  90. lat: bounds._northEast.lat,
  91. lng: bounds._northEast.lng
  92. });
  93. latlng.push({
  94. lat: bounds._southWest.lat,
  95. lng: bounds._northEast.lng
  96. });
  97. latlng.push({
  98. lat: bounds._southWest.lat,
  99. lng: bounds._southWest.lng
  100. });
  101. latlng.push({
  102. lat: bounds._northEast.lat,
  103. lng: bounds._southWest.lng
  104. });
  105. latlng.push({
  106. lat: bounds._northEast.lat,
  107. lng: bounds._northEast.lng
  108. });
  109. set_new_editable_layer(latlng)
  110. } else {
  111. if (modValue.LG != null) {
  112. map2DViewer.map.removeLayer(modValue.LG)
  113. }
  114. }
  115. }
  116. function getIntMeter(lat, lng) {
  117. var gauss = GaussUtil.fromLatLon(lat, lng, modValue.daihao);
  118. gauss.x = Math.ceil(gauss.x / 1000) * 1000;
  119. gauss.y = Math.ceil(gauss.y / 1000) * 1000;
  120. gauss.y = parseInt(JSON.stringify(gauss.zoneNum) + JSON.stringify(gauss.y))
  121. var latlng = GaussUtil.toLatLon(gauss.x, gauss.y, modValue.daihao);
  122. return latlng
  123. }
  124. var mycrs;
  125. var pre_my_delta;
  126. function set_new_editable_layer(layer) {
  127. var LL = layer
  128. var LL_P_1 = 0,
  129. LL_P_3 = 0,
  130. j = -1,
  131. k = 1
  132. var b = 0;
  133. var s = 1
  134. if (((b > 90) & (b < 270)) | (b < -90) & (b > -270)) s = -1
  135. while (!((s * LL_P_1.x > 0) & (s * LL_P_3.y < 0))) {
  136. if (j == 4) {
  137. j = 0;
  138. k = -1
  139. }
  140. ++j
  141. mycrs = new L.Proj.CRS("EPSG:999999", "+proj=tmerc +lat_0=" + LL[mod(j, 4)].lat + " +lon_0=" + LL[mod(j, 4)].lng + " +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs");
  142. LL_P_1 = mycrs.projection.project(LL[mod(j + k * 1, 4)])
  143. LL_P_3 = mycrs.projection.project(LL[mod(j + k * 3, 4)])
  144. }
  145. var dx = Math.ceil(Math.sqrt(LL_P_1.x * LL_P_1.x + LL_P_1.y * LL_P_1.y))
  146. var dy = Math.ceil(Math.sqrt(LL_P_3.x * LL_P_3.x + LL_P_3.y * LL_P_3.y))
  147. if (map2DViewer.map.getZoom() <= 14) {
  148. my_delta = [];
  149. for (var i = 0; i < delta_list.length; ++i) {
  150. if (
  151. (delta_list[i] >= Math.max(dx / xlabels.length, dy / ylabels.length)) & (delta_list[i] < Math.min(dx / 4, dy / 4))
  152. ) {
  153. my_delta.push({
  154. delta: delta_list[i],
  155. Nx: Math.ceil(dx / delta_list[i]),
  156. Ny: Math.ceil(dy / delta_list[i])
  157. })
  158. }
  159. }
  160. pre_my_delta = my_delta;
  161. } else {
  162. my_delta = pre_my_delta;
  163. }
  164. var delta = null,
  165. Nx, Ny
  166. var ret = egli[my_delta.length - 1];
  167. if (ret == null) {
  168. return false
  169. }
  170. ret = ret.toUpperCase()
  171. var J = ret.charCodeAt() - 65
  172. if ($.isNumeric(ret)) {
  173. delta = ret
  174. Nx = Math.ceil(dx / ret)
  175. Ny = Math.ceil(dy / ret)
  176. } else if ((J >= 0) & (J < my_delta.length)) {
  177. delta = my_delta[J].delta
  178. Nx = my_delta[J].Nx
  179. Ny = my_delta[J].Ny
  180. }
  181. if (delta != null) {
  182. bea = 0;
  183. show_grid({
  184. x: 0,
  185. y: 0
  186. }, xlabels, ylabels, delta, Nx, Ny, bea, invxy, revy)
  187. }
  188. }
  189. function mod(n, m) {
  190. return ((n % m) + m) % m;
  191. }
  192. function getLatlng(xy_center) {
  193. //console.log(xy_center)
  194. var latlng = GaussUtil.toLatLon(gauss.x + xy_center.y, gauss.y - xy_center.x, modValue.daihao);
  195. return new L.latLng([latlng.lat, latlng.lon])
  196. }
  197. function show_grid(latlng_31370, xlabels, ylabels, delta, Nx, Ny, b, invxy, revy) {
  198. var G = [],
  199. H = [],
  200. cb = Math.cos(b * Math.PI / 180),
  201. sb = Math.sin(b * Math.PI / 180),
  202. x0 = parseFloat(latlng_31370.x), // ! parseFloat ! otherwise string concat !!
  203. y0 = parseFloat(latlng_31370.y)
  204. for (var i = 0; i < Nx; ++i) {
  205. for (var j = 0; j < Ny; ++j) {
  206. //var xy_center = {
  207. // x: x0 + cb * (i + 0) * delta + sb * (j + 0) * delta,
  208. // y: y0 + sb * (i + 0) * delta - cb * (j + 0) * delta
  209. //}
  210. //var LL = mycrs.projection.unproject(xy_center) // center of the square
  211. //console.log(LL)
  212. if (map2DViewer.map.getZoom() == 13) {
  213. var LL = mycrs.projection.unproject({
  214. x: x0 + cb * (i + 0) * delta + sb * (j + 0) * delta,
  215. y: y0 + sb * (i + 0) * delta - cb * (j + 0) * delta
  216. })
  217. var LL_TL = mycrs.projection.unproject({
  218. x: x0 + cb * (i + 0) * delta + sb * (j + 0) * delta,
  219. y: y0 + sb * (i + 0) * delta - cb * (j + 0) * delta
  220. })
  221. var LL_TR = mycrs.projection.unproject({
  222. x: x0 + cb * (i + 1) * delta + sb * (j + 0) * delta,
  223. y: y0 + sb * (i + 1) * delta - cb * (j + 0) * delta
  224. })
  225. var LL_BL = mycrs.projection.unproject({
  226. x: x0 + cb * (i + 0) * delta + sb * (j + 1) * delta,
  227. y: y0 + sb * (i + 0) * delta - cb * (j + 1) * delta
  228. })
  229. var LL_BR = mycrs.projection.unproject({
  230. x: x0 + cb * (i + 1) * delta + sb * (j + 1) * delta,
  231. y: y0 + sb * (i + 1) * delta - cb * (j + 1) * delta
  232. })
  233. } else {
  234. var LL = getLatlng({
  235. x: x0 + cb * (i + 0) * delta + sb * (j + 0) * delta,
  236. y: y0 + sb * (i + 0) * delta - cb * (j + 0) * delta
  237. })
  238. var LL_TL = getLatlng({
  239. x: x0 + cb * (i + 0) * delta + sb * (j + 0) * delta,
  240. y: y0 + sb * (i + 0) * delta - cb * (j + 0) * delta
  241. })
  242. var LL_TR = getLatlng({
  243. x: x0 + cb * (i + 1) * delta + sb * (j + 0) * delta,
  244. y: y0 + sb * (i + 1) * delta - cb * (j + 0) * delta
  245. })
  246. var LL_BL = getLatlng({
  247. x: x0 + cb * (i + 0) * delta + sb * (j + 1) * delta,
  248. y: y0 + sb * (i + 0) * delta - cb * (j + 1) * delta
  249. })
  250. var LL_BR = getLatlng({
  251. x: x0 + cb * (i + 1) * delta + sb * (j + 1) * delta,
  252. y: y0 + sb * (i + 1) * delta - cb * (j + 1) * delta
  253. })
  254. }
  255. var lat_lngs = [LL_TL, LL_TR, LL_BR, LL_BL, LL_TL]
  256. var myname = GaussUtil.fromLatLon(LL.lat, LL.lng, modValue.daihao);
  257. //myname = parseInt(myname.y/1000)+'000,'+parseInt(myname.x/1000)+'000'
  258. mynamex = myname.zoneNum + "," + myname.y.toFixed(0);
  259. mynamey = myname.x.toFixed(0);
  260. /*var newj = j
  261. if (revy == 1) newj = Ny - 1 - j
  262. if (invxy == 1) {
  263. myname = xlabels[newj].toUpperCase() + ylabels[i]
  264. } else {
  265. myname = xlabels[i].toUpperCase() + ylabels[newj];
  266. }*/
  267. /*if (((i % 1 == 0) & (j % 1 == 0))) {
  268. if(map2DViewer.map.getZoom() > 13){
  269. var myIcon = L.divIcon({
  270. className: 'emptyicon',
  271. html: myname
  272. });
  273. var marker = L.marker(LL, {
  274. icon: myIcon
  275. })
  276. marker.properties = {};
  277. G.push(marker)
  278. H.push(L.marker(LL, {
  279. icon: myIcon,
  280. name: myname
  281. }));
  282. }
  283. }*/
  284. if (map2DViewer.map.getZoom() > 13) {
  285. if ((i == 1) && (j != 1)) {
  286. var myIcon = L.divIcon({
  287. className: 'emptyiconx',
  288. html: mynamey
  289. });
  290. var marker = L.marker(LL, {
  291. icon: myIcon
  292. })
  293. marker.properties = {};
  294. G.push(marker)
  295. H.push(L.marker(LL, {
  296. icon: myIcon,
  297. name: mynamey
  298. }));
  299. }
  300. if (j == 1) {
  301. var myIcon = L.divIcon({
  302. className: 'emptyicon',
  303. html: mynamex
  304. });
  305. var marker = L.marker(LL, {
  306. icon: myIcon
  307. })
  308. marker.properties = {};
  309. G.push(marker)
  310. H.push(L.marker(LL, {
  311. icon: myIcon,
  312. name: mynamex
  313. }));
  314. }
  315. }
  316. G.push(new L.Polyline(lat_lngs, {
  317. color: '#00ffcc',
  318. fillOpacity: 0,
  319. weight: 1
  320. }));
  321. H.push(new L.Polyline(lat_lngs, {
  322. color: '#00ffcc',
  323. fillOpacity: 0,
  324. weight: 1
  325. }));
  326. }
  327. }
  328. var LL_TL = mycrs.projection.unproject({
  329. x: x0,
  330. y: y0
  331. })
  332. var LL_TR = mycrs.projection.unproject({
  333. x: x0 + cb * Nx * delta,
  334. y: y0 + sb * Nx * delta
  335. })
  336. var LL_BL = mycrs.projection.unproject({
  337. x: x0 + sb * Ny * delta,
  338. y: y0 - cb * Ny * delta
  339. })
  340. var LL_BR = mycrs.projection.unproject({
  341. x: x0 + cb * Nx * delta + sb * Ny * delta,
  342. y: y0 + sb * Nx * delta - cb * Ny * delta
  343. })
  344. var lat_lngs = [LL_TL, LL_TR, LL_BR, LL_BL, LL_TL]
  345. if (modValue.LG != null) {
  346. map2DViewer.map.removeLayer(modValue.LG)
  347. }
  348. modValue.LG = L.featureGroup(G).addTo(map2DViewer.map)
  349. LH = L.featureGroup(H)
  350. }
  351. function clearSquareGrid() {
  352. if (modValue.LG != null) {
  353. map2DViewer.map.removeLayer(modValue.LG)
  354. }
  355. map2DViewer.map.off('zoomend move', SGrid)
  356. removetip();
  357. status.initialized = false;
  358. // if ($("#mapBaseLayerControl .choosemap .tufu-control input").is(":checked")) {
  359. // $("#mapBaseLayerControl .choosemap .tufu-control input").click();
  360. // }
  361. }
  362. /**
  363. * 设置界面
  364. */
  365. function setLayout() {
  366. }
  367. /**
  368. * 界面事件绑定
  369. * @return {[type]} [description]
  370. */
  371. function bindEvent() {
  372. }
  373. /**
  374. * 界面重置
  375. * @return {[type]} [description]
  376. */
  377. function layoutResize() {
  378. }
  379. function updaihao(options) {
  380. modValue.daihao = options;
  381. SGrid();
  382. }
  383. /**
  384. * 注册订阅
  385. * @type {Function}
  386. * 推送:ONEMAP.C.publisher.publish(options,'moduleName::type');
  387. * 订阅:ONEMAP.C.publisher.subscribe(layoutResize,'sideBarLayoutChange');
  388. */
  389. function subscribe() {
  390. ONEMAP.C.publisher.subscribe(clearSquareGrid, 'cleanMap');
  391. ONEMAP.C.publisher.subscribe(updaihao, 'daihao');
  392. }
  393. /**
  394. * 取消订阅
  395. * @type {Function}
  396. * 取消订阅:ONEMAP.C.publisher.unSubscribe(layoutResize,'sideBarLayoutChange');
  397. */
  398. function unSubscribe() {
  399. ONEMAP.C.publisher.unSubscribe(updaihao, 'daihao');
  400. }
  401. /**
  402. * 模块移除
  403. * @return {[type]} [description]
  404. */
  405. function remove() {
  406. //取消订阅
  407. unSubscribe();
  408. }
  409. return ONEMAP.M.toolSquareGrid = {
  410. init: init,
  411. clearSquareGrid: clearSquareGrid
  412. }
  413. });