turf_gridAnalysis.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. <!--********************************************************************
  2. * Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved.
  3. *********************************************************************-->
  4. <!DOCTYPE html>
  5. <html lang="en">
  6. <head>
  7. <meta charset="UTF-8">
  8. <title data-i18n="resources.title_turfGridAnalysis"></title>
  9. <script type="text/javascript" include="bootstrap,widgets.alert" src="../js/include-web.js"></script>
  10. <script type="text/javascript" include="turf,leaflet.draw" src="../../dist/leaflet/include-leaflet.js"></script>
  11. <style>
  12. .leaflet-tooltip, .leaflet-tooltip:before {
  13. color: white;
  14. border: none;
  15. background: rgba(0, 0, 0, 0.5);
  16. }
  17. </style>
  18. </head>
  19. <body style=" margin: 0;overflow: hidden;background: #fff;width: 100%;height:100%;position: absolute;top: 0;">
  20. <div id="map" style="margin:0 auto;width: 100%;height: 100%"></div>
  21. <script>
  22. var host = window.isLocal ? window.server : "https://iserver.supermap.io",
  23. mapUrl = host + "/iserver/services/map-china400/rest/maps/ChinaDark",
  24. turfLayer,
  25. bbox,
  26. gridAnalyzeType = 'hexGrid',
  27. turfAnalyzeType = 'Interpolation_tin',
  28. map = L.map('map', {
  29. crs: L.CRS.EPSG4326,
  30. preferCanvas: true,
  31. center: [36, 106],
  32. maxZoom: 18,
  33. mixZoom: 2,
  34. zoom: 4
  35. });
  36. L.supermap.tiledMapLayer(mapUrl, {
  37. noWrap: true,
  38. prjCoordSys: {"epsgCode": "4326"},
  39. minZoom: 3
  40. }).addTo(map);
  41. //创建dom
  42. initEditView();
  43. function initEditView() {
  44. var infoView = L.control({position: 'topright'});
  45. infoView.onAdd = function () {
  46. var me = this;
  47. me._div = L.DomUtil.create('div');
  48. me._div.style.width = '420px';
  49. me._div.innerHTML = "<div class='panel panel-primary editPane' id='editPane'>"+
  50. "<div class='panel-heading'>"+
  51. "<h5 class='panel-title text-center'>" + resources.text_createGrid + "</h5></div>"+
  52. "<div class='panel-body' id='gridsBody'>"+
  53. "<div class='input-group'>"+
  54. "<span class='input-group-addon'>" + resources.text_gridAnalysisType + "<span title=" + resources.text_requiredField + " style='color: red;'> * </span></span>"+
  55. "<select class='form-control' id='gridAnalyzeType' name='gridAnalyzeType'>"+
  56. "<option value='hexGrid' selected>" + resources.text_hexGrid + "</option>"+
  57. "<option value='pointGrid'>" + resources.text_pointGrid + "</option>"+
  58. "<option value='squareGrid'>" + resources.text_squareGrid + "</option>"+
  59. "<option value='triangleGrid'>" + resources.text_triangleGrid + "</option>"+
  60. "</select>"+
  61. "</div>"+
  62. "<p></p>"+
  63. "<div class='input-group'>"+
  64. "<span class='input-group-addon'>" + resources.text_unitGridSize + "<span title=" + resources.text_requiredField + " style='color: red;'> * </span></span>"+
  65. "<input id='cellSide' type='text' class='form-control' value='50'/>"+
  66. "</div>"+
  67. "<p></p>"+
  68. "<div class='input-group'>"+
  69. "<span class='input-group-addon'>" + resources.text_gridUnitSizeUnit + "<span title=" + resources.text_requiredField + " style='color: red;'> * </span></span>"+
  70. "<select class='form-control' id='units' name='mode'>"+
  71. "<option value='degrees'>" + resources.text_degrees + "</option>"+
  72. "<option value='radians'>" + resources.text_radians + "</option>"+
  73. "<option value='miles' selected>" + resources.text_miles + "</option>"+
  74. "<option value='kilometers'>" + resources.text_kilometers + "</option>"+
  75. "</select>"+
  76. "</div>"+
  77. "<p></p>"+
  78. "<div id='squareGridChoic' class='input-group' style='display: none'>"+
  79. "<span class='input-group-addon'>" + resources.text_adjustSize + "</span>"+
  80. "<span class='form-control'>"+
  81. "<input id='completelyWithin' type='checkbox'>"+
  82. "</span>"+
  83. "</div>"+
  84. "<p></p>"+
  85. "<div id='pointGridChoic' class='input-group' style='display: none'>"+
  86. "<span class='input-group-addon'>" + resources.text_adjustPoint + "</span>"+
  87. "<span class='form-control'>"+
  88. "<input id='iscentered' type='checkbox'>"+
  89. "</span><span class='input-group-addon'>" + resources.text_creationRange + "</span>"+
  90. "<span class='form-control'><input id='isbboxIsMask' type='checkbox'>"+
  91. "</span>"+
  92. "</div>"+
  93. "<p></p>"+
  94. "<div id='hexGridChoic' class='input-group'>"+
  95. "<span class='input-group-addon'>" + resources.text_returnedByTriangle + "</span>"+
  96. "<span class='form-control'>"+
  97. "<input id='triangles' type='checkbox'>"+
  98. "</span>"+
  99. "</div>"+
  100. "<p></p>"+
  101. "<div align='right' class='input-group'>"+
  102. "<input type='button' id='createGridBtn' class='btn btn-primary' value=" + resources.btn_createGrid + ">&nbsp"+
  103. "<input type='button' id='clearGridBtn' class='btn btn-primary' value=" + resources.text_input_value_clear + ">"+
  104. "</div>"+
  105. "</div>"+
  106. "</div>";
  107. handleMapEvent(me._div, me._map);
  108. return me._div;
  109. };
  110. infoView.addTo(map);
  111. }
  112. //绑定dom事件
  113. bindEvent();
  114. function bindEvent() {
  115. //格网分析事件绑定 --start
  116. // 切换格网分析
  117. $("#gridAnalyzeType").change(function () {
  118. bbox = null;
  119. //是否有需要删除的提示框
  120. widgets.alert.clearAlert();
  121. clearLayer();
  122. gridAnalyzeType = $("#gridAnalyzeType option:selected").val();
  123. switch (gridAnalyzeType) {
  124. case 'hexGrid':
  125. $("#squareGridChoic").hide();
  126. $("#pointGridChoic").hide();
  127. $("#hexGridChoic").show();
  128. return;
  129. case 'pointGrid':
  130. $("#squareGridChoic").hide();
  131. $("#pointGridChoic").show();
  132. $("#hexGridChoic").hide();
  133. return;
  134. case 'squareGrid':
  135. $("#squareGridChoic").show();
  136. $("#pointGridChoic").hide();
  137. $("#hexGridChoic").hide();
  138. return;
  139. case 'triangleGrid':
  140. $("#squareGridChoic").hide();
  141. $("#pointGridChoic").hide();
  142. $("#hexGridChoic").hide();
  143. return;
  144. }
  145. });
  146. $("#createGridBtn").click(function () {
  147. //是否有需要删除的提示框
  148. widgets.alert.clearAlert();
  149. turfLayer.clearLayers();
  150. if (bbox) {
  151. switch (gridAnalyzeType) {
  152. case 'hexGrid':
  153. gridAnalyst.createHexGrid();
  154. break;
  155. case 'pointGrid':
  156. gridAnalyst.createPointGrid();
  157. break;
  158. case 'squareGrid':
  159. gridAnalyst.createSquareGrid();
  160. break;
  161. case 'triangleGrid':
  162. gridAnalyst.createTriangleGrid();
  163. break;
  164. }
  165. } else {
  166. widgets.alert.showAlert(resources.msg_drawAnalystRange, false);
  167. }
  168. });
  169. $("#clearGridBtn").click(function () {
  170. //是否有需要删除的提示框
  171. widgets.alert.clearAlert();
  172. if (gridAnalyst.editableLayers.getLayers().length === 0 && turfLayer.getLayers().length == 0) {
  173. widgets.alert.showAlert(resources.msg_noDataToDelete, false);
  174. return;
  175. }
  176. bbox = null;
  177. clearLayer();
  178. });
  179. //格网分析事件绑定 --end
  180. }
  181. //设置图标
  182. var pointIcon = L.icon({
  183. iconUrl: '../img/marker-gold.png',
  184. iconSize: [25, 25],
  185. });
  186. var bounds = L.latLngBounds(L.latLng(90, 180), L.latLng(-90, -180));
  187. function mapDrawListener(e) {
  188. var layer = e.layer;
  189. var layerBounds = layer._bounds;
  190. if (!bounds.contains(layerBounds)) {
  191. widgets.alert.showAlert(resources.msg_beyondScope, false);
  192. return;
  193. }
  194. map.fire("viewreset");
  195. if (gridAnalyst.editableLayers.getLayers().length > 0) {
  196. widgets.alert.showAlert(resources.msg_dontRedraw, false);
  197. return;
  198. }
  199. tooltip.removeFrom(map);
  200. map.off('mousemove', pointerMoveHandler);
  201. gridAnalyst.editableLayers.addLayer(layer);
  202. bbox = [layerBounds.getWest(), layerBounds.getSouth(), layerBounds.getEast(), layerBounds.getNorth()];
  203. drawing = false;
  204. }
  205. //添加鼠标滑动事件
  206. var tooltip = L.tooltip({
  207. direction: 'right'
  208. });
  209. var pointerMoveHandler = function (evt) {
  210. var helpMsg = resources.msg_drawAnalystRange;
  211. if (helpMsg) {
  212. tooltip.setContent(helpMsg);
  213. tooltip.setLatLng(evt.latlng);
  214. }
  215. tooltip.addTo(map);
  216. };
  217. map.on('mousemove', pointerMoveHandler);
  218. //创建格网分析对象
  219. var drawing = false;
  220. var gridAnalyst = {
  221. editableLayers: null,
  222. drawControl: null,
  223. turfLayerOptions: {
  224. pointToLayer: function (feature, latlng) {
  225. return L.marker(latlng, {
  226. icon: pointIcon, zIndexOffset: 1000
  227. }
  228. );
  229. },
  230. style: function (feature) {
  231. return {
  232. color: 'red',
  233. weight: 0.8,
  234. opacity: 0.8,
  235. fillColor: 0.1
  236. }
  237. }
  238. },
  239. loadAnalystLayer: function () {
  240. var center = L.latLng(36, 106);
  241. map.flyTo(center, 4);
  242. //初始化turfLayer
  243. turfLayer = L.supermap.turfLayer(gridAnalyst.turfLayerOptions).addTo(map);
  244. //添加画图控件:
  245. gridAnalyst.editableLayers = new L.FeatureGroup();
  246. map.addLayer(gridAnalyst.editableLayers);
  247. var options = {
  248. position: 'topleft',
  249. draw: {
  250. toolbar: false,
  251. polyline: false,
  252. polygon: false,
  253. circle: false,
  254. circlemarker: false,
  255. rectangle: {},
  256. marker: false,
  257. remove: {},
  258. },
  259. edit: {
  260. featureGroup: gridAnalyst.editableLayers,
  261. edit: false,
  262. remove: false
  263. }
  264. };
  265. gridAnalyst.drawControl = new L.Control.Draw(options);
  266. gridAnalyst.drawControl.setDrawingOptions({
  267. tooltip: {
  268. start: resources.msg_clickDrawAnalystRange
  269. }
  270. });
  271. map.addControl(gridAnalyst.drawControl);
  272. handleMapEvent(gridAnalyst.drawControl.getContainer(), map);
  273. //绘图完成事件
  274. map.on(L.Draw.Event.CREATED, mapDrawListener);
  275. map.on('draw:drawstart', function () {
  276. //是否有需要删除的提示框
  277. widgets.alert.clearAlert();
  278. drawing = true;
  279. });
  280. },
  281. createHexGrid: function () {
  282. var cellSide = $("#cellSide").val();
  283. var units = $("#units option:selected").val();
  284. var triangles = $("#triangles").get(0).checked;
  285. turfLayer.process("Grids.hexGrid", {
  286. "bbox": bbox,
  287. "cellSide": cellSide,
  288. "units": units,
  289. "triangles": triangles
  290. });
  291. },
  292. createPointGrid: function () {
  293. var cellSide = $("#cellSide").val();
  294. var units = $("#units option:selected").val();
  295. var iscentered = $('#iscentered').get(0).checked;
  296. var isbboxIsMask = $('#isbboxIsMask').get(0).checked;
  297. turfLayer.process("Grids.pointGrid", {
  298. "bbox": bbox,
  299. "cellSide": cellSide,
  300. "units": units,
  301. "centered": iscentered,
  302. "bboxIsMask": isbboxIsMask
  303. });
  304. },
  305. createSquareGrid: function () {
  306. var cellSide = $("#cellSide").val();
  307. var units = $("#units option:selected").val();
  308. var completelyWithin = $("#completelyWithin").get(0).checked;
  309. turfLayer.process("Grids.squareGrid", {
  310. "bbox": bbox,
  311. "cellSide": cellSide,
  312. "units": units,
  313. "completelyWithin": completelyWithin
  314. });
  315. },
  316. createTriangleGrid: function () {
  317. var cellSide = $("#cellSide").val();
  318. var units = $("#units option:selected").val();
  319. turfLayer.process("Grids.triangleGrid", {
  320. "bbox": bbox,
  321. "cellSide": cellSide,
  322. "units": units
  323. });
  324. }
  325. };
  326. gridAnalyst.loadAnalystLayer();
  327. function clearLayer() {
  328. if (turfLayer) {
  329. turfLayer.clearLayers();
  330. }
  331. gridAnalyst.editableLayers.clearLayers();
  332. }
  333. //避免画图事件与地图事件冲突
  334. function handleMapEvent(div, map) {
  335. if (!div || !map) {
  336. return;
  337. }
  338. map.dragging.disable();
  339. div.addEventListener('mouseover', function () {
  340. map.scrollWheelZoom.disable();
  341. map.doubleClickZoom.disable();
  342. map.off('mousemove', pointerMoveHandler);
  343. tooltip.removeFrom(map);
  344. });
  345. map.dragging.enable();
  346. div.addEventListener('mouseout', function () {
  347. map.scrollWheelZoom.enable();
  348. map.doubleClickZoom.enable();
  349. if (!drawing) {
  350. map.on('mousemove', pointerMoveHandler);
  351. }
  352. });
  353. }
  354. </script>
  355. </body>
  356. </html>