Skip to main content

Simple routing

Contents

Calculate a route using Trimble Maps data for commercial vehicles and draw it on the map. (Requires routing plug-in).

route-on-a-map

activity_sample_routing.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent">
    <com.trimblemaps.mapsdk.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

Sample code

import React, { useEffect, useRef } from "react";
import {
  Dimensions,
  NativeModules,
  NativeEventEmitter,
  PixelRatio,
  StyleSheet,
  UIManager,
  View,
  findNodeHandle,
  Text,
} from "react-native";


import { RouteViewManager } from "./RouteViewManager";


const StyleManagerModule = NativeModules.StyleManagerModule;
const RouteViewModule = NativeModules.RouteViewModule;
const DirectionsModule = NativeModules.DirectionsModule;


const StyleConstants = StyleManagerModule?.getConstants();


export const SimpleRoute = () => {
  const ref = useRef(null);


  const createRouteViewFragment = (viewId) =>
    UIManager.dispatchViewManagerCommand(
      viewId,
      UIManager.RouteViewManager.Commands.create.toString(),
      [viewId]
    );


  const drawOnMap = async (viewId) => {
    await RouteViewModule.setRouteView(String(viewId));
    RouteViewModule.getMapAsync(() => {
      RouteViewModule.setStyleWithCallback(
        StyleConstants.MOBILE_DAY,
        async (routeViewFragmentTag) => {}
      );
      createAndFrameRoute(viewId);
    });
  };


  useEffect(() => {
    if (!loadedRequiredModules()) {
      return;
    }
    const viewId = findNodeHandle(ref.current);


    const eventEmitter = new NativeEventEmitter();
    let eventListener = eventEmitter.addListener(
      "RouteViewInitialized",
      (event) => {
        drawOnMap(viewId);
      }
    );


    createRouteViewFragment(viewId);
    return () => {
      eventListener.remove();
      StyleManagerModule.removeStyle(String(viewId));
      RouteViewModule.releaseMap();
    };
  }, []);


  const loadedRequiredModules = () => {
    if (
      StyleManagerModule == null ||
      RouteViewModule == null ||
      DirectionsModule == null
    ) {
      return false;
    }
    return true;
  };


  const routeCallback = async (result) => {


  };


  const createAndFrameRoute = async (viewId) => {
    await DirectionsModule.createDirectionsBuilder();
    await DirectionsModule.origin(40.361202, -74.599773);
    await DirectionsModule.destination(40.232968, -74.773348);
    await DirectionsModule.build();
    await RouteViewModule.createRouteBuilder();
    await RouteViewModule.id("testRoute");
    await RouteViewModule.routeOptions();
    await RouteViewModule.requestCallback(routeCallback);
    await RouteViewModule.color(StyleConstants.MAGENTA);
    await RouteViewModule.build();
    await RouteViewModule.addRoute(viewId);
    await RouteViewModule.frameRoute();
  };


  const styles = StyleSheet.create({
    container: {
      flex: 1,
    },
  });


  const errorView = <Text>Missing required modules</Text>;
  const defaultView = (
    <View style={styles.container}>
      <View style={styles.container}>
        <RouteViewManager
          style={{
            // converts dpi to px, provide desired height
            height: PixelRatio.getPixelSizeForLayoutSize(
              Dimensions.get("window").height
            ),
            // converts dpi to px, provide desired width
            width: PixelRatio.getPixelSizeForLayoutSize(
              Dimensions.get("window").width
            ),
          }}
          theme={StyleConstants?.MOBILE_DEFAULT}
          ref={ref}
        />
      </View>
    </View>
  );


  return loadedRequiredModules() ? defaultView : errorView;
};
Last updated October 3, 2023.
Contents