You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
3.4 KiB

import { watch } from "vue-demi";
import { RouteState } from "../types";
import { toLngLat, toLngLats } from "../../../utils";
export function useWatch(state: RouteState) {
function resetRoutes() {
state.drivingLines = [];
state.walkLines = [];
state.busLines = [];
state.busMarkers = [];
state.metroMarkers = [];
}
function resetPlans() {
state.transitPlans = [];
state.transitPlanIndex = 0;
state.drivingPlans = [];
state.drivingPlanIndex = 0;
}
watch(
() => {
const { startMarker, endMarker, routeType, drivingPolicy, transitPolicy } = state;
return { startMarker, endMarker, routeType, drivingPolicy, transitPolicy };
},
({ startMarker, endMarker, routeType, drivingPolicy, transitPolicy }) => {
resetPlans();
resetRoutes();
if (startMarker.length && endMarker.length) {
switch (routeType) {
case 0:
state.drivingRoute?.setPolicy(drivingPolicy);
state.drivingRoute?.search(toLngLat(startMarker), toLngLat(endMarker));
break;
case 1:
state.transitRoute?.setPolicy(transitPolicy);
state.transitRoute?.search(toLngLat(startMarker), toLngLat(endMarker));
break;
case 2:
state.drivingRoute?.setPolicy(4);
state.drivingRoute?.search(toLngLat(startMarker), toLngLat(endMarker));
break;
default:
break;
}
}
},
{ immediate: true }
);
watch(
() => ({ drivingPlans: state.drivingPlans, drivingPlanIndex: state.drivingPlanIndex }),
({ drivingPlans, drivingPlanIndex }) => {
resetRoutes();
const { routelatlon } = drivingPlans[drivingPlanIndex] || {};
if (!routelatlon) return;
const lines = routelatlon
.split(";")
.filter(e => e)
.map(e => e.split(",").map(Number));
state.drivingLines.push(lines);
// drivingPlans.map(plan =>
// plan.routelatlon
// .split(";")
// .filter(e => e)
// .map(e => e.split(",").map(Number))
// );
state.tdtMap?.setViewport(toLngLats(state.drivingLines.flat()));
},
{ immediate: true }
);
watch(
() => ({ transitPlans: state.transitPlans, transitPlanIndex: state.transitPlanIndex }),
({ transitPlans, transitPlanIndex }) => {
resetRoutes();
const { segments } = transitPlans[transitPlanIndex] || {};
if (!segments) return;
segments.forEach(segment => {
const lines = segment.segmentLine.map(line =>
line.linePoint
.split(";")
.filter(e => e)
.map(e => e.split(",").map(Number))
);
const markers = [segment.stationStart, segment.stationEnd].map(station =>
station.lonlat.split(",").map(Number)
);
switch (segment.segmentType) {
case 1:
case 4:
state.walkLines.push(...lines);
break;
case 2:
state.busMarkers.push(...markers);
state.busLines.push(...lines);
break;
case 3:
state.metroMarkers.push(...markers);
state.busLines.push(...lines);
break;
default:
break;
}
});
state.tdtMap?.setViewport(toLngLats([...state.busLines, ...state.walkLines].flat()));
},
{ immediate: true }
);
}