06_trafficTransferAnalystService.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  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. <script type="text/javascript" src="../../dist/ol/include-ol.js"></script>
  11. <style>
  12. .transferSolution {
  13. cursor: pointer;
  14. margin: 10px 10px;
  15. }
  16. .transferInfo a {
  17. cursor: pointer;
  18. }
  19. table {
  20. width: 90%;
  21. }
  22. #trafficRes {
  23. margin: 5px;
  24. }
  25. .ol-popup {
  26. position: absolute;
  27. background-color: white;
  28. filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));
  29. border-radius: 5px;
  30. border: 1px solid #cccccc;
  31. top: 0;
  32. right: 0;
  33. min-width: 280px;
  34. }
  35. </style>
  36. </head>
  37. <body style=" margin: 0;overflow: hidden;background: #fff;width: 100%;height:100%; position: absolute;top: 0;">
  38. <div id="map" style="width: 100%;height:100%"></div>
  39. <div id="startMarker">
  40. <img src="../img/start_trans.png"/>
  41. </div>
  42. <div id="endMarker">
  43. <img src="../img/end_trans.png"/>
  44. </div>
  45. <div id="popup" class="ol-popup">
  46. <div id="popup-content"></div>
  47. </div>
  48. <script type="text/javascript">
  49. var map, startMarker, endMarker, container, content, tempMarker,
  50. stopSourceLayer, roadSourceLayer, tempMarkerSourceLayer, tempRedSourceLayer,
  51. info, paths = {transSolutions: null, solutions: null},
  52. baseUrl = (window.isLocal ? window.server : "https://iserver.supermap.io") + "/iserver/services/map-changchun/rest/maps/长春市区图",
  53. serviceUrl = (window.isLocal ? window.server : "https://iserver.supermap.io") + "/iserver/services/traffictransferanalyst-sample/restjsr/traffictransferanalyst/Traffic-Changchun";
  54. var extent = [48.4, -7668.25, 8958.85, -55.58];
  55. var projection = new ol.proj.Projection({
  56. code:'',
  57. extent: extent,
  58. units: 'm'
  59. });
  60. new ol.supermap.MapService(baseUrl).getMapInfo(function (serviceResult) {
  61. var mapJSONObj = serviceResult.result;
  62. map = new ol.Map({
  63. target: 'map',
  64. controls: ol.control.defaults({attributionOptions: {collapsed: false}})
  65. .extend([new ol.supermap.control.Logo()]),
  66. view: new ol.View({
  67. center: [4700, -3600],
  68. zoom: 2,
  69. projection: projection,
  70. multiWorld: true
  71. })
  72. });
  73. var options = ol.source.TileSuperMapRest.optionsFromMapJSON(baseUrl, mapJSONObj);
  74. var layer = new ol.layer.Tile({
  75. source: new ol.source.TileSuperMapRest(options)
  76. });
  77. stopSourceLayer = new ol.source.Vector();
  78. roadSourceLayer = new ol.source.Vector();
  79. tempRedSourceLayer = new ol.source.Vector();
  80. tempMarkerSourceLayer = new ol.source.Vector();
  81. map.addLayer(layer);
  82. //设置起始、终止点并添加到地图上
  83. startMarker = new ol.Overlay({
  84. element: document.getElementById('startMarker'),
  85. positioning: 'center-center',
  86. position: [3111.42533851, -5527.73795456]
  87. });
  88. endMarker = new ol.Overlay({
  89. element: document.getElementById('endMarker'),
  90. positioning: 'center-center',
  91. position: [6055.3431955, -4270.0725196]
  92. });
  93. map.addOverlay(startMarker);
  94. map.addOverlay(endMarker);
  95. initResultInfoWin();
  96. execTransSolutionsQuery('LESS_TIME'); //交通换乘的有4种方式:'LESS_TIME','MIN_DISTANCE','LESS_WALK','LESS_TRANSFER'
  97. });
  98. function initResultInfoWin() {
  99. container = document.getElementById('popup');
  100. content = document.getElementById('popup-content');
  101. info = new ol.control.Control({element: container});
  102. info.setMap(map);
  103. info.update = function (transSolutions, transGuide) {
  104. if (!transSolutions) {
  105. return;
  106. }
  107. var solution, lines, line, dispStatus = "block";
  108. $("<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(content);
  109. for (var i = 0, iLen = transSolutions.length; i < iLen; i++) {
  110. solution = transSolutions[i];
  111. //显示方案头
  112. var title = "";
  113. for (var ii = 0, iiLen = solution.linesItems.length; ii < iiLen; ii++) {
  114. lines = solution.linesItems[ii];
  115. for (var iii = 0, iiiLen = lines.lineItems.length; iii < iiiLen; iii++) {
  116. line = lines.lineItems[iii];
  117. if (iii !== iiiLen - 1) {
  118. title += line.lineName + "/";
  119. } else {
  120. title += line.lineName;
  121. }
  122. }
  123. if (ii !== iiLen - 1) {
  124. title += " → ";
  125. }
  126. }
  127. $("<div class='transferSolution' id='transferSolution-" + i + "'><span class='transferIndex'>" + resources.text_scheme + (i + 1) + ":</span>" + title + "</div>").appendTo(content);
  128. if (i !== 0) {
  129. dispStatus = "none";
  130. }
  131. var list = $("<div class='transferInfo' id='transferInfo-" + i + "' style='display:" + dispStatus + "'></div>");
  132. list.appendTo(content);
  133. //默认显示方案1下的table
  134. if (i === 0) {
  135. fillTransferInfo(transGuide, transSolutions, 0).appendTo(list);
  136. setPopup();
  137. }
  138. }
  139. //点击方案时显示对应的table
  140. bindSolutionsClickEvent();
  141. };
  142. map.addControl(info);
  143. }
  144. function execTransSolutionsQuery(tactic) {
  145. paths.points = [26, 180];
  146. var params = new SuperMap.TransferSolutionParameters({
  147. solutionCount: 6, //最大换乘导引数量
  148. transferTactic: tactic, //公交换乘策略类型
  149. walkingRatio: 10, //步行与公交的消耗权重比
  150. points: paths.points //起始点坐标
  151. });
  152. new ol.supermap.TrafficTransferAnalystService(serviceUrl)
  153. .analysisTransferSolution(params, function (serviceResult) {
  154. transferSolutionsSucceed(serviceResult.result);
  155. });
  156. }
  157. function transferSolutionsSucceed(result) {
  158. clearLayer();
  159. //在地图上叠加符号信息
  160. var transGuide = result.defaultGuide,
  161. transSolutions = result.solutionItems,
  162. solutions = [];
  163. for (var j = 0; j < transSolutions.length; j++) {
  164. var linesItems = transSolutions[j].linesItems, transSolution = [];
  165. for (var jj = 0; jj < linesItems.length; jj++) {
  166. var lineItems = linesItems[jj].lineItems, items = [];
  167. for (var jjj = 0; jjj < lineItems.length; jjj++) {
  168. var lineItem = lineItems[jjj];
  169. items.push(lineItem
  170. );
  171. }
  172. transSolution.push(items);
  173. }
  174. solutions.push(transSolution);
  175. }
  176. paths["transSolutions"] = transSolutions;
  177. paths["solutions"] = solutions;
  178. if (!transGuide || !transSolutions) return;
  179. info.update(transSolutions, transGuide);
  180. }
  181. function fillTransferInfo(transGuide, transSolutions, indexX) {
  182. clearLayer();
  183. //在地图上显示路线
  184. if (transGuide && transGuide.items.length) {
  185. var items = transGuide.items;
  186. for (var itemIndex = 0, itemLen = items.length; itemIndex < itemLen; itemIndex++) {
  187. var geometry = items[itemIndex].route;
  188. var pointsList = [];
  189. for (var k = 0; k < geometry.points.length; k++) {
  190. pointsList.push([geometry.points[k].x, geometry.points[k].y]);
  191. }
  192. var roadLine = new ol.geom.LineString(pointsList);
  193. roadSourceLayer.addFeatures([new ol.Feature(roadLine)]);
  194. var roadResultLayer = new ol.layer.Vector({
  195. source: roadSourceLayer,
  196. style: new ol.style.Style({
  197. stroke: new ol.style.Stroke({
  198. color: 'dodgerblue',
  199. width: 3
  200. })
  201. })
  202. });
  203. map.addLayer(roadResultLayer);
  204. }
  205. }
  206. var table = $("<table id='trafficRes' border='1'></table>");
  207. var startStop = $("<tr></tr>");
  208. $("<td class='start_transfer' width='10px'></td>").appendTo(startStop);
  209. $("<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);
  210. startStop.appendTo(table);
  211. var indexY = 0;
  212. for (var m = 0, mLen = transGuide.items.length; m < mLen; m++) {
  213. var item = transGuide.items[m];
  214. var tr2 = $("<tr></tr>");
  215. if (item.isWalking) {
  216. $("<td class='step_transfer' ></td>").appendTo(tr2);
  217. $("<td>" + resources.text_walkTO + "<a class='busLink'><span style='display:none'>" + item.endPosition.x + "," + item.endPosition.y + "</span>" + item.endStopName + "</a></td>").appendTo(tr2);
  218. $("<td>" + parseInt(item.distance) + resources.msg_m + "</td>").appendTo(tr2);
  219. } else {
  220. var otherLines = transSolutions[indexX].linesItems[indexY],
  221. links = "";
  222. if (otherLines && otherLines.lineItems.length > 1) {
  223. links = "</br>" + resources.text_alsoRide;
  224. for (var oti = 0, otLen = otherLines.lineItems.length; oti < otLen; oti++) {
  225. var line = otherLines.lineItems[oti];
  226. if (item.lineName !== line.lineName) {
  227. var other = indexX + "," + indexY + "," + oti + ",0";
  228. links += "<a class='busLink'><span style='display:none'>" + other + "</span>" + line.lineName + "</a>";
  229. }
  230. }
  231. }
  232. $("<td class='bus_transfer'></td>").appendTo(tr2);
  233. var points = item.route.points, pointStr = "";
  234. for (var i = 0; i < points.length; i++) {
  235. pointStr += points[i].x + " " + points[i].y;
  236. if (i != points.length - 1) {
  237. pointStr += ",";
  238. }
  239. }
  240. $("<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);
  241. $("<td>" + item.passStopCount + resources.text_stops + "</td>").appendTo(tr2);
  242. indexY++;
  243. }
  244. tr2.appendTo(table);
  245. }
  246. var endStop = $("<tr></tr>");
  247. endStop.appendTo(table);
  248. $("<td class='end_transfer' width='10px'></td>").appendTo(endStop);
  249. $("<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);
  250. return table;
  251. }
  252. function bindSolutionsClickEvent() {
  253. for (var i = 0; i < 6; i++) {
  254. $("#transferSolution-" + i).click(toggleGuideItems);
  255. }
  256. function toggleGuideItems(e) {
  257. for (var j = 0; j < 6; j++) {
  258. $("#transferInfo-" + j).hide(500);
  259. }
  260. var id = parseInt(e.currentTarget.id.split("-")[1]);
  261. $("#transferInfo-" + id).show(500);
  262. //构造传入iServer服务器的transferLines
  263. var transLines = [];
  264. for (var i = 0; i < paths.solutions[id].length; i++) {
  265. var trans = paths.solutions[id][i][0];
  266. transLines.push(trans);
  267. }
  268. execTransPathQuery(id, transLines);
  269. }
  270. }
  271. //在popup里点击每个站点、交通路线时,在地图上对应显示并进行强调
  272. function setPopup() {
  273. $(".busLink").click(function () {
  274. if (tempMarkerSourceLayer) {
  275. tempMarkerSourceLayer.clear();
  276. }
  277. if (tempRedSourceLayer) {
  278. tempRedSourceLayer.clear();
  279. }
  280. var points = this.children[0].innerText.split(",");
  281. //添加换乘点的marker
  282. if (points.length === 2) {
  283. tempMarker = new ol.geom.Point([points[0], points[1]]);
  284. var iconStyle_marker = new ol.style.Style({
  285. image: new ol.style.Icon(({
  286. src: '../img/marker.png',
  287. anchor: [0.5, 1]
  288. }))
  289. });
  290. var tempMarkerFeature = new ol.Feature(tempMarker);
  291. tempMarkerFeature.setStyle(iconStyle_marker);
  292. tempMarkerSourceLayer.addFeatures([tempMarkerFeature]);
  293. var markerLayer = new ol.layer.Vector({
  294. source: tempMarkerSourceLayer
  295. });
  296. map.addLayer(markerLayer);
  297. var coords = tempMarker.getCoordinates();
  298. map.getView().setCenter([parseInt(coords[0]), parseInt(coords[1])]);
  299. map.getView().setZoom(3)
  300. } else if (points.length === 4 && points[3] === "0") {
  301. var linesItems = paths["solutions"][points[0]], lineStr = "[";
  302. for (var i = 0; i < linesItems.length; i++) {
  303. var lineItem = linesItems[i][0], j = parseInt(points[1]);
  304. if (i !== j) {
  305. lineStr += lineItem;
  306. } else if (i === j) {
  307. lineItem = linesItems[points[1]][points[2]];
  308. lineStr += lineItem;
  309. }
  310. if (i !== linesItems.length - 1) {
  311. lineStr += ",";
  312. }
  313. }
  314. lineStr += "]";
  315. $("#transferInfo-" + points[0]).hide(500);
  316. execTransPathQuery(points[0], lineStr);
  317. $("#transferInfo-" + points[0]).show(500);
  318. } else {
  319. var linePoints = [];
  320. for (var i = 0; i < points.length; i++) {
  321. var arr = points[i].split(" ");
  322. var point = [parseInt(arr[0]), parseInt(arr[1])];
  323. linePoints.push(point);
  324. }
  325. var lineString = new ol.geom.LineString(linePoints);
  326. tempRedSourceLayer.addFeatures([new ol.Feature(lineString)]);
  327. var tempRedLayer = new ol.layer.Vector({
  328. source: tempRedSourceLayer,
  329. style: new ol.style.Style({
  330. stroke: new ol.style.Stroke({
  331. color: 'red',
  332. width: 6
  333. })
  334. })
  335. });
  336. map.addLayer(tempRedLayer);
  337. //设置线路中心
  338. var lineCenter = [];
  339. if ((linePoints.length) % 2 == 0) {
  340. lineCenter = [linePoints[linePoints.length / 2][0], linePoints[linePoints.length / 2][1]];
  341. map.getView().setCenter([parseInt(lineCenter[0]), parseInt(lineCenter[1])]);
  342. } else {
  343. lineCenter = [linePoints[(linePoints.length + 1) / 2][0], linePoints[(linePoints.length + 1) / 2][1]];
  344. map.getView().setCenter([parseInt(lineCenter[0]), parseInt(lineCenter[1])]);
  345. }
  346. map.getView().setZoom(3);
  347. }
  348. });
  349. }
  350. function execTransPathQuery(id, transLines) {
  351. var params = new SuperMap.TransferPathParameters({
  352. points: paths["points"],
  353. transferLines: transLines
  354. });
  355. new ol.supermap.TrafficTransferAnalystService(serviceUrl)
  356. .analysisTransferPath(params, function (serviceResult) {
  357. $("#transferInfo-" + id).empty();
  358. var transGuide = serviceResult.result;
  359. transSolutions = paths["transSolutions"];
  360. map.getView().setCenter([4700, -3600]);
  361. map.getView().setZoom(2);
  362. fillTransferInfo(transGuide, transSolutions, id).appendTo($("#transferInfo-" + id));
  363. setPopup();
  364. });
  365. }
  366. function clearLayer() {
  367. if (roadSourceLayer) {
  368. roadSourceLayer.clear();
  369. }
  370. if (tempMarkerSourceLayer) {
  371. tempMarkerSourceLayer.clear();
  372. }
  373. if (tempRedSourceLayer) {
  374. tempRedSourceLayer.clear();
  375. }
  376. }
  377. </script>
  378. </body>
  379. </html>