Calculate Distance

The following sample uses the MapPoint service to calculate the distance between two zip codes using a simple route. It has two input parameters for the start and end zip codes and one output parameter for the total distance calculated.



using System;
using System.Collections.Generic;
using System.Text;
using System.Workflow.Activities;
using System.Workflow.ComponentModel;
using System.Configuration;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.Workflow;
using System.Net;
using System.Xml;

namespace CustomWorkflowActivity
{
// Get more information about the mappoint assembly from http://staging.mappoint.net/standard-30/
using net.mappoint.staging;

[CrmWorkflowActivity("Calculate Distance", "Mappoint Utilities")]
public class DistanceCalculator : SequenceActivity
{
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
// Set the MapPoint ID and password you created with your Bing Developer/License Account.
ICredentials creds = new NetworkCredential("MappointID", "MappointPassword");
string DataSourceName = "MapPoint.NA";
FindServiceSoap findService = new FindServiceSoap();
findService.Credentials = creds;
findService.PreAuthenticate = true;

RouteServiceSoap routeService = new RouteServiceSoap();
routeService.Credentials = creds;
routeService.PreAuthenticate = true;
routeService.UserInfoRouteHeaderValue = new UserInfoRouteHeader();
routeService.UserInfoRouteHeaderValue.DefaultDistanceUnit = DistanceUnit.Mile;

FindAddressSpecification addressSpecStart = new FindAddressSpecification();
addressSpecStart.DataSourceName = DataSourceName;
addressSpecStart.InputAddress = new Address();
addressSpecStart.InputAddress.PostalCode = this.zipCodeStart;

FindAddressSpecification addressSpecEnd = new FindAddressSpecification();
addressSpecEnd.DataSourceName = DataSourceName;
addressSpecEnd.InputAddress = new Address();
addressSpecEnd.InputAddress.PostalCode = this.zipCodeEnd;

FindResults resultsStart = findService.FindAddress(addressSpecStart);
FindResults resultsEnd = findService.FindAddress(addressSpecEnd);

LatLong startLatLong = resultsStart.Results[0].FoundLocation.LatLong;
LatLong endLatLong = resultsEnd.Results[0].FoundLocation.LatLong;

RouteSpecification routeSpec = new RouteSpecification();
routeSpec.DataSourceName = DataSourceName;
routeSpec.Segments = new SegmentSpecification[2];

routeSpec.Segments[0] = new SegmentSpecification();
routeSpec.Segments[0].Waypoint = new Waypoint();
routeSpec.Segments[0].Waypoint.Location = resultsStart.Results[0].FoundLocation;

routeSpec.Segments[1] = new SegmentSpecification();
routeSpec.Segments[1].Waypoint = new Waypoint();
routeSpec.Segments[1].Waypoint.Location = resultsEnd.Results[0].FoundLocation;


Route route = routeService.CalculateSimpleRoute(new LatLong[] { startLatLong, endLatLong }, DataSourceName, SegmentPreference.Quickest);
this.totalDistance = new CrmNumber((int)route.Itinerary.Distance);

return ActivityExecutionStatus.Closed;
}

public static DependencyProperty zipCodeStartProperty = DependencyProperty.Register("zipCodeStart", typeof(string), typeof(DistanceCalculator));

[CrmInput("Starting Zip Code")]
public string zipCodeStart
{
get
{
return (string)base.GetValue(zipCodeStartProperty);
}
set
{
base.SetValue(zipCodeStartProperty, value);
}
}

public static DependencyProperty zipCodeEndProperty = DependencyProperty.Register("zipCodeEnd", typeof(string), typeof(DistanceCalculator));

[CrmInput("Ending Zip Code")]
public string zipCodeEnd
{
get
{
return (string)base.GetValue(zipCodeEndProperty);
}
set
{
base.SetValue(zipCodeEndProperty, value);
}
}

public static DependencyProperty totalDistanceProperty = DependencyProperty.Register("totalDistance", typeof(CrmNumber), typeof(DistanceCalculator));

[CrmOutput("Total Distance")]
public CrmNumber totalDistance
{
get
{
return (CrmNumber)base.GetValue(totalDistanceProperty);
}
set
{
base.SetValue(totalDistanceProperty, value);
}

}
}

}