@geoapify/route-planner-sdk
Version:
TypeScript SDK for the Geoapify Route Planner API. Supports route optimization, delivery planning, and timeline visualization in browser and Node.js
143 lines (142 loc) • 4.85 kB
JavaScript
import { AgentPlan } from "./nested/result/agent-plan";
import { RoutePlannerResultConverter } from "../../tools/route-planner-result-converter";
import { JobPlan } from "./nested/result/job-plan";
import { ShipmentPlan } from "./nested/result/shipment-plan";
import { IndexConverter } from "../../helpers/index-converter";
/**
* Provides convenient methods for reading Route Planner API results.
*/
export class RoutePlannerResult {
constructor(callOptions, rawData) {
this.callOptions = callOptions;
this.rawData = rawData;
this.data = RoutePlannerResultConverter.generateRoutePlannerResultData(this.rawData);
// generate agent plans
this.agentPlans = new Array(this.data.inputData.agents.length).fill(undefined);
this.data.agents.forEach((agentPlan) => {
this.agentPlans[agentPlan.agent_index] = new AgentPlan(agentPlan, this.data.inputData.agents[agentPlan.agent_index], this.getData().inputData, this.callOptions, this.getAgentViolations(agentPlan.agent_index));
});
// generate shipment plans
this.shipmentPlans = (this.data.inputData.shipments || []).map((shipmentData, shipmentIndex) => {
const agentPlan = this.agentPlans.find((agentPlan) => !!agentPlan && agentPlan.containsShipment(shipmentIndex));
return new ShipmentPlan(shipmentIndex, shipmentData, agentPlan);
});
// generate job plans
this.jobPlans = (this.data.inputData.jobs || []).map((jobData, jobIndex) => {
const agentPlan = this.agentPlans.find((agentPlan) => !!agentPlan && agentPlan.containsJob(jobIndex));
return new JobPlan(jobIndex, jobData, agentPlan);
});
}
/**
* Returns the data returned by the Route Planner API.
*/
getData() {
return this.data;
}
/**
* Returns the raw data returned by the Route Planner API.
*/
getRaw() {
return this.rawData;
}
/**
* Returns a list of all assigned agent solutions.
*/
getAgentPlans() {
return this.agentPlans;
}
/**
* Finds an agent's solution by their ID.
*/
getAgentPlan(agentIdOrIndex) {
const agentIndex = IndexConverter.convertAgentToIndex(this.getRaw(), agentIdOrIndex);
if (agentIndex >= 0) {
return this.agentPlans[agentIndex];
}
return undefined;
}
/**
* Retrieves unassigned agents.
*/
getUnassignedAgents() {
let data = this.getData();
if (!data.unassignedAgents || data.unassignedAgents.length == 0) {
return [];
}
else {
return data.unassignedAgents.map(index => {
return data.inputData.agents[index];
});
}
}
/**
* Retrieves unassigned jobs.
*/
getUnassignedJobs() {
let data = this.getData();
if (!data.unassignedJobs || data.unassignedJobs.length == 0) {
return [];
}
else {
return data.unassignedJobs.map(index => {
return data.inputData.jobs[index];
});
}
}
/**
* Retrieves unassigned shipments.
*/
getUnassignedShipments() {
let data = this.getData();
if (!data.unassignedShipments || data.unassignedShipments.length == 0) {
return [];
}
else {
return data.unassignedShipments.map(index => {
return data.inputData.shipments[index];
});
}
}
/**
* Returns a list of all assigned jobs
*/
getJobPlans() {
return this.jobPlans;
}
/**
* Finds job solution by their ID or index.
*/
getJobPlan(jobIdOrIndex) {
const jobIndex = IndexConverter.convertJobToIndex(this.getRaw(), jobIdOrIndex);
if (jobIndex >= 0)
return this.jobPlans[jobIndex];
return undefined;
}
/**
* Returns a list of all shipments
*/
getShipmentPlans() {
return this.shipmentPlans;
}
/**
* Finds shipment solution by their ID or index.
*/
getShipmentPlan(shipmentIdOrIndex) {
const shipmentIndex = IndexConverter.convertShipmentToIndex(this.getRaw(), shipmentIdOrIndex);
if (shipmentIndex >= 0) {
return this.shipmentPlans[shipmentIndex];
}
return undefined;
}
getCallOptions() {
return this.callOptions;
}
getRoutingOptions() {
return this.data.inputData;
}
getAgentViolations(agentIndex) {
var _a, _b;
const extendedData = this.rawData;
return (_b = (_a = extendedData.properties.violations) === null || _a === void 0 ? void 0 : _a.filter(violation => violation.agentIndex === agentIndex)) !== null && _b !== void 0 ? _b : [];
}
}