Skip to content

Converter Package API

The @route-optimization/converter package provides utilities to convert between Google Maps DirectionsResult and Route Optimization data structures.

Installation

bash
npm install @route-optimization/converter

Works with any framework or vanilla JavaScript.

Functions

toDirectionsResult()

Convert Route Optimization data to Google Maps DirectionsResult format.

typescript
function toDirectionsResult(
  routes: Route[],
  options?: ConversionOptions
): google.maps.DirectionsResult;

Parameters:

ParameterTypeRequiredDescription
routesRoute[]YesArray of routes to convert
optionsConversionOptionsNoConversion options

ConversionOptions:

typescript
interface ConversionOptions {
  travelMode?: google.maps.TravelMode;
  optimizeWaypoints?: boolean;
  provideRouteAlternatives?: boolean;
  unitSystem?: google.maps.UnitSystem;
}

Returns: google.maps.DirectionsResult

Example:

typescript
import { toDirectionsResult } from '@route-optimization/converter';

const routes = [
  {
    id: 'route-1',
    vehicleId: 'vehicle-1',
    stops: [
      {
        id: 'start',
        location: { lat: 13.7563, lng: 100.5018 },
        type: 'START',
        sequence: 0,
      },
      {
        id: 'delivery-1',
        location: { lat: 13.7467, lng: 100.5342 },
        type: 'DELIVERY',
        sequence: 1,
      },
    ],
    totalDistance: 5420,
    totalDuration: 900,
  },
];

const directionsResult = toDirectionsResult(routes, {
  travelMode: google.maps.TravelMode.DRIVING,
  optimizeWaypoints: true,
});

// Use with Google Maps DirectionsRenderer
const directionsRenderer = new google.maps.DirectionsRenderer();
directionsRenderer.setDirections(directionsResult);

fromDirectionsResult()

Convert Google Maps DirectionsResult to Route Optimization format.

typescript
function fromDirectionsResult(
  directionsResult: google.maps.DirectionsResult,
  options?: ParseOptions
): Route[];

Parameters:

ParameterTypeRequiredDescription
directionsResultgoogle.maps.DirectionsResultYesGoogle Maps directions
optionsParseOptionsNoParsing options

ParseOptions:

typescript
interface ParseOptions {
  vehicleId?: string;
  routeIdPrefix?: string;
  stopIdPrefix?: string;
  includeStopDetails?: boolean;
}
PropertyTypeDefaultDescription
vehicleIdstring'vehicle-1'Vehicle ID for routes
routeIdPrefixstring'route-'Prefix for route IDs
stopIdPrefixstring'stop-'Prefix for stop IDs
includeStopDetailsbooleantrueInclude detailed stop info

Returns: Route[]

Example:

typescript
import { fromDirectionsResult } from '@route-optimization/converter';

const directionsService = new google.maps.DirectionsService();

const request = {
  origin: 'Bangkok, Thailand',
  destination: 'Pattaya, Thailand',
  waypoints: [{ location: 'Chonburi, Thailand' }, { location: 'Si Racha, Thailand' }],
  travelMode: google.maps.TravelMode.DRIVING,
};

directionsService.route(request, (result, status) => {
  if (status === google.maps.DirectionsStatus.OK) {
    const routes = fromDirectionsResult(result, {
      vehicleId: 'truck-001',
      routeIdPrefix: 'delivery-',
      includeStopDetails: true,
    });

    console.log(routes);
    // Routes in Route Optimization format
  }
});

encodePolyline()

Encode an array of coordinates to Google polyline format.

typescript
function encodePolyline(coordinates: LatLng[]): string;

Parameters:

ParameterTypeRequiredDescription
coordinatesLatLng[]YesArray of coordinates

Returns: string - Encoded polyline

Example:

typescript
import { encodePolyline } from '@route-optimization/converter';

const coordinates = [
  { lat: 13.7563, lng: 100.5018 },
  { lat: 13.7467, lng: 100.5342 },
  { lat: 13.7279, lng: 100.5241 },
];

const encoded = encodePolyline(coordinates);
console.log(encoded);
// Output: "_p~iF~ps|U_ulLnnqC_mqNvxq`@"

decodePolyline()

Decode a Google polyline string to coordinates.

typescript
function decodePolyline(encoded: string): LatLng[];

Parameters:

ParameterTypeRequiredDescription
encodedstringYesEncoded polyline string

Returns: LatLng[] - Array of coordinates

Example:

typescript
import { decodePolyline } from '@route-optimization/converter';

const encoded = '_p~iF~ps|U_ulLnnqC_mqNvxq`@';
const coordinates = decodePolyline(encoded);

console.log(coordinates);
// Output: [
//   { lat: 13.7563, lng: 100.5018 },
//   { lat: 13.7467, lng: 100.5342 },
//   { lat: 13.7279, lng: 100.5241 }
// ]

calculateRouteDistance()

Calculate total distance of a route from DirectionsResult.

typescript
function calculateRouteDistance(
  directionsResult: google.maps.DirectionsResult,
  routeIndex?: number
): number;

Parameters:

ParameterTypeDefaultDescription
directionsResultgoogle.maps.DirectionsResult-Directions result
routeIndexnumber0Route index

Returns: number - Distance in meters

Example:

typescript
import { calculateRouteDistance } from '@route-optimization/converter';

const distance = calculateRouteDistance(directionsResult);
console.log(`Total distance: ${distance / 1000} km`);

calculateRouteDuration()

Calculate total duration of a route from DirectionsResult.

typescript
function calculateRouteDuration(
  directionsResult: google.maps.DirectionsResult,
  routeIndex?: number
): number;

Parameters:

ParameterTypeDefaultDescription
directionsResultgoogle.maps.DirectionsResult-Directions result
routeIndexnumber0Route index

Returns: number - Duration in seconds

Example:

typescript
import { calculateRouteDuration } from '@route-optimization/converter';

const duration = calculateRouteDuration(directionsResult);
console.log(`Total duration: ${duration / 60} minutes`);

extractWaypoints()

Extract waypoints from DirectionsResult.

typescript
function extractWaypoints(
  directionsResult: google.maps.DirectionsResult,
  routeIndex?: number
): LatLng[];

Parameters:

ParameterTypeDefaultDescription
directionsResultgoogle.maps.DirectionsResult-Directions result
routeIndexnumber0Route index

Returns: LatLng[] - Array of waypoint coordinates

Example:

typescript
import { extractWaypoints } from '@route-optimization/converter';

const waypoints = extractWaypoints(directionsResult);
console.log(`Route has ${waypoints.length} waypoints`);

Examples

Convert Routes to DirectionsResult

typescript
import { toDirectionsResult } from '@route-optimization/converter';
import { RouteMapView } from '@route-optimization/react';

function MyMapComponent({ routes }) {
  const directionsResult = toDirectionsResult(routes, {
    travelMode: google.maps.TravelMode.DRIVING,
    unitSystem: google.maps.UnitSystem.METRIC,
  });

  return (
    <RouteMapView
      apiKey="YOUR_API_KEY"
      route={routes[0]}
      center={{ lat: 13.7563, lng: 100.5018 }}
      zoom={12}
    />
  );
}

Parse Google Directions to Routes

typescript
import { fromDirectionsResult } from '@route-optimization/converter';

async function getDirections() {
  const directionsService = new google.maps.DirectionsService();

  const request = {
    origin: { lat: 13.7563, lng: 100.5018 },
    destination: { lat: 13.6904, lng: 100.7501 },
    waypoints: [{ location: { lat: 13.7278, lng: 100.5241 } }],
    travelMode: google.maps.TravelMode.DRIVING,
  };

  return new Promise((resolve, reject) => {
    directionsService.route(request, (result, status) => {
      if (status === google.maps.DirectionsStatus.OK) {
        const routes = fromDirectionsResult(result, {
          vehicleId: 'van-001',
          routeIdPrefix: 'delivery-',
          includeStopDetails: true,
        });
        resolve(routes);
      } else {
        reject(new Error(`Directions request failed: ${status}`));
      }
    });
  });
}

const routes = await getDirections();
console.log(routes);

Polyline Encoding/Decoding

typescript
import { encodePolyline, decodePolyline } from '@route-optimization/converter';

// Store route as encoded polyline (saves space)
const route = {
  id: 'route-1',
  vehicleId: 'vehicle-1',
  stops: [...],
  polyline: encodePolyline([
    { lat: 13.7563, lng: 100.5018 },
    { lat: 13.7467, lng: 100.5342 },
    { lat: 13.7279, lng: 100.5241 },
  ]),
};

// Later, decode for display
const coordinates = decodePolyline(route.polyline);
console.log(`Route has ${coordinates.length} points`);

Route Statistics

typescript
import {
  calculateRouteDistance,
  calculateRouteDuration,
  extractWaypoints,
} from '@route-optimization/converter';

function displayRouteInfo(directionsResult: google.maps.DirectionsResult) {
  const distance = calculateRouteDistance(directionsResult);
  const duration = calculateRouteDuration(directionsResult);
  const waypoints = extractWaypoints(directionsResult);

  return {
    distanceKm: (distance / 1000).toFixed(2),
    durationMin: (duration / 60).toFixed(0),
    waypointCount: waypoints.length,
  };
}

const info = displayRouteInfo(directionsResult);
console.log(`
  Distance: ${info.distanceKm} km
  Duration: ${info.durationMin} minutes
  Waypoints: ${info.waypointCount}
`);

Bi-directional Conversion

typescript
import {
  toDirectionsResult,
  fromDirectionsResult,
} from '@route-optimization/converter';

// Route Optimization → Google Maps
const routes = [...]; // Your routes
const directionsResult = toDirectionsResult(routes);

// Display with Google Maps DirectionsRenderer
const renderer = new google.maps.DirectionsRenderer();
renderer.setDirections(directionsResult);

// Google Maps → Route Optimization
const parsedRoutes = fromDirectionsResult(directionsResult);

// Both formats are now available
console.log('Original routes:', routes);
console.log('Parsed routes:', parsedRoutes);

Integration with Route Optimization

typescript
import { fromDirectionsResult } from '@route-optimization/converter';
import { RouteMap } from '@route-optimization/vanilla';

async function displayOptimizedRoute() {
  // Get directions from Google Maps
  const directionsService = new google.maps.DirectionsService();

  const request = {
    origin: 'Bangkok, Thailand',
    destination: 'Pattaya, Thailand',
    waypoints: [{ location: 'Chonburi, Thailand' }, { location: 'Si Racha, Thailand' }],
    optimizeWaypoints: true, // Google optimizes order
    travelMode: google.maps.TravelMode.DRIVING,
  };

  directionsService.route(request, (result, status) => {
    if (status === google.maps.DirectionsStatus.OK) {
      // Convert to Route Optimization format
      const routes = fromDirectionsResult(result, {
        vehicleId: 'delivery-van-1',
      });

      // Display with Route Optimization
      const routeMap = new RouteMap({
        apiKey: 'YOUR_API_KEY',
        container: 'map',
      });

      routeMap.initialize().then(() => {
        routeMap.renderRoute(routes[0]);
      });
    }
  });
}

TypeScript Support

Full type definitions included:

typescript
import type { ConversionOptions, ParseOptions } from '@route-optimization/converter';

import {
  toDirectionsResult,
  fromDirectionsResult,
  encodePolyline,
  decodePolyline,
} from '@route-optimization/converter';

const options: ConversionOptions = {
  travelMode: google.maps.TravelMode.DRIVING,
  optimizeWaypoints: true,
};

const parseOptions: ParseOptions = {
  vehicleId: 'truck-001',
  routeIdPrefix: 'route-',
  includeStopDetails: true,
};

Error Handling

typescript
import { toDirectionsResult } from '@route-optimization/converter';

try {
  const directionsResult = toDirectionsResult(routes);
  // Use directionsResult
} catch (error) {
  if (error instanceof Error) {
    console.error('Conversion failed:', error.message);

    if (error.message.includes('empty')) {
      console.log('No routes to convert');
    } else if (error.message.includes('stops')) {
      console.log('Invalid stops data');
    }
  }
}

Common Use Cases

1. Display Google Directions with Route Optimization UI

typescript
const directionsResult = /* from Google Maps API */;
const routes = fromDirectionsResult(directionsResult);

// Use with Route Optimization components
<RouteMapView route={routes[0]} />

2. Save Routes in Compact Format

typescript
const route = /* your route */;
const encoded = encodePolyline(route.stops.map(s => s.location));

// Store in database (much smaller than JSON)
await database.save({ routeId: route.id, polyline: encoded });

3. Optimize Waypoints with Google, Display with Route Optimization

typescript
// Get optimized route from Google
const directionsResult = await getOptimizedDirections(stops);

// Convert to Route Optimization format
const routes = fromDirectionsResult(directionsResult);

// Display with custom UI
const routeMap = new RouteMap({ ... });
routeMap.renderRoute(routes[0]);

Next Steps

Released under the MIT License.