amap.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979
  1. const libs = require('../libs');
  2. // https://lbs.amap.com/api/webservice/guide/tools/info
  3. const ERRCODE = {
  4. "10000": 0,
  5. "10001": 190,
  6. "10002": 113,
  7. "10003": 121,
  8. "10004": 120,
  9. "10005": 112,
  10. "10006": 110,
  11. "10007": 111,
  12. "10008": 111,
  13. "10009": 110,
  14. "10010": 122,
  15. "10011": 311,
  16. "10012": 113,
  17. "10013": 190,
  18. "10014": 500,
  19. "10015": 500,
  20. "10016": 500,
  21. "10017": 500,
  22. "10019": 500,
  23. "10020": 500,
  24. "10021": 500,
  25. "10026": 110,
  26. "10029": 500,
  27. "10041": 110,
  28. "10044": 121,
  29. "10045": 121,
  30. "20000": 395,
  31. "20001": 300,
  32. "20002": 500,
  33. "20003": 500,
  34. "20011": 395,
  35. "20012": 395,
  36. "20801": 395,
  37. "20802": 395,
  38. "20803": 373,
  39. "40000": 123,
  40. "40001": 123,
  41. "40002": 123,
  42. "40003": 123
  43. };
  44. class Service {
  45. // 构造函数
  46. constructor(data = {}) {
  47. let {
  48. key,
  49. needOriginalResult = false, // 是否需要返回原始信息,默认false
  50. } = data;
  51. this.config = {
  52. provider: "amap",
  53. key,
  54. needOriginalResult,
  55. serviceUrl: "https://restapi.amap.com"
  56. }
  57. }
  58. async request(obj = {}) {
  59. let {
  60. url,
  61. data = {}
  62. } = obj;
  63. if (url.indexOf("http") !== 0) {
  64. url = `${this.config.serviceUrl}/${url}`
  65. }
  66. if (this.config.key && !data.key) {
  67. data.key = this.config.key;
  68. }
  69. obj.data = JSON.parse(JSON.stringify(obj.data));
  70. let requestRes = await uniCloud.httpclient.request(url, obj);
  71. let result = this.getResult(requestRes);
  72. if (result.errCode != 0) {
  73. throw new libs.error.UniCloudError(result);
  74. }
  75. return result;
  76. }
  77. getResult(requestRes) {
  78. let {
  79. data: originalResult = {}
  80. } = requestRes;
  81. let res = {
  82. errCode: originalResult.infocode == "10000" ? 0 : this.getErrCode(originalResult.infocode),
  83. errMsg: originalResult.info,
  84. originalResult,
  85. };
  86. return res;
  87. }
  88. getErrCode(errCode) {
  89. return ERRCODE[errCode] || errCode;
  90. }
  91. // API - 逆地址解析(坐标转地址)
  92. async location2address(data = {}) {
  93. let {
  94. location,
  95. get_poi,
  96. poi_options,
  97. } = data;
  98. let requestData = {
  99. location: libs.common.getLocation(location, "lat,lng", "lng,lat"),
  100. extensions: get_poi ? "all" : "base",
  101. };
  102. if (get_poi && typeof poi_options == "object") {
  103. let {
  104. poitype,
  105. radius,
  106. roadlevel,
  107. homeorcorp
  108. } = poi_options;
  109. requestData = Object.assign(requestData, {
  110. poitype,
  111. radius,
  112. roadlevel,
  113. homeorcorp
  114. })
  115. }
  116. let requestRes = await this.request({
  117. method: "GET",
  118. url: "v3/geocode/regeo",
  119. dataType: "json",
  120. data: requestData
  121. });
  122. let originalResult = requestRes.originalResult.regeocode;
  123. let pois;
  124. if (originalResult.pois) {
  125. pois = originalResult.pois.map((item) => {
  126. return {
  127. id: item.id,
  128. title: item.name,
  129. address: item.address,
  130. location: libs.common.getLocation(item.location, "lng,lat", "object"),
  131. distance: item.distance,
  132. direction: item.direction,
  133. category: item.type
  134. }
  135. });
  136. }
  137. let roads;
  138. if (originalResult.roads) {
  139. roads = originalResult.roads.map((item) => {
  140. return {
  141. id: item.id,
  142. title: item.name,
  143. distance: Number(item.distance),
  144. direction: item.direction,
  145. location: libs.common.getLocation(item.location, "lng,lat", "object")
  146. }
  147. });
  148. }
  149. let roadinters;
  150. if (originalResult.roadinters) {
  151. roadinters = originalResult.roadinters.map((item) => {
  152. return {
  153. distance: Number(item.distance),
  154. direction: item.direction,
  155. first_id: item.first_id,
  156. first_name: item.first_name,
  157. second_id: item.second_id,
  158. second_name: item.second_name,
  159. location: libs.common.getLocation(item.location, "lng,lat", "object")
  160. }
  161. });
  162. }
  163. let result = {
  164. formatted_addresses: originalResult.formatted_address,
  165. country: originalResult.addressComponent.country,
  166. province: originalResult.addressComponent.province,
  167. city: JSON.stringify(originalResult.addressComponent.city) === "[]" || !originalResult.addressComponent.city ? originalResult.addressComponent.province : originalResult
  168. .addressComponent.city,
  169. district: originalResult.addressComponent.district,
  170. street: originalResult.addressComponent.country,
  171. street_number: originalResult.addressComponent.streetNumber.street + originalResult.addressComponent.streetNumber.number,
  172. adcode: originalResult.addressComponent.adcode,
  173. pois,
  174. roads,
  175. roadinters
  176. };
  177. let res = {
  178. result,
  179. ...requestRes
  180. };
  181. return res;
  182. }
  183. // API - 地址解析(地址转坐标)
  184. async address2location(data = {}) {
  185. let {
  186. address,
  187. city,
  188. } = data;
  189. let requestRes = await this.request({
  190. method: "GET",
  191. url: "v3/geocode/geo",
  192. dataType: "json",
  193. data: {
  194. address,
  195. city
  196. }
  197. });
  198. let originalResult = requestRes.originalResult.geocodes[0];
  199. let result = {
  200. location: libs.common.getLocation(originalResult.location, "lng,lat", "object"),
  201. adcode: originalResult.adcode,
  202. province: originalResult.province,
  203. city: originalResult.city,
  204. district: originalResult.district,
  205. street: originalResult.street,
  206. street_number: originalResult.number,
  207. };
  208. let res = {
  209. result,
  210. ...requestRes
  211. };
  212. return res;
  213. }
  214. // API - 坐标转换
  215. async translate(data = {}) {
  216. let {
  217. locations,
  218. type,
  219. } = data;
  220. let locationsStr = "";
  221. locations.map((item, index) => {
  222. if (index > 0) {
  223. locationsStr += ";";
  224. }
  225. locationsStr += libs.common.getLocation(item, "object", "lng,lat");
  226. })
  227. let coordsys = {
  228. "1": "gps",
  229. "4": "mapbar",
  230. "3": "baidu",
  231. "": "autonavi",
  232. } [type + ""];
  233. let requestRes = await this.request({
  234. method: "GET",
  235. url: "v3/assistant/coordinate/convert",
  236. dataType: "json",
  237. data: {
  238. locations: locationsStr,
  239. coordsys
  240. }
  241. });
  242. let originalResult = requestRes.originalResult;
  243. let returnLocationsStr = originalResult.locations;
  244. let arr = returnLocationsStr.split(";");
  245. let returnLocations = arr.map((item) => {
  246. return libs.common.getLocation(item, "lng,lat", "object");
  247. });
  248. let result = {
  249. locations: returnLocations
  250. };
  251. let res = {
  252. result,
  253. ...requestRes
  254. };
  255. return res;
  256. }
  257. // API - IP定位
  258. async ip2location(data = {}) {
  259. let {
  260. ip,
  261. } = data;
  262. let requestRes = await this.request({
  263. method: "GET",
  264. url: "v3/ip",
  265. dataType: "json",
  266. data: {
  267. ip
  268. }
  269. });
  270. let originalResult = requestRes.originalResult;
  271. let result = {
  272. adcode: originalResult.adcode,
  273. province: originalResult.province,
  274. city: originalResult.city,
  275. rectangle: originalResult.rectangle
  276. };
  277. let res = {
  278. result,
  279. ...requestRes
  280. };
  281. return res;
  282. }
  283. // API - 关键词输入提示
  284. async inputtips(data = {}) {
  285. let {
  286. keyword,
  287. city,
  288. citylimit,
  289. location,
  290. datatype,
  291. } = data;
  292. let requestData = {
  293. keywords: keyword,
  294. city,
  295. citylimit,
  296. datatype
  297. };
  298. if (location) {
  299. requestData.location = libs.common.getLocation(location, "object", "lng,lat");
  300. }
  301. let requestRes = await this.request({
  302. method: "GET",
  303. url: "v3/assistant/inputtips",
  304. dataType: "json",
  305. data: requestData,
  306. });
  307. let originalResult = requestRes.originalResult;
  308. let _data = originalResult.tips.map((item) => {
  309. return {
  310. id: item.id,
  311. name: item.name,
  312. address: item.address,
  313. location: libs.common.getLocation(item.location, "lng,lat", "object"),
  314. adcode: item.adcode,
  315. district: item.district
  316. }
  317. });
  318. let result = {
  319. data: _data
  320. };
  321. let res = {
  322. result,
  323. ...requestRes
  324. };
  325. return res;
  326. }
  327. // API - 周边搜索
  328. async search(data = {}) {
  329. let {
  330. keyword,
  331. location,
  332. radius = 1000,
  333. auto_extend = 1,
  334. get_subpois,
  335. orderby,
  336. page_index = 1,
  337. page_size = 20,
  338. types,
  339. city
  340. } = data;
  341. let requestData = {
  342. keywords: keyword,
  343. types,
  344. location: libs.common.getLocation(location, "object", "lng,lat"),
  345. radius,
  346. sortrule: orderby,
  347. region: city,
  348. city_limit: auto_extend ? false : true,
  349. page_num: page_index,
  350. page_size,
  351. show_fields: get_subpois ? "children,business,navi,photos" : "business,navi,photos"
  352. };
  353. let requestRes = await this.request({
  354. method: "GET",
  355. url: "v5/place/around",
  356. dataType: "json",
  357. data: requestData
  358. });
  359. let originalResult = requestRes.originalResult;
  360. let _data = originalResult.pois.map((item) => {
  361. return {
  362. id: item.id,
  363. title: item.name,
  364. tel: item.business.tel,
  365. address: item.address,
  366. category: item.type,
  367. location: libs.common.getLocation(item.location, "lng,lat", "object"),
  368. distance: Number(item.distance),
  369. adcode: item.adcode,
  370. province: item.pname,
  371. city: item.cityname,
  372. district: item.adname,
  373. children: item.children ? item.children.map((item2) => {
  374. return {
  375. parent_id: item.id,
  376. id: item2.id,
  377. title: item2.name,
  378. address: item2.address,
  379. category: item2.subtype,
  380. location: libs.common.getLocation(item2.location, "lng,lat", "object")
  381. }
  382. }) : get_subpois ? [] : undefined,
  383. }
  384. });
  385. let result = {
  386. data: _data
  387. };
  388. let res = {
  389. result,
  390. ...requestRes
  391. };
  392. return res;
  393. }
  394. // API - 行政区划
  395. async districtSearch(data = {}) {
  396. let {
  397. adcode,
  398. get_polygon,
  399. page_index,
  400. page_size,
  401. filter,
  402. subdistrict
  403. } = data;
  404. let requestData = {
  405. keywords: adcode,
  406. subdistrict,
  407. page: page_index,
  408. offset: page_size,
  409. filter
  410. };
  411. let requestRes = await this.request({
  412. method: "GET",
  413. url: "v3/config/district",
  414. dataType: "json",
  415. data: requestData
  416. });
  417. let originalResult = requestRes.originalResult;
  418. const formatDistricts = (list) => {
  419. return list.map((item) => {
  420. return {
  421. adcode: item.adcode,
  422. name: item.name,
  423. fullname: item.name,
  424. location: libs.common.getLocation(item.center, "lng,lat", "object"),
  425. level: item.level,
  426. children: typeof item.districts !== "undefined" ? formatDistricts(item.districts): undefined,
  427. //polygon: item.polyline,
  428. }
  429. });
  430. }
  431. let _data = formatDistricts(originalResult.districts[0].districts);
  432. let result = {
  433. data: _data
  434. };
  435. let res = {
  436. result,
  437. ...requestRes
  438. };
  439. return res;
  440. }
  441. // API - 路线规划(驾车)
  442. async drivingRoute(data = {}) {
  443. let {
  444. mode,
  445. from,
  446. to,
  447. from_poi,
  448. to_poi,
  449. policy,
  450. waypoints,
  451. avoid_polygons,
  452. road_type,
  453. plate_number,
  454. cartype,
  455. avoidroad,
  456. ferry,
  457. } = data;
  458. let requestRes = await this.request({
  459. method: "GET",
  460. url: `v5/direction/driving`,
  461. dataType: "json",
  462. data: {
  463. origin: libs.common.getLocation(from, "lat,lng", "lng,lat"),
  464. destination: libs.common.getLocation(to, "lat,lng", "lng,lat"),
  465. origin_id: from_poi,
  466. destination_id: to_poi,
  467. strategy: policy,
  468. waypoints: libs.common.getReversalLocation(waypoints),
  469. avoidpolygons: libs.common.getReversalLocation(avoid_polygons),
  470. origin_type: road_type,
  471. plate: plate_number,
  472. cartype,
  473. avoidroad,
  474. ferry,
  475. show_fields: "cost,tmcs,navi,cities,polyline"
  476. }
  477. });
  478. let originalResult = requestRes.originalResult.route;
  479. let routes = originalResult.paths.map((item) => {
  480. let steps = item.steps.map((item2) => {
  481. return {
  482. instruction: item2.instruction,
  483. road_name: item2.road_name,
  484. dir_desc: item2.orientation,
  485. distance: Number(item2.step_distance),
  486. act_desc: item2.navi.action,
  487. accessorial_desc: item2.navi.assistant_action,
  488. cost: this.costFormat(item2.cost),
  489. speed: item2.tmcs ? item2.tmcs.map((item3) => {
  490. let levelIndex = {
  491. "畅通": 0,
  492. "缓行": 1,
  493. "拥堵": 2,
  494. "未知": 3,
  495. "严重拥堵": 4,
  496. }
  497. return {
  498. distance: Number(item3.tmc_distance),
  499. level: levelIndex[item3.tmc_status],
  500. polyline: this.polylineFormat(item3.tmc_polyline),
  501. }
  502. }) : undefined,
  503. cities: item2.cities,
  504. polyline: this.polylineFormat(item2.polyline),
  505. }
  506. });
  507. return {
  508. mode: "driving",
  509. distance: Number(item.distance),
  510. restriction_status: Number(item.restriction),
  511. taxi_cost: Number(originalResult.taxi_cost),
  512. steps
  513. }
  514. });
  515. let result = {
  516. routes
  517. };
  518. let res = {
  519. result,
  520. ...requestRes
  521. };
  522. return res;
  523. }
  524. // API - 路线规划(步行)
  525. async walkingRoute(data = {}) {
  526. let {
  527. mode,
  528. from,
  529. to,
  530. alternative_route,
  531. } = data;
  532. let requestRes = await this.request({
  533. method: "GET",
  534. url: `v5/direction/walking`,
  535. dataType: "json",
  536. data: {
  537. origin: libs.common.getLocation(from, "lat,lng", "lng,lat"),
  538. destination: libs.common.getLocation(to, "lat,lng", "lng,lat"),
  539. alternative_route,
  540. show_fields: "cost,navi,polyline", // 此处强制传,为了和腾讯地图字段对齐
  541. }
  542. });
  543. let originalResult = requestRes.originalResult.route;
  544. let routes = originalResult.paths.map((item) => {
  545. let duration1 = 0;
  546. let steps = item.steps.map((item2) => {
  547. let duration2 = this.durationFormat(item2.cost.duration);
  548. duration1 += duration2;
  549. return {
  550. instruction: item2.instruction,
  551. road_name: item2.road_name,
  552. dir_desc: item2.orientation,
  553. distance: Number(item2.step_distance),
  554. act_desc: item2.navi.action || item2.navi.assistant_action,
  555. taxi_cost: item2.cost.taxi ? this.priceFormat(item2.cost.taxi) : undefined,
  556. duration: duration2,
  557. polyline: this.polylineFormat(item2.polyline),
  558. }
  559. });
  560. return {
  561. mode: "walking",
  562. distance: Number(item.distance),
  563. duration: duration1,
  564. steps
  565. }
  566. });
  567. let result = {
  568. routes
  569. };
  570. let res = {
  571. result,
  572. ...requestRes
  573. };
  574. return res;
  575. }
  576. // API - 路线规划(骑行)
  577. async bicyclingRoute(data = {}) {
  578. let {
  579. mode,
  580. from,
  581. to,
  582. alternative_route,
  583. } = data;
  584. let requestRes = await this.request({
  585. method: "GET",
  586. url: `v5/direction/bicycling`,
  587. dataType: "json",
  588. data: {
  589. origin: libs.common.getLocation(from, "lat,lng", "lng,lat"),
  590. destination: libs.common.getLocation(to, "lat,lng", "lng,lat"),
  591. alternative_route,
  592. show_fields: "cost,navi,polyline", // 此处强制传,为了和腾讯地图字段对齐
  593. }
  594. });
  595. let originalResult = requestRes.originalResult.route;
  596. let routes = originalResult.paths.map((item) => {
  597. let duration1 = 0;
  598. let steps = item.steps.map((item2) => {
  599. let duration2 = this.durationFormat(item2.cost.duration);
  600. duration1 += duration2;
  601. return {
  602. instruction: item2.instruction,
  603. road_name: item2.road_name,
  604. dir_desc: item2.orientation,
  605. distance: Number(item2.step_distance),
  606. act_desc: item2.navi.action || item2.navi.assistant_action,
  607. duration: duration2,
  608. polyline: this.polylineFormat(item2.polyline),
  609. }
  610. });
  611. return {
  612. mode: "walking",
  613. distance: Number(item.distance),
  614. duration: duration1,
  615. steps
  616. }
  617. });
  618. let result = {
  619. routes
  620. };
  621. let res = {
  622. result,
  623. ...requestRes
  624. };
  625. return res;
  626. }
  627. // API - 路线规划(电动车)
  628. async ebicyclingRoute(data = {}) {
  629. let {
  630. mode,
  631. from,
  632. to,
  633. alternative_route,
  634. } = data;
  635. let requestRes = await this.request({
  636. method: "GET",
  637. url: `v5/direction/electrobike`,
  638. dataType: "json",
  639. data: {
  640. origin: libs.common.getLocation(from, "lat,lng", "lng,lat"),
  641. destination: libs.common.getLocation(to, "lat,lng", "lng,lat"),
  642. alternative_route,
  643. show_fields: "cost,navi,polyline", // 此处强制传,为了和腾讯地图字段对齐
  644. }
  645. });
  646. let originalResult = requestRes.originalResult.route;
  647. let routes = originalResult.paths.map((item) => {
  648. let duration1 = 0;
  649. let steps = item.steps.map((item2) => {
  650. let duration2 = this.durationFormat(item2.cost.duration);
  651. duration1 += duration2;
  652. return {
  653. instruction: item2.instruction,
  654. road_name: item2.road_name,
  655. dir_desc: item2.orientation,
  656. distance: Number(item2.step_distance),
  657. act_desc: item2.navi.action || item2.navi.assistant_action,
  658. duration: duration2,
  659. polyline: this.polylineFormat(item2.polyline),
  660. }
  661. });
  662. return {
  663. mode: "walking",
  664. distance: Number(item.distance),
  665. duration: duration1,
  666. steps
  667. }
  668. });
  669. let result = {
  670. routes
  671. };
  672. let res = {
  673. result,
  674. ...requestRes
  675. };
  676. return res;
  677. }
  678. // API - 路线规划(公交)
  679. async transitRoute(data = {}) {
  680. let {
  681. mode,
  682. from,
  683. to,
  684. from_poi,
  685. to_poi,
  686. policy,
  687. ad1,
  688. ad2,
  689. city1,
  690. city2,
  691. alternative_route,
  692. multiexport,
  693. max_trans,
  694. nightflag,
  695. date,
  696. time
  697. } = data;
  698. let requestRes = await this.request({
  699. method: "GET",
  700. url: `v5/direction/transit/integrated`,
  701. dataType: "json",
  702. data: {
  703. origin: libs.common.getLocation(from, "lat,lng", "lng,lat"),
  704. destination: libs.common.getLocation(to, "lat,lng", "lng,lat"),
  705. originpoi: from_poi,
  706. destinationpoi: to_poi,
  707. strategy: policy,
  708. ad1,
  709. ad2,
  710. city1,
  711. city2,
  712. AlternativeRoute: alternative_route,
  713. multiexport,
  714. max_trans,
  715. nightflag,
  716. date,
  717. time,
  718. show_fields: "cost,navi,polyline", // 此处强制传,为了和腾讯地图字段对齐
  719. }
  720. });
  721. let originalResult = requestRes.originalResult.route;
  722. let routes = originalResult.transits.map((item) => {
  723. let stepsItem = this.getSteps(item.segments);
  724. let steps = stepsItem.map((item2) => {
  725. let mode = item2.mode.toLowerCase();
  726. if (mode === "walking") {
  727. // 步行
  728. return {
  729. mode: "walking",
  730. distance: Number(item2.distance),
  731. duration: this.durationFormat(item2.cost.duration),
  732. steps: item2.steps.map((item3) => {
  733. return {
  734. instruction: item3.instruction,
  735. road_name: item3.road,
  736. distance: Number(item3.distance),
  737. act_desc: item3.navi.action || item3.navi.assistant_action,
  738. polyline: this.polylineFormat(item3.polyline)
  739. }
  740. }),
  741. }
  742. } else if (mode === "bus") {
  743. return {
  744. mode: "transit",
  745. lines: item2.buslines.map((item3) => {
  746. return {
  747. vehicle: item3.type.indexOf("地铁") > -1 ? "SUBWAY" : "BUS",
  748. id: item3.id,
  749. title: item3.name,
  750. type: item3.type,
  751. station_count: Number(item3.via_num),
  752. distance: Number(item3.distance),
  753. duration: this.durationFormat(item3.cost.duration),
  754. polyline: this.polylineFormat(item3.polyline),
  755. start_time: item3.start_time,
  756. end_time: item3.end_time,
  757. geton: {
  758. id: item3.departure_stop.id,
  759. title: item3.departure_stop.name,
  760. location: libs.common.getLocation(item3.departure_stop.location, "lng,lat", "object"),
  761. },
  762. getoff: {
  763. id: item3.arrival_stop.id,
  764. title: item3.arrival_stop.name,
  765. location: libs.common.getLocation(item3.arrival_stop.location, "lng,lat", "object"),
  766. },
  767. stations: item3.via_stops.map((item4) => {
  768. return {
  769. id: item4.id,
  770. title: item4.name,
  771. location: libs.common.getLocation(item4.location, "lng,lat", "object"),
  772. }
  773. })
  774. }
  775. }),
  776. }
  777. } else if (mode === "railway") {
  778. // 火车
  779. let item3 = item2;
  780. return {
  781. mode: "transit",
  782. lines: [{
  783. vehicle: "RAIL",
  784. id: item3.id,
  785. title: item3.name,
  786. type: item3.type,
  787. distance: Number(item3.distance),
  788. duration: this.durationFormat(item3.time),
  789. geton: {
  790. id: item3.departure_stop.id,
  791. title: item3.departure_stop.name,
  792. location: libs.common.getLocation(item3.departure_stop.location, "lng lat", "object"),
  793. adcode: item3.departure_stop.adcode,
  794. time: item3.departure_stop.time,
  795. start: Number(item3.departure_stop.start),
  796. },
  797. getoff: {
  798. id: item3.arrival_stop.id,
  799. title: item3.arrival_stop.name,
  800. location: libs.common.getLocation(item3.arrival_stop.location, "lng lat", "object"),
  801. adcode: item3.arrival_stop.adcode,
  802. time: item3.arrival_stop.time,
  803. end: Number(item3.arrival_stop.end),
  804. },
  805. spaces: item3.spaces ? item3.spaces.map((item4) => {
  806. return {
  807. code: item4.code,
  808. cost: this.priceFormat(item4.cost),
  809. }
  810. }) : undefined
  811. }],
  812. }
  813. } else if (mode === "taxi") {
  814. // 打车
  815. let item3 = item2;
  816. return {
  817. mode: "transit",
  818. lines: [{
  819. vehicle: "TAXI",
  820. distance: Number(item3.distance),
  821. price: this.priceFormat(item3.price),
  822. drivetime: this.durationFormat(item3.drivetime),
  823. polyline: this.polylineFormat(item3.polyline),
  824. startpoint: libs.common.getLocation(item3.startpoint, "lng,lat", "lat,lng"),
  825. startname: item3.startname,
  826. endpoint: libs.common.getLocation(item3.endpoint, "lng,lat", "lat,lng"),
  827. endname: item3.endname
  828. }]
  829. }
  830. }
  831. });
  832. return {
  833. mode: "transit",
  834. distance: Number(item.distance),
  835. duration: this.durationFormat(item.cost.duration),
  836. transit_fee: this.priceFormat(item.cost.transit_fee),
  837. steps
  838. }
  839. });
  840. let result = {
  841. routes
  842. };
  843. let res = {
  844. result,
  845. ...requestRes
  846. };
  847. return res;
  848. }
  849. getSteps(segments) {
  850. let steps = [];
  851. segments.map((item, index) => {
  852. for (let mode in item) {
  853. steps.push({
  854. mode,
  855. ...item[mode]
  856. });
  857. }
  858. });
  859. return steps;
  860. }
  861. // 格式化价格,将字符串价格转成数值,保留2位小数
  862. priceFormat(price) {
  863. try {
  864. if (price === "") {
  865. return -1;
  866. } else {
  867. return parseFloat(Number(price).toFixed(2));
  868. }
  869. } catch (err) {
  870. return -1;
  871. }
  872. }
  873. // 格式化cost
  874. costFormat(cost = {}) {
  875. let {
  876. duration,
  877. taxi_cost,
  878. transit_fee,
  879. tolls,
  880. toll_distance,
  881. toll_road,
  882. traffic_lights
  883. } = cost;
  884. let res = {};
  885. if (typeof duration !== "undefined") res.duration = this.durationFormat(duration);
  886. if (typeof taxi_cost !== "undefined") res.taxi_cost = this.priceFormat(taxi_cost);
  887. if (typeof transit_fee !== "undefined") res.transit_fee = this.priceFormat(transit_fee);
  888. if (typeof tolls !== "undefined") res.tolls = this.priceFormat(tolls);
  889. if (typeof toll_distance !== "undefined") res.toll_distance = Number(toll_distance);
  890. if (typeof toll_road !== "undefined") res.toll_road = toll_road;
  891. if (typeof traffic_lights !== "undefined") res.traffic_lights = Number(traffic_lights);
  892. return res;
  893. }
  894. // 格式化polyline,将原本polyline.polyline转成polyline
  895. polylineFormat(polyline = {}) {
  896. if (polyline.polyline) {
  897. return libs.common.getReversalLocation(polyline.polyline);
  898. } else if (typeof polyline === "string") {
  899. return libs.common.getReversalLocation(polyline);
  900. } else {
  901. return "";
  902. }
  903. }
  904. // 格式化时间(秒转分,向上进1)
  905. durationFormat(duration) {
  906. try {
  907. return Math.ceil(Number(duration) / 60);
  908. } catch (err) {
  909. return undefined;
  910. }
  911. }
  912. }
  913. module.exports = Service;