@heycar/heycars-map 2.7.1 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/v2/App.js +2 -2
  2. package/dist/v2/api/gaodeDirectionDriving.js +21 -6
  3. package/dist/v2/business-components/BusinessQuotingMap/BusinessQuotingMap.js +6 -4
  4. package/dist/v2/business-components/BusinessTaxiServiceMap/BusinessTaxiServiceSection.js +22 -13
  5. package/dist/v2/business-components/DrivingLine/DrivingLine.d.ts +5 -1
  6. package/dist/v2/business-components/DrivingLine/DrivingLine.js +44 -10
  7. package/dist/v2/business-components/DrivingRoute/DrivingRoute.d.ts +2 -1
  8. package/dist/v2/business-components/DrivingRoute/DrivingRoute.js +4 -2
  9. package/dist/v2/business-components/TrafficDrivingLine/TrafficDrivingLine.d.ts +6 -0
  10. package/dist/v2/business-components/TrafficDrivingLine/TrafficDrivingLine.js +93 -0
  11. package/dist/v2/business-components/TrafficDrivingLine/index.d.ts +1 -0
  12. package/dist/v2/business-components/TrafficDrivingLine/index.js +4 -0
  13. package/dist/v2/components/Amap/Amap.d.ts +2 -3
  14. package/dist/v2/components/Amap/Amap.js +2 -11
  15. package/dist/v2/components/AmapMarker/AmapMarker.js +12 -3
  16. package/dist/v2/components/MapProvider/MapProvider.js +2 -2
  17. package/dist/v2/hooks/useDeviationCorrectionDrivingRoute.d.ts +2 -0
  18. package/dist/v2/hooks/useDrivingRoute.d.ts +3 -0
  19. package/dist/v2/hooks/useDrivingRoute.js +2 -1
  20. package/dist/v2/hooks/useDrivingTrackCorrection.d.ts +1 -0
  21. package/dist/v2/types/amap/driving.d.ts +2 -1
  22. package/dist/v2/types/amap/index.d.ts +1 -0
  23. package/dist/v2/types/amap/options.d.ts +8 -0
  24. package/dist/v2/types/amap/options.js +1 -0
  25. package/dist/v2/types/interface.d.ts +3 -0
  26. package/dist/v2/utils/compatibleDrivingRoute.js +21 -2
  27. package/dist/v2/utils/log.js +1 -1
  28. package/dist/v2/utils/platform.d.ts +1 -0
  29. package/dist/v2/utils/platform.js +4 -0
  30. package/dist/v2/utils/transform.d.ts +3 -3
  31. package/dist/v2/utils/transform.js +19 -11
  32. package/dist/v3/App.js +2 -2
  33. package/dist/v3/api/gaodeDirectionDriving.js +21 -6
  34. package/dist/v3/business-components/BusinessQuotingMap/BusinessQuotingMap.js +6 -4
  35. package/dist/v3/business-components/BusinessTaxiServiceMap/BusinessTaxiServiceSection.js +22 -13
  36. package/dist/v3/business-components/DrivingLine/DrivingLine.d.ts +5 -1
  37. package/dist/v3/business-components/DrivingLine/DrivingLine.js +44 -10
  38. package/dist/v3/business-components/DrivingRoute/DrivingRoute.d.ts +2 -1
  39. package/dist/v3/business-components/DrivingRoute/DrivingRoute.js +4 -2
  40. package/dist/v3/business-components/TrafficDrivingLine/TrafficDrivingLine.d.ts +8 -0
  41. package/dist/v3/business-components/TrafficDrivingLine/TrafficDrivingLine.js +91 -0
  42. package/dist/v3/business-components/TrafficDrivingLine/index.d.ts +1 -0
  43. package/dist/v3/business-components/TrafficDrivingLine/index.js +4 -0
  44. package/dist/v3/components/Amap/Amap.d.ts +2 -3
  45. package/dist/v3/components/Amap/Amap.js +2 -11
  46. package/dist/v3/components/AmapMarker/AmapMarker.js +12 -3
  47. package/dist/v3/components/MapProvider/MapProvider.js +2 -2
  48. package/dist/v3/hooks/useDeviationCorrectionDrivingRoute.d.ts +2 -0
  49. package/dist/v3/hooks/useDrivingRoute.d.ts +3 -0
  50. package/dist/v3/hooks/useDrivingRoute.js +2 -1
  51. package/dist/v3/hooks/useDrivingTrackCorrection.d.ts +1 -0
  52. package/dist/v3/types/amap/driving.d.ts +2 -1
  53. package/dist/v3/types/amap/index.d.ts +1 -0
  54. package/dist/v3/types/amap/options.d.ts +8 -0
  55. package/dist/v3/types/amap/options.js +1 -0
  56. package/dist/v3/types/interface.d.ts +3 -0
  57. package/dist/v3/utils/compatibleDrivingRoute.js +21 -2
  58. package/dist/v3/utils/log.js +1 -1
  59. package/dist/v3/utils/platform.d.ts +1 -0
  60. package/dist/v3/utils/platform.js +4 -0
  61. package/dist/v3/utils/transform.d.ts +3 -3
  62. package/dist/v3/utils/transform.js +19 -11
  63. package/package.json +1 -1
@@ -78,6 +78,7 @@ export interface Route {
78
78
  duration: number;
79
79
  tolls?: number;
80
80
  steps: RouteStep[];
81
+ trafficJams?: TrafficJams;
81
82
  }
82
83
  export interface TrackPoint {
83
84
  lng: number;
@@ -105,3 +106,5 @@ export type ProxyServiceError = {
105
106
  code: number;
106
107
  msg: string;
107
108
  };
109
+ export type TrafficStatus = "UNKNOWN" | "NORMAL" | "SLOW" | "TRAFFIC_JAM" | "HEAVY_TRAFFIC_JAM";
110
+ export type TrafficJams = Record<`${number},${number}`, TrafficStatus>;
@@ -1,5 +1,18 @@
1
1
  import { apiGaodeDirectionDriving } from "../api/gaodeDirectionDriving.js";
2
2
  import { apiGoogleDirections } from "../api/googleDirections.js";
3
+ import { stringifyPoint, amapTraffic2trafficStatus } from "./transform.js";
4
+ const amapTmcs2trafficJams = (tmcs) => {
5
+ const trafficJams = {};
6
+ for (const tmc of tmcs) {
7
+ const { path } = tmc;
8
+ if (!path)
9
+ continue;
10
+ for (const { lng, lat } of path) {
11
+ trafficJams[stringifyPoint([lng, lat])] = amapTraffic2trafficStatus(tmc.status);
12
+ }
13
+ }
14
+ return trafficJams;
15
+ };
3
16
  function amapJsApiDrivingRoute(from, to, amapDriving) {
4
17
  return new Promise((resolve, reject) => {
5
18
  amapDriving.search(
@@ -7,6 +20,7 @@ function amapJsApiDrivingRoute(from, to, amapDriving) {
7
20
  AMap.LngLat.from(to),
8
21
  { waypoints: [] },
9
22
  (status, result) => {
23
+ const trafficJams = {};
10
24
  switch (status) {
11
25
  case "complete": {
12
26
  let path = [];
@@ -19,6 +33,7 @@ function amapJsApiDrivingRoute(from, to, amapDriving) {
19
33
  const basicStep = step;
20
34
  const stepPath = basicStep.path.map(({ lng, lat }) => [lng, lat]);
21
35
  path = path.concat(stepPath);
36
+ Object.assign(trafficJams, amapTmcs2trafficJams(basicStep.tmcs));
22
37
  routeSteps.push({
23
38
  path: basicStep.path.map(({ lng, lat }) => [lng, lat]),
24
39
  duration: basicStep.time,
@@ -30,7 +45,8 @@ function amapJsApiDrivingRoute(from, to, amapDriving) {
30
45
  distance: firstRoute.distance,
31
46
  duration: firstRoute.time,
32
47
  tolls: firstRoute.tolls,
33
- steps: routeSteps
48
+ steps: routeSteps,
49
+ trafficJams
34
50
  });
35
51
  }
36
52
  case "no_data":
@@ -48,6 +64,7 @@ async function gaodeServiceApiDrivingRoute(from, to, proxyUrl) {
48
64
  origin: [from],
49
65
  destination: to
50
66
  });
67
+ const trafficJams = {};
51
68
  switch (status) {
52
69
  case "complete": {
53
70
  let path = [];
@@ -59,6 +76,7 @@ async function gaodeServiceApiDrivingRoute(from, to, proxyUrl) {
59
76
  const basicStep = step;
60
77
  const stepPath = basicStep.path.map(({ lng, lat }) => [lng, lat]);
61
78
  path = path.concat(stepPath);
79
+ Object.assign(trafficJams, amapTmcs2trafficJams(basicStep.tmcs));
62
80
  routeSteps.push({
63
81
  path: basicStep.path.map(({ lng, lat }) => [lng, lat]),
64
82
  duration: basicStep.time,
@@ -70,7 +88,8 @@ async function gaodeServiceApiDrivingRoute(from, to, proxyUrl) {
70
88
  distance: firstRoute.distance,
71
89
  duration: firstRoute.time,
72
90
  tolls: firstRoute.tolls,
73
- steps: routeSteps
91
+ steps: routeSteps,
92
+ trafficJams
74
93
  };
75
94
  }
76
95
  case "no_data":
@@ -1,6 +1,6 @@
1
1
  const availableLogKeys = /* @__PURE__ */ new Set();
2
2
  const pkgName = "@heycar/heycars-map";
3
- const pkgVersion = "2.7.1";
3
+ const pkgVersion = "2.8.0";
4
4
  const isEnableLog = (name) => {
5
5
  const searchParam = new URLSearchParams(location.search);
6
6
  return searchParam.has(`log-${name}`);
@@ -28,3 +28,4 @@ export declare const detectOSPlatform: () => OS_PLATFORM;
28
28
  * Inspired from http://www.browserleaks.com/webgl#howto-detect-webgl
29
29
  */
30
30
  export declare function detectWebGL(): WEBGL_STATUS;
31
+ export declare function detectTouchDevice(): boolean;
@@ -80,6 +80,9 @@ function detectWebGL() {
80
80
  }
81
81
  return "NOT_SUPPORTED";
82
82
  }
83
+ function detectTouchDevice() {
84
+ return "ontouchend" in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0;
85
+ }
83
86
  export {
84
87
  ALIPAY_WALLET,
85
88
  BRWOSER_PLATFORM,
@@ -88,5 +91,6 @@ export {
88
91
  detectAlipayWallet,
89
92
  detectBrowserPlatform,
90
93
  detectOSPlatform,
94
+ detectTouchDevice,
91
95
  detectWebGL
92
96
  };
@@ -1,5 +1,5 @@
1
1
  /// <reference types="google.maps" />
2
- import type { Language, LngLatLiterial, Place, Point, TrackPoint, Zone } from "../types/interface";
2
+ import type { LngLatLiterial, Place, Point, TrackPoint, TrafficStatus, Zone } from "../types/interface";
3
3
  import type { AlipayMyGetLocationSuccessResponse } from "../types/my";
4
4
  import type { WxGetLocationSuccessResponse } from "../types/wx";
5
5
  import { BRWOSER_PLATFORM } from "./platform";
@@ -9,6 +9,7 @@ export declare const lnglat2point: ({ lng, lat }: {
9
9
  lng: number;
10
10
  lat: number;
11
11
  }) => Point;
12
+ export declare const stringifyPoint: (p: Point) => `${number},${number}`;
12
13
  export declare const googlePointsStringify: (points: Point[]) => string;
13
14
  export declare const gaodePointsStringify: (points: Point[]) => string;
14
15
  export interface AsteriskItem {
@@ -18,8 +19,6 @@ export interface AsteriskItem {
18
19
  export declare const decodeAsterisk: (encodedValue: string) => AsteriskItem[];
19
20
  export declare const property2emitEventName: (propertyName: string) => string;
20
21
  export declare const property2mapEventName: (propertyName: string) => string;
21
- export type VectorMapForeign = "style_en" | "style_local" | "style_zh_cn";
22
- export declare const language2vectorMapForeign: (lang: Language) => VectorMapForeign;
23
22
  export declare const place2point: (place: Place) => Point;
24
23
  export declare const combineHandler: <P extends any[], R>(fn1: ((...args: P) => any) | undefined, fn2: (...args: P) => R) => (...args: P) => R;
25
24
  export declare const pipeAsync: <P extends any[]>(fn?: ((...args: P) => any) | undefined) => (...args: P) => void;
@@ -47,4 +46,5 @@ export declare const maybeFunctionToFunction: <T>(value: T) => MaybeFunctionToFu
47
46
  export declare const signal2promise: (signal?: AbortSignal) => Promise<any>;
48
47
  export declare const googleEncodedPolyline2googleLatLng: (value: string) => google.maps.LatLng[];
49
48
  export declare const gaodePolyline2amapLngLat: (value: string) => AMap.LngLat[];
49
+ export declare const amapTraffic2trafficStatus: (value?: AMap.TMC["status"]) => TrafficStatus;
50
50
  export {};
@@ -42,8 +42,9 @@ const vec2lnglat = ([lng, lat]) => ({
42
42
  lat: Number(lat)
43
43
  });
44
44
  const lnglat2point = ({ lng, lat }) => [lng, lat];
45
+ const stringifyPoint = (p) => `${p[0]},${p[1]}`;
45
46
  const googlePointsStringify = (points) => points.map(([lng, lat]) => `${lat},${lng}`).join("|");
46
- const gaodePointsStringify = (points) => points.map(([lng, lat]) => `${lng},${lat}`).join(";");
47
+ const gaodePointsStringify = (points) => points.map(stringifyPoint).join(";");
47
48
  const decodeAsterisk = (encodedValue) => {
48
49
  const result = [];
49
50
  const tokens = encodedValue.split("*");
@@ -61,15 +62,6 @@ const property2emitEventName = (propertyName) => {
61
62
  const property2mapEventName = (propertyName) => {
62
63
  return propertyName.slice(2).toLowerCase();
63
64
  };
64
- const language2vectorMapForeign = (lang) => {
65
- switch (lang) {
66
- case "en":
67
- return "style_en";
68
- case "zh-TW":
69
- case "zh":
70
- return "style_zh_cn";
71
- }
72
- };
73
65
  const place2point = (place) => [Number(place.lng), Number(place.lat)];
74
66
  const combineHandler = (fn1, fn2) => {
75
67
  return (...args) => {
@@ -296,10 +288,26 @@ const gaodePolyline2amapLngLat = (value) => {
296
288
  return { lng, lat };
297
289
  });
298
290
  };
291
+ const amapTraffic2trafficStatus = (value) => {
292
+ switch (value) {
293
+ case void 0:
294
+ case "未知":
295
+ return "UNKNOWN";
296
+ case "畅通":
297
+ return "NORMAL";
298
+ case "缓行":
299
+ return "SLOW";
300
+ case "拥堵":
301
+ return "TRAFFIC_JAM";
302
+ case "严重拥堵":
303
+ return "HEAVY_TRAFFIC_JAM";
304
+ }
305
+ };
299
306
  export {
300
307
  alipayMyGetLocationError2GeolocationPositionErrorCode,
301
308
  alipayMyGetLocationSuccessResponse2GeolocationPosition,
302
309
  amapPlaceName2DisplayName,
310
+ amapTraffic2trafficStatus,
303
311
  businessCandidatesToAdsorptionPlace,
304
312
  combineHandler,
305
313
  decodeAsterisk,
@@ -316,7 +324,6 @@ export {
316
324
  isPlaceEqual,
317
325
  isPointEqual,
318
326
  isZoneEqual,
319
- language2vectorMapForeign,
320
327
  lnglat2point,
321
328
  maybeFunctionToFunction,
322
329
  pipeAsync,
@@ -326,6 +333,7 @@ export {
326
333
  property2emitEventName,
327
334
  property2mapEventName,
328
335
  signal2promise,
336
+ stringifyPoint,
329
337
  trackPoints2amapGraspRoadPoints,
330
338
  vec2lnglat,
331
339
  wxGetLocationSuccessResponse2GeolocationPosition
package/dist/v3/App.js CHANGED
@@ -4,8 +4,8 @@ import { DemoBusinessRecomendPlace } from "./Demo/DemoBusinessRecomendPlace.js";
4
4
  import { MapProvider } from "./components/MapProvider/MapProvider.js";
5
5
  const gmapApiKey = "AIzaSyCCOe8MAeS3EYvSraKsBX6ztVyLxj69z94";
6
6
  const gmapId = "d0af0c05331af64a";
7
- const amapApiKey = "81ed1d2b5b77187683717a5f2f19591a";
8
- const amapApiSecret = "1dfe626553258a9f91d7c4552c0816d2";
7
+ const amapApiKey = "fcb7b14c930354a248e21f4031dfa179";
8
+ const amapApiSecret = "11ad0e3d585b80d18b1ada5b0d947c4a";
9
9
  const App = /* @__PURE__ */ defineComponent({
10
10
  setup() {
11
11
  const supplierRef = ref("amap");
@@ -1,6 +1,6 @@
1
1
  import { gaodePointsStringify, gaodePolyline2amapLngLat } from "../utils/transform.js";
2
2
  import { createTypeError, isProxyServiceError } from "../utils/typeChecking.js";
3
- const GAODE_POLYLINE_REGEX = /^(?:\d*\.\d+,\d*\.\d+)?(?:;\d*\.\d+,\d*\.\d+)*$/;
3
+ const GAODE_POLYLINE_REGEX = /^(?:-?\d*\.\d+,-?\d*\.\d+)?(?:;-?\d*\.\d+,-?\d*\.\d+)*$/;
4
4
  var GaodeDirectionStatus = /* @__PURE__ */ ((GaodeDirectionStatus2) => {
5
5
  GaodeDirectionStatus2["SUCCESS"] = "1";
6
6
  GaodeDirectionStatus2["FAIL"] = "0";
@@ -35,10 +35,19 @@ function isGaodeDirectionBasicStep(value) {
35
35
  function isGaodeEmptyValue(value) {
36
36
  return Array.isArray(value) && value.length === 0;
37
37
  }
38
- function assertGaodoDirectionDrivingStep(value) {
39
- if (isGaodeDirectionBasicStep(value))
38
+ function isAmapTmcStatus(value) {
39
+ return value === "未知" || value === "畅通" || value === "缓行" || value === "拥堵" || value === "严重拥堵";
40
+ }
41
+ function assertGaodeDirectionDrivingTmc(value) {
42
+ if (typeof value === "object" && value !== null && "status" in value && isAmapTmcStatus(value.status) && "polyline" in value && isGaodeDirectionPolyline(value.polyline))
40
43
  return;
41
- throw createTypeError("GaodeDirectionDrivingStep", value);
44
+ throw createTypeError("GaodeDirectionDrivingTmc", value);
45
+ }
46
+ function assertGaodoDirectionDrivingStep(value) {
47
+ if (!isGaodeDirectionBasicStep(value) || !("tmcs" in value) || !Array.isArray(value.tmcs)) {
48
+ throw createTypeError("GaodeDirectionDrivingStep", value);
49
+ }
50
+ value.tmcs.forEach(assertGaodeDirectionDrivingTmc);
42
51
  }
43
52
  function assertGaodeDirectionDrivingRoutePath(value) {
44
53
  if (!isGaodeMeasurableObject(value) || !("tolls" in value) || !isGaodeNumberableString(value.tolls) || !("steps" in value) || !Array.isArray(value.steps)) {
@@ -63,15 +72,21 @@ function assertGaodeDirectionDrivingResponse(value) {
63
72
  throw createTypeError("GaodeDirectionDrivingResponse", value, detail);
64
73
  }
65
74
  }
75
+ function gaodeDirectionDrivingTmc2amapTmc(gaodeTmc) {
76
+ const { status, polyline } = gaodeTmc;
77
+ const path = gaodePolyline2amapLngLat(String(polyline));
78
+ return { status, path };
79
+ }
66
80
  function gaodeDirectionDrivingRoute2amapDrivingRoute(gaodeRoute) {
67
81
  return gaodeRoute.paths.map((routePath) => {
68
82
  const { distance, duration, tolls, steps: godeDirectionSteps } = routePath;
69
83
  const steps = godeDirectionSteps.map((directionStep) => {
70
- const { distance: distance2, duration: duration2, polyline } = directionStep;
84
+ const { distance: distance2, duration: duration2, polyline, tmcs } = directionStep;
71
85
  return {
72
86
  distance: Number(distance2),
73
87
  time: Number(duration2),
74
- path: gaodePolyline2amapLngLat(String(polyline))
88
+ path: gaodePolyline2amapLngLat(String(polyline)),
89
+ tmcs: tmcs.map(gaodeDirectionDrivingTmc2amapTmc)
75
90
  };
76
91
  });
77
92
  return {
@@ -9,10 +9,10 @@ import { defineSetup, defineLagecySetup } from "../../types/helper.js";
9
9
  import { generateCreateElementV2PropsOn } from "../../utils/compare.js";
10
10
  import { place2point, pipeDefer } from "../../utils/transform.js";
11
11
  import { toCoordinatePlaceType } from "../../utils/typeChecking.js";
12
- import { DrivingLine } from "../DrivingLine/DrivingLine.js";
13
12
  import { DrivingRoute } from "../DrivingRoute/DrivingRoute.js";
14
13
  import { FitViewOnce, createFittableRegisterOverlay } from "../FitView/FitView.js";
15
14
  import { StartEndPoint } from "../StartEndPoint/StartEndPoint.js";
15
+ import { TrafficDrivingLine } from "../TrafficDrivingLine/TrafficDrivingLine.js";
16
16
  const BUSINESS_QUOTING_FITVIEW_PANDING = [26, 26, 19, 26];
17
17
  const BusinessQuotingMapInner = defineSetup("BusinessQuotingMapInner", function(props, {
18
18
  emit,
@@ -83,9 +83,11 @@ const BusinessQuotingMapInner = defineSetup("BusinessQuotingMapInner", function(
83
83
  path,
84
84
  distance,
85
85
  duration,
86
- tolls
87
- }) => [createVNode(DrivingLine, {
88
- "path": path
86
+ tolls,
87
+ trafficJams
88
+ }) => [createVNode(TrafficDrivingLine, {
89
+ "path": path,
90
+ "trafficJams": trafficJams
89
91
  }, null), createVNode(StartEndPoint, {
90
92
  "type": "end",
91
93
  "registerOverlay": fittableRegistryOverlay,
@@ -14,6 +14,7 @@ import { ConditionalFittablePassengerCircle } from "../PassengerCircle/Passenger
14
14
  import { PlaceCircle } from "../PlaceCircle/PlaceCircle.js";
15
15
  import { StartEndPoint } from "../StartEndPoint/StartEndPoint.js";
16
16
  import { TaxiCar } from "../TaxiCar/TaxiCar.js";
17
+ import { TrafficDrivingLine } from "../TrafficDrivingLine/TrafficDrivingLine.js";
17
18
  import { WalkingLine } from "../WalkingLine/WalkingLine.js";
18
19
  import { WalkingRoute } from "../WalkingRoute/WalkingRoute.js";
19
20
  import { WaveCircle } from "../WaveCircle/WaveCircle.js";
@@ -77,9 +78,11 @@ const SectionConfirmed = defineSetup("SectionConfirmed", function(props) {
77
78
  "to": to,
78
79
  "from": from,
79
80
  "render": ({
80
- path
81
- }) => createVNode(DrivingLine, {
82
- "path": path
81
+ path,
82
+ trafficJams
83
+ }) => createVNode(TrafficDrivingLine, {
84
+ "path": path,
85
+ "trafficJams": trafficJams
83
86
  }, null)
84
87
  }, null), createVNode(ConditionalFittablePassengerCircle, {
85
88
  "position": passengerPosition,
@@ -162,11 +165,13 @@ const SectionDriverStartService = defineSetup("SectionDriverStartService", funct
162
165
  path,
163
166
  angle,
164
167
  distance,
165
- duration
168
+ duration,
169
+ trafficJams
166
170
  }) => {
167
171
  var _a;
168
- return [createVNode(DrivingLine, {
169
- "path": path
172
+ return [createVNode(TrafficDrivingLine, {
173
+ "path": path,
174
+ "trafficJams": trafficJams
170
175
  }, null), createVNode(TaxiCar, {
171
176
  "position": (_a = path[0]) != null ? _a : carPosition,
172
177
  "angle": angle != null ? angle : carAngle,
@@ -233,9 +238,11 @@ const SectionBookDispatched = defineSetup("SectionBookDispatched", function(prop
233
238
  "to": to,
234
239
  "from": from,
235
240
  "render": ({
236
- path
237
- }) => createVNode(DrivingLine, {
238
- "path": path
241
+ path,
242
+ trafficJams
243
+ }) => createVNode(TrafficDrivingLine, {
244
+ "path": path,
245
+ "trafficJams": trafficJams
239
246
  }, null)
240
247
  }, null), !!passengerPosition && passengerDistance && passengerDistance < PASSENGER_DISTANCE_MAX && passengerDistance > PASSENGER_DISTANCE_MIN && createVNode(WalkingRoute, {
241
248
  "from": passengerPosition,
@@ -370,11 +377,13 @@ const SectionInService = defineSetup("SectionInService", function(props) {
370
377
  path,
371
378
  angle,
372
379
  distance,
373
- duration
380
+ duration,
381
+ trafficJams
374
382
  }) => {
375
383
  var _a;
376
- return [createVNode(DrivingLine, {
377
- "path": path
384
+ return [createVNode(TrafficDrivingLine, {
385
+ "path": path,
386
+ "trafficJams": trafficJams
378
387
  }, null), createVNode(TaxiCar, {
379
388
  "position": (_a = path[0]) != null ? _a : carPosition,
380
389
  "angle": angle != null ? angle : carAngle,
@@ -479,7 +488,7 @@ const SectionEndService = defineSetup("SectionEndService", function(props) {
479
488
  path
480
489
  }) => createVNode(DrivingLine, {
481
490
  "path": path,
482
- "done": true
491
+ "status": "DONE"
483
492
  }, null)
484
493
  }, null), createVNode(StartEndPoint, {
485
494
  "type": "start",
@@ -1,6 +1,9 @@
1
+ import type { TrafficStatus } from "../../types/interface";
2
+ type DrivingLineStatus = TrafficStatus | "DONE";
1
3
  export interface DrivingLineProps {
2
- done?: boolean;
4
+ status?: DrivingLineStatus;
3
5
  path: [number, number][];
6
+ lineCap?: AMap.LineSharedOptions["lineCap"];
4
7
  }
5
8
  export declare const ADrivingLine: import("vue-demi").DefineComponent<import("vue-demi").ComponentObjectPropsOptions<DrivingLineProps>, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").EmitByProps<DrivingLineProps, Required<DrivingLineProps>>, never, import("vue-demi").PublicProps, DrivingLineProps, DrivingLineProps, import("vue-demi").SlotsType<{} & {
6
9
  default?: import("../../demi-polyfill").Slot | undefined;
@@ -11,3 +14,4 @@ export declare const GDrivingLine: import("vue-demi").DefineComponent<import("vu
11
14
  export declare const DrivingLine: import("vue-demi").DefineComponent<import("vue-demi").ComponentObjectPropsOptions<DrivingLineProps>, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").EmitByProps<DrivingLineProps, Required<DrivingLineProps>>, never, import("vue-demi").PublicProps, DrivingLineProps, DrivingLineProps, import("vue-demi").SlotsType<{} & {
12
15
  default?: import("../../demi-polyfill").Slot | undefined;
13
16
  }>>;
17
+ export {};
@@ -7,24 +7,55 @@ import { createElement } from "../../demi-polyfill/demi-polyfill.js";
7
7
  import { useMapSupplier } from "../../hooks/useMapSupplier.js";
8
8
  import { defineSetup } from "../../types/helper.js";
9
9
  import { vec2lnglat } from "../../utils/transform.js";
10
+ const trafficInnerColors = {
11
+ // UNKNOWN: "#487BF4",
12
+ UNKNOWN: "#00C875",
13
+ NORMAL: "#00C875",
14
+ SLOW: "#F9D100",
15
+ TRAFFIC_JAM: "#EB0E33",
16
+ HEAVY_TRAFFIC_JAM: "#99001A",
17
+ DONE: "#96B2CA"
18
+ };
19
+ const trafficOuterColors = {
20
+ // UNKNOWN: "#4175F1",
21
+ UNKNOWN: "#008559",
22
+ NORMAL: "#008559",
23
+ SLOW: "#B29400",
24
+ TRAFFIC_JAM: "#990D24",
25
+ HEAVY_TRAFFIC_JAM: "#4D000D",
26
+ DONE: "#7693AF"
27
+ };
28
+ const trafficBorderColors = {
29
+ // UNKNOWN: "#6C95F5",
30
+ UNKNOWN: "#00C875",
31
+ NORMAL: "#00C875",
32
+ SLOW: "#F9D100",
33
+ TRAFFIC_JAM: "#EB0E33",
34
+ HEAVY_TRAFFIC_JAM: "#99001A",
35
+ DONE: "#7693AF"
36
+ };
10
37
  const ADrivingLine = defineSetup("ADrivingLine", function(props) {
11
38
  return () => {
39
+ const {
40
+ status = "UNKNOWN",
41
+ lineCap = "round"
42
+ } = props;
12
43
  const vw = window.innerWidth * 0.01;
13
44
  const strokeWidth = 1 * vw;
14
45
  const borderWidth = 0.13 * vw;
15
46
  const dirWidth = 0.24 * vw;
16
47
  const outlineWidth = 0.4 * vw;
17
48
  const dashLength = 0.3 * vw;
18
- const strokeColorInner = props.done ? "#96B2CA" : "#487BF4";
19
- const strokeColorOuter = props.done ? "#7693AF" : "#4175F1";
20
- const strokeColorBorder = props.done ? "#7693AF" : "#6C95F5";
49
+ const strokeColorInner = trafficInnerColors[status];
50
+ const strokeColorOuter = trafficOuterColors[status];
51
+ const strokeColorBorder = trafficBorderColors[status];
21
52
  return createVNode("div", null, [createVNode(AmapPolyline, {
22
53
  "path": props.path,
23
54
  "strokeWeight": strokeWidth + 2 * borderWidth + 2 * outlineWidth,
24
55
  "strokeOpacity": 1,
25
56
  "strokeColor": strokeColorOuter,
26
57
  "lineJoin": "round",
27
- "lineCap": "round",
58
+ "lineCap": lineCap,
28
59
  "zIndex": ZINDEX_LINE_LAYER
29
60
  }, null), createVNode(AmapPolyline, {
30
61
  "path": props.path,
@@ -32,7 +63,7 @@ const ADrivingLine = defineSetup("ADrivingLine", function(props) {
32
63
  "strokeOpacity": 1,
33
64
  "strokeColor": strokeColorBorder,
34
65
  "lineJoin": "round",
35
- "lineCap": "round",
66
+ "lineCap": lineCap,
36
67
  "strokeStyle": "dashed",
37
68
  "strokeDasharray": [dashLength, dashLength * 0.5],
38
69
  "zIndex": ZINDEX_LINE_LAYER
@@ -42,7 +73,7 @@ const ADrivingLine = defineSetup("ADrivingLine", function(props) {
42
73
  "strokeOpacity": 1,
43
74
  "strokeColor": strokeColorInner,
44
75
  "lineJoin": "round",
45
- "lineCap": "round",
76
+ "lineCap": lineCap,
46
77
  "zIndex": ZINDEX_LINE_LAYER
47
78
  }, null), createVNode(AmapPolyline, {
48
79
  "showDir": true,
@@ -51,7 +82,7 @@ const ADrivingLine = defineSetup("ADrivingLine", function(props) {
51
82
  "strokeOpacity": 1,
52
83
  "strokeColor": "transparent",
53
84
  "lineJoin": "round",
54
- "lineCap": "round",
85
+ "lineCap": lineCap,
55
86
  "zIndex": ZINDEX_LINE_LAYER
56
87
  }, null)]);
57
88
  };
@@ -59,15 +90,18 @@ const ADrivingLine = defineSetup("ADrivingLine", function(props) {
59
90
  const GDrivingLine = defineSetup("GDrivingLine", function(props) {
60
91
  const pathRef = computed(() => props.path.map(vec2lnglat));
61
92
  return () => {
93
+ const {
94
+ status = "UNKNOWN"
95
+ } = props;
62
96
  const vw = window.innerWidth * 0.01;
63
97
  const repeat = 10 * vw;
64
98
  const strokeWidth = 1.25 * vw * 0.65;
65
99
  const borderWidth = 0.175 * vw * 0.65;
66
100
  const dirStrokeWeight = 0.375 * vw * 0.65;
67
101
  const outlineWidth = 0.45 * vw * 0.65;
68
- const strokeColorInner = props.done ? "#96B2CA" : "#487BF4";
69
- const strokeColorOuter = props.done ? "#7693AF" : "#4175F1";
70
- const strokeColorBorder = props.done ? "#7693AF" : "#6C95F5";
102
+ const strokeColorInner = trafficInnerColors[status];
103
+ const strokeColorOuter = trafficOuterColors[status];
104
+ const strokeColorBorder = trafficBorderColors[status];
71
105
  return createVNode("div", null, [createVNode(GmapPolyline, {
72
106
  "path": pathRef.value,
73
107
  "strokeWeight": strokeWidth + 2 * borderWidth + 2 * outlineWidth,
@@ -1,12 +1,13 @@
1
1
  import { type VNodeChild } from "../../demi-polyfill";
2
2
  import { type UseDrivingRouteProps } from "../../hooks/useDrivingRoute";
3
- import type { Point } from "../../types/interface";
3
+ import type { Point, TrafficJams } from "../../types/interface";
4
4
  export type DrivingRouteRenderProps = {
5
5
  path: Point[];
6
6
  angle?: number;
7
7
  distance: number;
8
8
  duration: number;
9
9
  tolls?: number;
10
+ trafficJams?: TrafficJams;
10
11
  };
11
12
  export interface DrivingRouteProps extends UseDrivingRouteProps {
12
13
  render?: (props: DrivingRouteRenderProps) => VNodeChild;
@@ -14,7 +14,8 @@ const ADrivingRoute = defineSetup("ADrivingRoute", function(props, {
14
14
  path,
15
15
  distance,
16
16
  duration,
17
- tolls
17
+ tolls,
18
+ trafficJams
18
19
  } = toRefs(useADrivingRoute(props).route);
19
20
  const {
20
21
  angleRef
@@ -29,7 +30,8 @@ const ADrivingRoute = defineSetup("ADrivingRoute", function(props, {
29
30
  angle: angleRef,
30
31
  distance,
31
32
  duration,
32
- tolls
33
+ tolls,
34
+ trafficJams
33
35
  }))]);
34
36
  };
35
37
  });
@@ -0,0 +1,8 @@
1
+ import type { Point, TrafficJams } from "../../types/interface";
2
+ export interface TrafficDrivingLineProps {
3
+ path: Point[];
4
+ trafficJams?: TrafficJams;
5
+ }
6
+ export declare const TrafficDrivingLine: import("vue").DefineComponent<import("vue").ComponentObjectPropsOptions<TrafficDrivingLineProps>, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").Empty, import("../../types/helper").EmitByProps<TrafficDrivingLineProps, Required<TrafficDrivingLineProps>>, never, import("vue").PublicProps, TrafficDrivingLineProps, TrafficDrivingLineProps, import("vue").SlotsType<{} & {
7
+ default?: import("../../demi-polyfill").Slot | undefined;
8
+ }>>;
@@ -0,0 +1,91 @@
1
+ import { createVNode } from "vue";
2
+ import { defineSetup } from "../../types/helper.js";
3
+ import { stringifyPoint } from "../../utils/transform.js";
4
+ import { DrivingLine } from "../DrivingLine/DrivingLine.js";
5
+ const justifyFirstPointStatus = (firstPointStatus, secondPointStatus) => {
6
+ return (firstPointStatus === void 0 || firstPointStatus === "UNKNOWN") && !!secondPointStatus && secondPointStatus !== "UNKNOWN" ? secondPointStatus : firstPointStatus != null ? firstPointStatus : "UNKNOWN";
7
+ };
8
+ const createMulitpleLineByTrafficJams = (path, trafficJams) => {
9
+ var _a;
10
+ if (!trafficJams)
11
+ return [{
12
+ path,
13
+ status: "UNKNOWN"
14
+ }];
15
+ const firstPoint = path[0];
16
+ if (!firstPoint)
17
+ return [];
18
+ const multipleLines = [];
19
+ let line = {
20
+ path: [firstPoint],
21
+ status: justifyFirstPointStatus(trafficJams[stringifyPoint(firstPoint)], trafficJams[stringifyPoint(path[1])])
22
+ };
23
+ for (let idx = 2; idx < path.length; idx++) {
24
+ const point = path[idx];
25
+ const traffic = (_a = trafficJams[stringifyPoint(point)]) != null ? _a : "UNKNOWN";
26
+ line.path.push(point);
27
+ if (traffic === line.status)
28
+ continue;
29
+ multipleLines.push(line);
30
+ line = {
31
+ path: [point],
32
+ status: traffic
33
+ };
34
+ }
35
+ multipleLines.push(line);
36
+ return multipleLines;
37
+ };
38
+ const beautifyMultipleLines = (lines) => {
39
+ const max = lines.length - 1;
40
+ if (max === 0)
41
+ return [{
42
+ ...lines[0],
43
+ lineCap: "round"
44
+ }];
45
+ const totalPath = lines.flatMap((line) => line.path);
46
+ const totalLine = {
47
+ path: totalPath,
48
+ status: "NORMAL",
49
+ lineCap: "round"
50
+ };
51
+ const coveredLines = [];
52
+ for (const line of lines) {
53
+ const {
54
+ path,
55
+ status
56
+ } = line;
57
+ if (status !== "SLOW" && status !== "TRAFFIC_JAM" && status !== "HEAVY_TRAFFIC_JAM")
58
+ continue;
59
+ coveredLines.push({
60
+ status,
61
+ path,
62
+ lineCap: "butt"
63
+ });
64
+ }
65
+ const first = lines[0];
66
+ const ignoredLine = {
67
+ status: first.status,
68
+ path: first.path.slice(0, 2),
69
+ lineCap: "butt"
70
+ };
71
+ return [ignoredLine, totalLine, ...coveredLines];
72
+ };
73
+ const TrafficDrivingLine = defineSetup("TrafficDrivingLine", function(props) {
74
+ return () => {
75
+ const {
76
+ path,
77
+ trafficJams
78
+ } = props;
79
+ const multipleLines = createMulitpleLineByTrafficJams(path, trafficJams);
80
+ console.log("multipleLines = ", multipleLines);
81
+ const beautifiedLines = beautifyMultipleLines(multipleLines);
82
+ return createVNode("div", null, [beautifiedLines.map((line) => createVNode(DrivingLine, {
83
+ "path": line.path,
84
+ "status": line.status,
85
+ "lineCap": line.lineCap
86
+ }, null))]);
87
+ };
88
+ });
89
+ export {
90
+ TrafficDrivingLine
91
+ };
@@ -0,0 +1 @@
1
+ export * from "./TrafficDrivingLine";
@@ -0,0 +1,4 @@
1
+ import { TrafficDrivingLine } from "./TrafficDrivingLine.js";
2
+ export {
3
+ TrafficDrivingLine
4
+ };