06_trafficTransferAnalystService.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <!--********************************************************************
  2. * Copyright© 2000 - 2021 SuperMap Software Co.Ltd. All rights reserved.
  3. *********************************************************************-->
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta charset="UTF-8">
  8. <title data-i18n="resources.title_trafficTransfer"></title>
  9. <script type="text/javascript" include="bootstrap-css,jquery" src="../js/include-web.js"></script>
  10. <style>
  11. .transferSolution {
  12. cursor: pointer;
  13. margin: 10px 10px;
  14. }
  15. .transferInfo a {
  16. cursor: pointer;
  17. }
  18. table {
  19. width: 90%;
  20. }
  21. #trafficRes {
  22. margin: 5px;
  23. }
  24. </style>
  25. </head>
  26. <body style=" margin: 0;overflow: hidden;background: #fff;width: 100%;height:100%;position: absolute;top: 0;">
  27. <div id="map" style="margin:0 auto;width: 100%;height: 100%"></div>
  28. <script type="text/javascript" src="../../dist/leaflet/include-leaflet.js"></script>
  29. <script type="text/javascript">
  30. var host = window.isLocal ? window.server : "https://iserver.supermap.io";
  31. var map, startMarker, endMarker, tempRedLayer, tempMarker,
  32. routeFeatureGroup, paths = {transSolutions: null, solutions: null}, info,
  33. baseUrl = host + "/iserver/services/map-changchun/rest/maps/长春市区图",
  34. serviceUrl = host + "/iserver/services/traffictransferanalyst-sample/restjsr/traffictransferanalyst/Traffic-Changchun";
  35. map = L.map('map', {
  36. crs: L.CRS.NonEarthCRS({
  37. bounds: L.bounds([48.4, -7668.25], [8958.85, -55.58]),
  38. origin: L.point(48.4, -55.58)
  39. }),
  40. center: [-3900, 4700],
  41. maxZoom: 18,
  42. zoom: 2
  43. });
  44. L.supermap.tiledMapLayer(baseUrl, {noWrap: true}).addTo(map);
  45. startMarker = L.marker([-5527.73795456, 3111.42533851])
  46. .addTo(map).bindTooltip(resources.text_startPoint, {
  47. offset: L.point([0, -10]),
  48. direction: "top",
  49. permanent: true
  50. }).openTooltip();
  51. endMarker = L.marker([-4270.0725196, 6055.3431955])
  52. .addTo(map)
  53. .bindTooltip(resources.text_endPoint, {
  54. offset: L.point([0, -10]),
  55. direction: "top",
  56. permanent: true
  57. }).openTooltip();
  58. routeFeatureGroup = L.featureGroup().addTo(map);
  59. tempRedLayer = L.featureGroup().addTo(map);
  60. initResultInfoWin();
  61. execTransSolutionsQuery('LESS_TIME');
  62. function initResultInfoWin() {
  63. info = L.control({position: 'topright'});
  64. info.onAdd = function () {
  65. this._div = L.DomUtil.create('div', 'panel panel-primary');
  66. info.update();
  67. handleMapEvent(this._div, this._map);
  68. return this._div;
  69. };
  70. info.update = function (transSolutions, transGuide) {
  71. if (!transSolutions) {
  72. return;
  73. }
  74. var solution, lines, line, dispStatus = "block";
  75. $("<div class='panel-heading' style='background:steelblue;color: honeydew'>" + resources.text_startPoint + ":" + "省汽修&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + resources.text_endPoint + ":" + "中安大厦<br/>" + resources.text_trafficTransferScheme + "(" + resources.text_minTime + ")</div>").appendTo(this._div);
  76. for (var i = 0, iLen = transSolutions.length; i < iLen; i++) {
  77. solution = transSolutions[i];
  78. //显示方案头
  79. var title = "";
  80. for (var ii = 0, iiLen = solution.linesItems.length; ii < iiLen; ii++) {
  81. lines = solution.linesItems[ii];
  82. for (var iii = 0, iiiLen = lines.lineItems.length; iii < iiiLen; iii++) {
  83. line = lines.lineItems[iii];
  84. if (iii !== iiiLen - 1) {
  85. title += line.lineName + "/";
  86. } else {
  87. title += line.lineName;
  88. }
  89. }
  90. if (ii !== iiLen - 1) {
  91. title += " → ";
  92. }
  93. }
  94. $("<div class='transferSolution' id='transferSolution-" + i + "'><span class='transferIndex'>" + resources.text_scheme + (i + 1) + ":</span>" + title + "</div>").appendTo(this._div);
  95. if (i !== 0) {
  96. dispStatus = "none";
  97. }
  98. var list = $("<div class='transferInfo' id='transferInfo-" + i + "' style='display:" + dispStatus + "'></div>");
  99. list.appendTo(this._div);
  100. //默认显示方案1下的table
  101. if (i === 0) {
  102. fillTransferInfo(transGuide, transSolutions, 0).appendTo(list);
  103. setPopup();
  104. }
  105. }
  106. //点击方案时显示对应的table
  107. bindSolutionsClickEvent();
  108. };
  109. info.addTo(map);
  110. }
  111. function execTransSolutionsQuery(tactic) {
  112. info.remove();
  113. paths.points = [26, 180];
  114. var params = new SuperMap.TransferSolutionParameters({
  115. solutionCount: 6,//最大换乘导引数量
  116. transferTactic: tactic,//公交换乘策略类型
  117. walkingRatio: 10,//步行与公交的消耗权重比
  118. points: paths.points //起始点坐标
  119. });
  120. L.supermap.trafficTransferAnalystService(serviceUrl)
  121. .analysisTransferSolution(params, function (serviceResult) {
  122. if (serviceResult.error) {
  123. alert(resources.msg_errorMsg + ":" + serviceResult.error.errorMsg);
  124. }
  125. transferSolutionsSucceed(serviceResult.result);
  126. });
  127. }
  128. function transferSolutionsSucceed(result) {
  129. clearLayer();
  130. info.addTo(map);
  131. //在地图上叠加符号信息
  132. var transGuide = result.defaultGuide,
  133. transSolutions = result.solutionItems,
  134. solutions = [];
  135. for (var j = 0; j < transSolutions.length; j++) {
  136. var linesItems = transSolutions[j].linesItems, transSolution = [];
  137. for (var jj = 0; jj < linesItems.length; jj++) {
  138. var lineItems = linesItems[jj].lineItems, items = [];
  139. for (var jjj = 0; jjj < lineItems.length; jjj++) {
  140. var lineItem = lineItems[jjj];
  141. items.push("{'lineID':" + lineItem.lineID +
  142. ",'startStopIndex':" + lineItem.startStopIndex +
  143. ",'endStopIndex':" + lineItem.endStopIndex + "}"
  144. );
  145. }
  146. transSolution.push(items);
  147. }
  148. solutions.push(transSolution);
  149. }
  150. paths["transSolutions"] = transSolutions;
  151. paths["solutions"] = solutions;
  152. if (!transGuide || !transSolutions) return;
  153. info.update(transSolutions, transGuide);
  154. }
  155. function fillTransferInfo(transGuide, transSolutions, indexX) {
  156. clearLayer();
  157. if (transGuide && transGuide.items.length) {
  158. var items = transGuide.items;
  159. for (var itemIndex = 0, itemLen = items.length; itemIndex < itemLen; itemIndex++) {
  160. var geometry = items[itemIndex].route;
  161. routeFeatureGroup.addLayer(L.geoJSON(L.Util.toGeoJSON(geometry)).addTo(map));
  162. }
  163. }
  164. var table = $("<table id='trafficRes' border='1'></table>");
  165. var startStop = $("<tr></tr>");
  166. $("<td class='start_transfer' width='10px'></td>").appendTo(startStop);
  167. $("<td colspan='2'><span class='busLink bgSpan'><span style='display:none'>" + transGuide.items[0].startPosition.x + "," + transGuide.items[0].startPosition.y + "</span>" + transGuide.items[0].startStopName + "</span></td>").appendTo(startStop);
  168. startStop.appendTo(table);
  169. var indexY = 0;
  170. for (var iiii = 0, iiiiLen = transGuide.items.length; iiii < iiiiLen; iiii++) {
  171. var item = transGuide.items[iiii];
  172. var tr2 = $("<tr></tr>");
  173. if (item.isWalking) {
  174. $("<td class='step_transfer' ></td>").appendTo(tr2);
  175. $("<td>" + resources.text_walkTO + "<a class='busLink'><span style='display:none'>" + item.endPosition.x + "," + item.endPosition.y + "</span>" + item.endStopName + "</a></td>").appendTo(tr2);
  176. $("<td>" + parseInt(item.distance) + resources.msg_m + "</td>").appendTo(tr2);
  177. } else {
  178. var otherLines = transSolutions[indexX].linesItems[indexY],
  179. links = "";
  180. if (otherLines && otherLines.lineItems.length > 1) {
  181. links = "</br>" + resources.text_alsoRide;
  182. for (var oti = 0, otLen = otherLines.lineItems.length; oti < otLen; oti++) {
  183. var line = otherLines.lineItems[oti];
  184. if (item.lineName !== line.lineName) {
  185. var other = indexX + "," + indexY + "," + oti + ",0";
  186. links += "<a class='busLink'><span style='display:none'>" + other + "</span>" + line.lineName + "</a>";
  187. }
  188. }
  189. }
  190. $("<td class='bus_transfer'></td>").appendTo(tr2);
  191. var points = item.route.points, pointStr = "";
  192. for (var i = 0; i < points.length; i++) {
  193. pointStr += points[i].x + " " + points[i].y;
  194. if (i != points.length - 1) {
  195. pointStr += ",";
  196. }
  197. }
  198. $("<td>" + resources.text_ride + "<a class='busLink'>" + item.lineName + "<span style='display:none'>" + pointStr + "</span></a>, " + resources.text_debus1 + "<a class='busLink'><span style='display:none'>" + item.endPosition.x + "," + item.endPosition.y + "</span>" + item.endStopName + "</a>" + resources.text_debus2 + links + "</td>").appendTo(tr2);
  199. $("<td>" + item.passStopCount + resources.text_stops + "</td>").appendTo(tr2);
  200. indexY++;
  201. }
  202. tr2.appendTo(table);
  203. }
  204. var endStop = $("<tr></tr>");
  205. endStop.appendTo(table);
  206. $("<td class='end_transfer' width='10px'></td>").appendTo(endStop);
  207. $("<td colspan='2'><span class='busLink bgSpan'><span style='display:none'>" + transGuide.items[transGuide.items.length - 1].endPosition.x + "," + transGuide.items[transGuide.items.length - 1].endPosition.y + "</span>" + transGuide.items[transGuide.items.length - 1].endStopName + "</span></td>").appendTo(endStop);
  208. return table;
  209. }
  210. function setPopup() {
  211. $(".busLink").click(function () {
  212. tempRedLayer.clearLayers();
  213. if (tempMarker) tempMarker.remove();
  214. var points = this.children[0].innerText.split(","), lonLat;
  215. if (points.length === 2) {
  216. lonLat = L.latLng(points[1], points[0]);
  217. tempMarker = L.marker(lonLat).addTo(map);
  218. map.setView(lonLat);
  219. } else if (points.length === 4 && points[3] === "0") {
  220. var linesItems = paths["solutions"][points[0]], lineStr = "[";
  221. for (var i = 0; i < linesItems.length; i++) {
  222. var lineItem = linesItems[i][0], j = parseInt(points[1]);
  223. if (i !== j) {
  224. lineStr += lineItem;
  225. } else if (i === j) {
  226. lineItem = linesItems[points[1]][points[2]];
  227. lineStr += lineItem;
  228. }
  229. if (i !== linesItems.length - 1) {
  230. lineStr += ",";
  231. }
  232. }
  233. lineStr += "]";
  234. $("#transferInfo-" + points[0]).hide(500);
  235. execTransPathQuery(points[0], lineStr);
  236. $("#transferInfo-" + points[0]).show(500);
  237. } else {
  238. var linePoints = [];
  239. for (var i = 0; i < points.length; i++) {
  240. var arr = points[i].split(" ");
  241. var point = [arr[1], arr[0]];
  242. linePoints.push(point);
  243. }
  244. var lineString = L.polyline(linePoints, {color: "red"}).addTo(map);
  245. tempRedLayer.addLayer(lineString);
  246. map.setView(lineString.getBounds().getCenter(), 3);
  247. }
  248. });
  249. }
  250. function bindSolutionsClickEvent() {
  251. for (var i = 0; i < 6; i++) {
  252. $("#transferSolution-" + i).click(toggleGuideItems);
  253. }
  254. function toggleGuideItems(e) {
  255. for (var j = 0; j < 6; j++) {
  256. $("#transferInfo-" + j).hide(500);
  257. }
  258. var id = parseInt(e.currentTarget.id.split("-")[1]);
  259. $("#transferInfo-" + id).show(500);
  260. //构造传入iServer服务器的transferLines
  261. var transLines = [];
  262. for (var i = 0; i < paths.solutions[id].length; i++) {
  263. var trans = paths.solutions[id][i][0];
  264. transLines.push(trans);
  265. }
  266. execTransPathQuery(id, transLines);
  267. }
  268. }
  269. function execTransPathQuery(id, transLines) {
  270. var params = new SuperMap.TransferPathParameters({
  271. points: paths["points"],
  272. transferLines: transLines
  273. });
  274. L.supermap
  275. .trafficTransferAnalystService(serviceUrl)
  276. .analysisTransferPath(params, function (serviceResult) {
  277. $("#transferInfo-" + id).empty();
  278. var transGuide = serviceResult.result;
  279. transSolutions = paths["transSolutions"];
  280. map.setView([-3900, 4700], 2);
  281. fillTransferInfo(transGuide, transSolutions, id).appendTo($("#transferInfo-" + id));
  282. setPopup();
  283. });
  284. }
  285. function handleMapEvent(div, map) {
  286. if (!div || !map) {
  287. return;
  288. }
  289. div.addEventListener('mouseover', function () {
  290. map.dragging.disable();
  291. map.scrollWheelZoom.disable();
  292. map.doubleClickZoom.disable();
  293. });
  294. div.addEventListener('mouseout', function () {
  295. map.dragging.enable();
  296. map.scrollWheelZoom.enable();
  297. map.doubleClickZoom.enable();
  298. });
  299. }
  300. function clearLayer() {
  301. if (routeFeatureGroup) {
  302. routeFeatureGroup.clearLayers();
  303. }
  304. if (tempRedLayer) {
  305. tempRedLayer.clearLayers();
  306. }
  307. if (tempMarker) {
  308. tempMarker.remove();
  309. }
  310. }
  311. </script>
  312. </body>
  313. </html>