ArcObjects Library Reference  

GeocodeRoute_WebServiceClass

About the Routing and geocoding application using the NAServer extension in ArcGIS for Server via a Web service Sample

[C#]

GeocodeRoute_WebServiceClass.cs

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.OleDb;
using System.Xml;
using System.Collections.Specialized;
using GeocodeRoute_WebService.WebService;

namespace Route_WebService
{
	/// <summary>
	/// Summary description for Form1.
	/// </summary>
	public class Route_WebServiceClass : System.Windows.Forms.Form
	{
		#region Window Controls Declaration

		private System.Windows.Forms.PictureBox pictureBox;
		private System.Windows.Forms.ComboBox cboNALayers;
		private System.Windows.Forms.Label label8;
		private System.Windows.Forms.CheckBox chkReturnMap;
		private System.Windows.Forms.Button cmdSolve;
		private System.ComponentModel.IContainer components;
		private System.Windows.Forms.CheckBox chkReturnDirections;
		private System.Windows.Forms.TabControl tabCtrlOutput;
		private System.Windows.Forms.TabPage tabReturnDirections;
		private System.Windows.Forms.TabPage tabReturnMap;
		private System.Windows.Forms.TreeView treeViewDirections;
		private System.Windows.Forms.GroupBox groupBox1;
		private System.Windows.Forms.TextBox txtStartStreetAddress;
		private System.Windows.Forms.Label lblStartCity;
		private System.Windows.Forms.TextBox txtStartCity;
		private System.Windows.Forms.Label lblStartZipCode;
		private System.Windows.Forms.TextBox txtStartZipCode;
		private System.Windows.Forms.Label lblStartStreetAddress;
		private System.Windows.Forms.Label label2;
		private System.Windows.Forms.TextBox txtStartState;
		private System.Windows.Forms.GroupBox groupBox2;
		private System.Windows.Forms.Label label1;
		private System.Windows.Forms.Label label3;
		private System.Windows.Forms.Label label4;
		private System.Windows.Forms.Label label5;
		private System.Windows.Forms.GroupBox groupBox3;
		private System.Windows.Forms.GroupBox groupBox4;
		private System.Windows.Forms.TextBox txtEndState;
		private System.Windows.Forms.TextBox txtEndZipCode;
		private System.Windows.Forms.TextBox txtEndCity;
		private System.Windows.Forms.TextBox txtEndStreetAddress;

		private SanFrancisco_NAServer m_naServer;

		#endregion

		public Route_WebServiceClass()
		{
			//
			// Required for Windows Form Designer support
			//
			InitializeComponent();
		}

		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		protected override void Dispose(bool disposing)
		{
			if (disposing)
			{
				if (components != null)
				{
					components.Dispose();
				}
			}
			base.Dispose(disposing);
		}

		#region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{
			this.cmdSolve = new System.Windows.Forms.Button();
			this.pictureBox = new System.Windows.Forms.PictureBox();
			this.chkReturnMap = new System.Windows.Forms.CheckBox();
			this.cboNALayers = new System.Windows.Forms.ComboBox();
			this.label8 = new System.Windows.Forms.Label();
			this.chkReturnDirections = new System.Windows.Forms.CheckBox();
			this.tabCtrlOutput = new System.Windows.Forms.TabControl();
			this.tabReturnMap = new System.Windows.Forms.TabPage();
			this.tabReturnDirections = new System.Windows.Forms.TabPage();
			this.treeViewDirections = new System.Windows.Forms.TreeView();
			this.groupBox1 = new System.Windows.Forms.GroupBox();
			this.txtEndState = new System.Windows.Forms.TextBox();
			this.label1 = new System.Windows.Forms.Label();
			this.txtEndZipCode = new System.Windows.Forms.TextBox();
			this.label3 = new System.Windows.Forms.Label();
			this.txtEndCity = new System.Windows.Forms.TextBox();
			this.label4 = new System.Windows.Forms.Label();
			this.txtEndStreetAddress = new System.Windows.Forms.TextBox();
			this.label5 = new System.Windows.Forms.Label();
			this.groupBox3 = new System.Windows.Forms.GroupBox();
			this.txtStartState = new System.Windows.Forms.TextBox();
			this.label2 = new System.Windows.Forms.Label();
			this.txtStartZipCode = new System.Windows.Forms.TextBox();
			this.lblStartZipCode = new System.Windows.Forms.Label();
			this.txtStartCity = new System.Windows.Forms.TextBox();
			this.lblStartCity = new System.Windows.Forms.Label();
			this.txtStartStreetAddress = new System.Windows.Forms.TextBox();
			this.lblStartStreetAddress = new System.Windows.Forms.Label();
			this.groupBox2 = new System.Windows.Forms.GroupBox();
			this.groupBox4 = new System.Windows.Forms.GroupBox();
			((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
			this.tabCtrlOutput.SuspendLayout();
			this.tabReturnMap.SuspendLayout();
			this.tabReturnDirections.SuspendLayout();
			this.groupBox1.SuspendLayout();
			this.groupBox4.SuspendLayout();
			this.SuspendLayout();
			// 
			// cmdSolve
			// 
			this.cmdSolve.Location = new System.Drawing.Point(120, 384);
			this.cmdSolve.Name = "cmdSolve";
			this.cmdSolve.Size = new System.Drawing.Size(200, 32);
			this.cmdSolve.TabIndex = 29;
			this.cmdSolve.Text = "Find Route";
			this.cmdSolve.Click += new System.EventHandler(this.cmdSolve_Click);
			// 
			// pictureBox
			// 
			this.pictureBox.BackColor = System.Drawing.Color.White;
			this.pictureBox.Location = new System.Drawing.Point(8, 16);
			this.pictureBox.Name = "pictureBox";
			this.pictureBox.Size = new System.Drawing.Size(448, 360);
			this.pictureBox.TabIndex = 20;
			this.pictureBox.TabStop = false;
			// 
			// chkReturnMap
			// 
			this.chkReturnMap.Checked = true;
			this.chkReturnMap.CheckState = System.Windows.Forms.CheckState.Checked;
			this.chkReturnMap.Location = new System.Drawing.Point(8, 64);
			this.chkReturnMap.Name = "chkReturnMap";
			this.chkReturnMap.Size = new System.Drawing.Size(96, 16);
			this.chkReturnMap.TabIndex = 7;
			this.chkReturnMap.Text = "Return Map";
			// 
			// cboNALayers
			// 
			this.cboNALayers.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
			this.cboNALayers.Location = new System.Drawing.Point(112, 24);
			this.cboNALayers.Name = "cboNALayers";
			this.cboNALayers.Size = new System.Drawing.Size(248, 21);
			this.cboNALayers.TabIndex = 3;
			// 
			// label8
			// 
			this.label8.Location = new System.Drawing.Point(8, 24);
			this.label8.Name = "label8";
			this.label8.Size = new System.Drawing.Size(88, 16);
			this.label8.TabIndex = 71;
			this.label8.Text = "NALayer Name";
			// 
			// chkReturnDirections
			// 
			this.chkReturnDirections.Checked = true;
			this.chkReturnDirections.CheckState = System.Windows.Forms.CheckState.Checked;
			this.chkReturnDirections.Location = new System.Drawing.Point(160, 64);
			this.chkReturnDirections.Name = "chkReturnDirections";
			this.chkReturnDirections.Size = new System.Drawing.Size(160, 16);
			this.chkReturnDirections.TabIndex = 19;
			this.chkReturnDirections.Text = "Generate Directions";
			// 
			// tabCtrlOutput
			// 
			this.tabCtrlOutput.Controls.Add(this.tabReturnMap);
			this.tabCtrlOutput.Controls.Add(this.tabReturnDirections);
			this.tabCtrlOutput.Enabled = false;
			this.tabCtrlOutput.Location = new System.Drawing.Point(440, 32);
			this.tabCtrlOutput.Name = "tabCtrlOutput";
			this.tabCtrlOutput.SelectedIndex = 0;
			this.tabCtrlOutput.Size = new System.Drawing.Size(472, 408);
			this.tabCtrlOutput.TabIndex = 30;
			// 
			// tabReturnMap
			// 
			this.tabReturnMap.Controls.Add(this.pictureBox);
			this.tabReturnMap.Location = new System.Drawing.Point(4, 22);
			this.tabReturnMap.Name = "tabReturnMap";
			this.tabReturnMap.Size = new System.Drawing.Size(464, 382);
			this.tabReturnMap.TabIndex = 0;
			this.tabReturnMap.Text = "Map";
			// 
			// tabReturnDirections
			// 
			this.tabReturnDirections.Controls.Add(this.treeViewDirections);
			this.tabReturnDirections.Location = new System.Drawing.Point(4, 22);
			this.tabReturnDirections.Name = "tabReturnDirections";
			this.tabReturnDirections.Size = new System.Drawing.Size(464, 382);
			this.tabReturnDirections.TabIndex = 1;
			this.tabReturnDirections.Text = "Directions";
			// 
			// treeViewDirections
			// 
			this.treeViewDirections.Location = new System.Drawing.Point(0, 8);
			this.treeViewDirections.Name = "treeViewDirections";
			this.treeViewDirections.Size = new System.Drawing.Size(448, 368);
			this.treeViewDirections.TabIndex = 69;
			// 
			// groupBox1
			// 
			this.groupBox1.Controls.Add(this.txtEndState);
			this.groupBox1.Controls.Add(this.label1);
			this.groupBox1.Controls.Add(this.txtEndZipCode);
			this.groupBox1.Controls.Add(this.label3);
			this.groupBox1.Controls.Add(this.txtEndCity);
			this.groupBox1.Controls.Add(this.label4);
			this.groupBox1.Controls.Add(this.txtEndStreetAddress);
			this.groupBox1.Controls.Add(this.label5);
			this.groupBox1.Controls.Add(this.groupBox3);
			this.groupBox1.Controls.Add(this.txtStartState);
			this.groupBox1.Controls.Add(this.label2);
			this.groupBox1.Controls.Add(this.txtStartZipCode);
			this.groupBox1.Controls.Add(this.lblStartZipCode);
			this.groupBox1.Controls.Add(this.txtStartCity);
			this.groupBox1.Controls.Add(this.lblStartCity);
			this.groupBox1.Controls.Add(this.txtStartStreetAddress);
			this.groupBox1.Controls.Add(this.lblStartStreetAddress);
			this.groupBox1.Controls.Add(this.groupBox2);
			this.groupBox1.Location = new System.Drawing.Point(24, 24);
			this.groupBox1.Name = "groupBox1";
			this.groupBox1.Size = new System.Drawing.Size(408, 232);
			this.groupBox1.TabIndex = 72;
			this.groupBox1.TabStop = false;
			this.groupBox1.Text = "Enter addresses to get map and directions";
			// 
			// txtEndState
			// 
			this.txtEndState.Location = new System.Drawing.Point(216, 184);
			this.txtEndState.Name = "txtEndState";
			this.txtEndState.Size = new System.Drawing.Size(72, 20);
			this.txtEndState.TabIndex = 15;
			this.txtEndState.Text = "California";
			// 
			// label1
			// 
			this.label1.Location = new System.Drawing.Point(176, 184);
			this.label1.Name = "label1";
			this.label1.Size = new System.Drawing.Size(32, 16);
			this.label1.TabIndex = 14;
			this.label1.Text = "State";
			// 
			// txtEndZipCode
			// 
			this.txtEndZipCode.Location = new System.Drawing.Point(344, 184);
			this.txtEndZipCode.Name = "txtEndZipCode";
			this.txtEndZipCode.Size = new System.Drawing.Size(48, 20);
			this.txtEndZipCode.TabIndex = 17;
			this.txtEndZipCode.Text = "94123";
			// 
			// label3
			// 
			this.label3.Location = new System.Drawing.Point(296, 184);
			this.label3.Name = "label3";
			this.label3.Size = new System.Drawing.Size(56, 16);
			this.label3.TabIndex = 16;
			this.label3.Text = "Zip Code";
			// 
			// txtEndCity
			// 
			this.txtEndCity.Location = new System.Drawing.Point(56, 184);
			this.txtEndCity.Name = "txtEndCity";
			this.txtEndCity.Size = new System.Drawing.Size(112, 20);
			this.txtEndCity.TabIndex = 13;
			this.txtEndCity.Text = "San Francisco";
			// 
			// label4
			// 
			this.label4.Location = new System.Drawing.Point(24, 184);
			this.label4.Name = "label4";
			this.label4.Size = new System.Drawing.Size(64, 16);
			this.label4.TabIndex = 12;
			this.label4.Text = "City";
			// 
			// txtEndStreetAddress
			// 
			this.txtEndStreetAddress.Location = new System.Drawing.Point(104, 152);
			this.txtEndStreetAddress.Name = "txtEndStreetAddress";
			this.txtEndStreetAddress.Size = new System.Drawing.Size(288, 20);
			this.txtEndStreetAddress.TabIndex = 11;
			this.txtEndStreetAddress.Text = "171 Capra Way";
			// 
			// label5
			// 
			this.label5.Location = new System.Drawing.Point(24, 152);
			this.label5.Name = "label5";
			this.label5.Size = new System.Drawing.Size(96, 16);
			this.label5.TabIndex = 10;
			this.label5.Text = "Street Address";
			// 
			// groupBox3
			// 
			this.groupBox3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
			this.groupBox3.Location = new System.Drawing.Point(8, 128);
			this.groupBox3.Name = "groupBox3";
			this.groupBox3.Size = new System.Drawing.Size(392, 88);
			this.groupBox3.TabIndex = 18;
			this.groupBox3.TabStop = false;
			this.groupBox3.Text = "Arriving at:";
			// 
			// txtStartState
			// 
			this.txtStartState.Location = new System.Drawing.Point(216, 88);
			this.txtStartState.Name = "txtStartState";
			this.txtStartState.Size = new System.Drawing.Size(72, 20);
			this.txtStartState.TabIndex = 6;
			this.txtStartState.Text = "California";
			// 
			// label2
			// 
			this.label2.Location = new System.Drawing.Point(176, 90);
			this.label2.Name = "label2";
			this.label2.Size = new System.Drawing.Size(32, 16);
			this.label2.TabIndex = 5;
			this.label2.Text = "State";
			// 
			// txtStartZipCode
			// 
			this.txtStartZipCode.Location = new System.Drawing.Point(344, 88);
			this.txtStartZipCode.Name = "txtStartZipCode";
			this.txtStartZipCode.Size = new System.Drawing.Size(48, 20);
			this.txtStartZipCode.TabIndex = 8;
			this.txtStartZipCode.Text = "94110";
			// 
			// lblStartZipCode
			// 
			this.lblStartZipCode.Location = new System.Drawing.Point(296, 90);
			this.lblStartZipCode.Name = "lblStartZipCode";
			this.lblStartZipCode.Size = new System.Drawing.Size(56, 16);
			this.lblStartZipCode.TabIndex = 7;
			this.lblStartZipCode.Text = "Zip Code";
			// 
			// txtStartCity
			// 
			this.txtStartCity.Location = new System.Drawing.Point(56, 88);
			this.txtStartCity.Name = "txtStartCity";
			this.txtStartCity.Size = new System.Drawing.Size(112, 20);
			this.txtStartCity.TabIndex = 4;
			this.txtStartCity.Text = "San Francisco";
			// 
			// lblStartCity
			// 
			this.lblStartCity.Location = new System.Drawing.Point(24, 90);
			this.lblStartCity.Name = "lblStartCity";
			this.lblStartCity.Size = new System.Drawing.Size(64, 16);
			this.lblStartCity.TabIndex = 3;
			this.lblStartCity.Text = "City";
			// 
			// txtStartStreetAddress
			// 
			this.txtStartStreetAddress.Location = new System.Drawing.Point(104, 56);
			this.txtStartStreetAddress.Name = "txtStartStreetAddress";
			this.txtStartStreetAddress.Size = new System.Drawing.Size(288, 20);
			this.txtStartStreetAddress.TabIndex = 2;
			this.txtStartStreetAddress.Text = "113 Cleridge Street";
			// 
			// lblStartStreetAddress
			// 
			this.lblStartStreetAddress.Location = new System.Drawing.Point(24, 58);
			this.lblStartStreetAddress.Name = "lblStartStreetAddress";
			this.lblStartStreetAddress.Size = new System.Drawing.Size(96, 16);
			this.lblStartStreetAddress.TabIndex = 1;
			this.lblStartStreetAddress.Text = "Street Address";
			// 
			// groupBox2
			// 
			this.groupBox2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
			this.groupBox2.Location = new System.Drawing.Point(8, 32);
			this.groupBox2.Name = "groupBox2";
			this.groupBox2.Size = new System.Drawing.Size(392, 88);
			this.groupBox2.TabIndex = 9;
			this.groupBox2.TabStop = false;
			this.groupBox2.Text = "Starting from:";
			// 
			// groupBox4
			// 
			this.groupBox4.Controls.Add(this.label8);
			this.groupBox4.Controls.Add(this.cboNALayers);
			this.groupBox4.Controls.Add(this.chkReturnDirections);
			this.groupBox4.Controls.Add(this.chkReturnMap);
			this.groupBox4.Location = new System.Drawing.Point(24, 272);
			this.groupBox4.Name = "groupBox4";
			this.groupBox4.Size = new System.Drawing.Size(408, 88);
			this.groupBox4.TabIndex = 72;
			this.groupBox4.TabStop = false;
			this.groupBox4.Text = "Solve Parameters";
			// 
			// Route_WebServiceClass
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(936, 454);
			this.Controls.Add(this.groupBox1);
			this.Controls.Add(this.tabCtrlOutput);
			this.Controls.Add(this.cmdSolve);
			this.Controls.Add(this.groupBox4);
			this.Name = "Route_WebServiceClass";
			this.Text = "NAServer - Geocode Route Web Service";
			this.Load += new System.EventHandler(this.Form1_Load);
			((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
			this.tabCtrlOutput.ResumeLayout(false);
			this.tabReturnMap.ResumeLayout(false);
			this.tabReturnDirections.ResumeLayout(false);
			this.groupBox1.ResumeLayout(false);
			this.groupBox1.PerformLayout();
			this.groupBox4.ResumeLayout(false);
			this.ResumeLayout(false);

		}
		#endregion

		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		[STAThread]
		static void Main()
		{
			Application.Run(new Route_WebServiceClass());
		}

		/// <summary>
		/// This function
		///     - sets the server and solver parameters
		///     - populates the stops NALocations
		///     - gets and displays the server results (map, directions)
		/// </summary>
		private void cmdSolve_Click(object sender, System.EventArgs e)
		{
			this.Cursor = Cursors.WaitCursor;

			try
			{
				// Get SolverParams
				NAServerSolverParams solverParams = m_naServer.GetSolverParameters(cboNALayers.Text) as NAServerSolverParams;

				// Set Solver parameters
				SetServerSolverParams(solverParams);

				// Load Locations
				LoadLocations(solverParams);

				//Solve the Route
				NAServerSolverResults solverResults;
				solverResults = m_naServer.Solve(solverParams);

				//Get NAServer results in the tab controls
				OutputResults(solverParams, solverResults);

			}
			catch (Exception exception)
			{
				MessageBox.Show(exception.Message, "An error has occurred");
			}

			this.Cursor = Cursors.Default;
		}

		/// <summary>
		/// This function
		///     - gets all route network analysis layers
		///     - selects the first route network analysis layer
		///     - sets all controls for this route network analysis layer
		/// </summary>
		private void GetNetworkAnalysisLayers()
		{

			this.Cursor = Cursors.WaitCursor;

			try
			{

				//Get Route NA layer names
				cboNALayers.Items.Clear();
				string[] naLayers = m_naServer.GetNALayerNames(esriNAServerLayerType.esriNAServerRouteLayer);
				for (int i = 0; i < naLayers.Length; i++)
				{
					cboNALayers.Items.Add(naLayers[i]);
				}

				// Select the first NA Layer name
				if (cboNALayers.Items.Count > 0)
					cboNALayers.SelectedIndex = 0;
				else
					MessageBox.Show("There is no Network Analyst layer associated with this MapServer object!", "NAServer - Route Sample", System.Windows.Forms.MessageBoxButtons.OK);

			}
			catch (Exception exception)
			{
				MessageBox.Show(exception.Message, "An error has occurred");
			}

			this.Cursor = Cursors.Default;
		}

		/// <summary>
		/// Set server solver paramaters  (ReturnMap, SnapTolerance, etc.)
		/// </summary>
		private void SetServerSolverParams(NAServerSolverParams solverParams)
		{
			solverParams.ReturnMap = chkReturnMap.Checked;
			solverParams.ImageDescription.ImageDisplay.ImageWidth = pictureBox.Width;
			solverParams.ImageDescription.ImageDisplay.ImageHeight = pictureBox.Height;


			NAServerRouteParams routeParams = solverParams as NAServerRouteParams;
			if (routeParams != null)
				routeParams.ReturnDirections = chkReturnDirections.Checked;
		}

		/// <summary>
		/// Load form
		/// </summary> 
		private void Form1_Load(object sender, System.EventArgs e)
		{
			try
			{
				ConnectToWebService();
				GetNetworkAnalysisLayers();
			}
			catch (Exception exception)
			{
				MessageBox.Show(exception.Message, "An error has occurred");
			}
		}

		/// <summary>
		/// Get NAServer Object from the web service
		/// </summary>		
		private void ConnectToWebService()
		{
			m_naServer = null;

			// Get NAServer
			m_naServer = new SanFrancisco_NAServer();
			if (m_naServer != null)
				return;

			throw (new System.Exception("Could not find the web service."));

		}

		/// <summary>
		/// This function shows how to populate stop locations using an array of PropertySets
		/// </summary>
		private void LoadLocations(NAServerSolverParams solverParams)
		{
			// Geocode Addresses
			PropertySet[] propSets = new PropertySet[2];
			propSets[0] = GeocodeAddress(txtStartStreetAddress.Text, txtStartCity.Text, txtStartState.Text, txtStartZipCode.Text);
			propSets[1] = GeocodeAddress(txtEndStreetAddress.Text, txtEndCity.Text, txtEndState.Text, txtEndZipCode.Text);

			NAServerPropertySets StopsPropSets = new NAServerPropertySets();
			StopsPropSets.PropertySets = propSets;

			NAServerRouteParams routeParams = solverParams as NAServerRouteParams;
			routeParams.Stops = StopsPropSets;
		}

		/// <summary>
		/// Geocode an address based on the street name, city, state, and zip code
		/// Throws and exception and returns null if the address was unmatched.
		/// </summary> 
		private PropertySet GeocodeAddress(string StreetAddress, string City, string State, string ZipCode)
		{
			PropertySet propSet = null;

			try
			{
				SanFranciscoLocator_GeocodeServer gc = new SanFranciscoLocator_GeocodeServer();
				PropertySet pAddressProperties = new PropertySet();

				Fields pAddressFields;
				Field pField;

				PropertySetProperty[] propSetProperty = new PropertySetProperty[4];
				pAddressFields = gc.GetAddressFields();
				for (int i = 0; i < pAddressFields.FieldArray.GetLength(0); i++)
				{
					pField = pAddressFields.FieldArray[i];

					if (pField.Name.ToUpper() == "STREET")
						propSetProperty[0] = CreatePropertySetProperty(pField.AliasName, StreetAddress) as PropertySetProperty;

					if (pField.Name.ToUpper() == "CITY")
						propSetProperty[1] = CreatePropertySetProperty(pField.AliasName, City) as PropertySetProperty;

					if (pField.Name.ToUpper() == "STATE")
						propSetProperty[2] = CreatePropertySetProperty(pField.AliasName, State) as PropertySetProperty;

					if (pField.Name.ToUpper() == "ZIP")
						propSetProperty[3] = CreatePropertySetProperty(pField.AliasName, ZipCode) as PropertySetProperty;

				}

				pAddressProperties.PropertyArray = propSetProperty;

				// find the matching address	
				propSet = gc.GeocodeAddress(pAddressProperties, null);
			}
			catch (Exception exception)
			{
				MessageBox.Show(exception.Message, "An error has occurred");
			}

			// Throw and error if the geocoded address is "Unmatched"
			if ((propSet != null) && (propSet.PropertyArray[1].Value.ToString() == "U"))
				throw (new System.Exception("Could not geocode [" + StreetAddress + "]"));

			return propSet;
		}

		/// <summary>
		/// CreatePropertySetProperty
		/// </summary> 
		private PropertySetProperty CreatePropertySetProperty(string key, object value)
		{
			PropertySetProperty propSetProperty = new PropertySetProperty();
			propSetProperty.Key = key;
			propSetProperty.Value = value;
			return propSetProperty;
		}

		/// <summary>
		/// Output Results map, Directions
		/// </summary>
		private void OutputResults(NAServerSolverParams solverParams, NAServerSolverResults solverResults)
		{
			string messagesSolverResults = "";

			// Output Solve messages
			GPMessages gpMessages = solverResults.SolveMessages;
			GPMessage[] arrGPMessage = gpMessages.GPMessages1;
			if (arrGPMessage != null)
			{
				for (int i = 0; i < arrGPMessage.GetLength(0); i++)
				{
					GPMessage gpMessage = arrGPMessage[i];
					messagesSolverResults += "\n" + gpMessage.MessageDesc;
				}
			}

			// Output the total impedance of each route
			NAServerRouteResults routeSolverResults = solverResults as NAServerRouteResults;

			//Output Map
			pictureBox.Image = null;
			if (solverParams.ReturnMap)
			{
				pictureBox.Image = System.Drawing.Image.FromStream(new System.IO.MemoryStream(solverResults.MapImage.ImageData));
			}
			pictureBox.Refresh();

			if (routeSolverResults != null)
				OutputDirections(routeSolverResults.Directions); // Return Directions if generated

			tabCtrlOutput.Enabled = true;
		}

		/// <summary>
		/// Output Directions if a TreeView control
		/// </summary> 
		private void OutputDirections(NAStreetDirections[] serverDirections)
		{
			if (serverDirections == null)
			{
				treeViewDirections.Nodes.Clear();
				TreeNode newNode = new TreeNode("Directions not generated");
				treeViewDirections.Nodes.Add(newNode);
				return;
			}

			// Suppress repainting the TreeView until all the objects have been created.
			treeViewDirections.BeginUpdate();

			// Clear the TreeView each time the method is called.
			treeViewDirections.Nodes.Clear();

			for (int i = serverDirections.GetLowerBound(0); i <= serverDirections.GetUpperBound(0); i++)
			{
				// get Directions from the ith route
				NAStreetDirections directions;
				directions = serverDirections[i];

				// get Summary (Total Distance and Time)
				NAStreetDirection direction = directions.Summary;
				string totallength = null, totaltime = null;
				string[] SummaryStrings = direction.Strings;
				for (int k = SummaryStrings.GetLowerBound(0); k < SummaryStrings.GetUpperBound(0); k++)
				{
					if (direction.StringTypes[k] == esriDirectionsStringType.esriDSTLength)
						totallength = SummaryStrings[k];
					if (direction.StringTypes[k] == esriDirectionsStringType.esriDSTTime)
						totaltime = SummaryStrings[k];
				}

				// Add a Top a Node with the Route number and Total Distance and Total Time
				TreeNode newNode = new TreeNode("Directions for Route [" + (i + 1) + "] - Total Distance: " + totallength + " Total Time: " + totaltime);
				treeViewDirections.Nodes.Add(newNode);

				// Then add a node for each step-by-step directions
				NAStreetDirection[] StreetDirections = directions.Directions;
				for (int directionIndex = StreetDirections.GetLowerBound(0); directionIndex <= StreetDirections.GetUpperBound(0); directionIndex++)
				{
					NAStreetDirection streetDirection = StreetDirections[directionIndex];
					string[] StringStreetDirection = streetDirection.Strings;
					for (int stringIndex = StringStreetDirection.GetLowerBound(0); stringIndex <= StringStreetDirection.GetUpperBound(0); stringIndex++)
					{
						if (streetDirection.StringTypes[stringIndex] == esriDirectionsStringType.esriDSTGeneral ||
							streetDirection.StringTypes[stringIndex] == esriDirectionsStringType.esriDSTDepart ||
							streetDirection.StringTypes[stringIndex] == esriDirectionsStringType.esriDSTArrive)
							treeViewDirections.Nodes[i].Nodes.Add(new TreeNode(StringStreetDirection[stringIndex]));
					}
				}
			}

			// Check if Directions have been generated
			if (serverDirections.Length == 0)
			{
				TreeNode newNode = new TreeNode("Directions not generated");
				treeViewDirections.Nodes.Add(newNode);
			}

			// Begin repainting the TreeView.
			treeViewDirections.ExpandAll();
			treeViewDirections.EndUpdate();
		}
	}

}
[Visual Basic .NET]

GeocodeRoute_WebServiceClass.vb

Imports Microsoft.VisualBasic
Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data
Imports System.Data.OleDb
Imports System.Xml
Imports System.Collections.Specialized
Imports GeocodeRoute_WebService.WebService

Namespace Route_WebService
	''' <summary>
	''' Summary description for Form1.
	''' </summary>
	Public Class Route_WebServiceClass : Inherits System.Windows.Forms.Form
#Region "Window Controls Declaration"

		Private pictureBox As System.Windows.Forms.PictureBox
		Private cboNALayers As System.Windows.Forms.ComboBox
		Private label8 As System.Windows.Forms.Label
		Private chkReturnMap As System.Windows.Forms.CheckBox
		Private WithEvents cmdSolve As System.Windows.Forms.Button
		Private components As System.ComponentModel.IContainer
		Private chkReturnDirections As System.Windows.Forms.CheckBox
		Private tabCtrlOutput As System.Windows.Forms.TabControl
		Private tabReturnDirections As System.Windows.Forms.TabPage
		Private tabReturnMap As System.Windows.Forms.TabPage
		Private treeViewDirections As System.Windows.Forms.TreeView
		Private groupBox1 As System.Windows.Forms.GroupBox
		Private txtStartStreetAddress As System.Windows.Forms.TextBox
		Private lblStartCity As System.Windows.Forms.Label
		Private txtStartCity As System.Windows.Forms.TextBox
		Private lblStartZipCode As System.Windows.Forms.Label
		Private txtStartZipCode As System.Windows.Forms.TextBox
		Private lblStartStreetAddress As System.Windows.Forms.Label
		Private label2 As System.Windows.Forms.Label
		Private txtStartState As System.Windows.Forms.TextBox
		Private groupBox2 As System.Windows.Forms.GroupBox
		Private label1 As System.Windows.Forms.Label
		Private label3 As System.Windows.Forms.Label
		Private label4 As System.Windows.Forms.Label
		Private label5 As System.Windows.Forms.Label
		Private groupBox3 As System.Windows.Forms.GroupBox
		Private groupBox4 As System.Windows.Forms.GroupBox
		Private txtEndState As System.Windows.Forms.TextBox
		Private txtEndZipCode As System.Windows.Forms.TextBox
		Private txtEndCity As System.Windows.Forms.TextBox
		Private txtEndStreetAddress As System.Windows.Forms.TextBox

		Private m_naServer As SanFrancisco_NAServer

#End Region

		Public Sub New()
			'
			' Required for Windows Form Designer support
			'
			InitializeComponent()
		End Sub

		''' <summary>
		''' Clean up any resources being used.
		''' </summary>
		Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
			If disposing Then
				If Not components Is Nothing Then
					components.Dispose()
				End If
			End If
			MyBase.Dispose(disposing)
		End Sub

#Region "Windows Form Designer generated code"
		''' <summary>
		''' Required method for Designer support - do not modify
		''' the contents of this method with the code editor.
		''' </summary>
		Private Sub InitializeComponent()
			Me.cmdSolve = New System.Windows.Forms.Button()
			Me.pictureBox = New System.Windows.Forms.PictureBox()
			Me.chkReturnMap = New System.Windows.Forms.CheckBox()
			Me.cboNALayers = New System.Windows.Forms.ComboBox()
			Me.label8 = New System.Windows.Forms.Label()
			Me.chkReturnDirections = New System.Windows.Forms.CheckBox()
			Me.tabCtrlOutput = New System.Windows.Forms.TabControl()
			Me.tabReturnMap = New System.Windows.Forms.TabPage()
			Me.tabReturnDirections = New System.Windows.Forms.TabPage()
			Me.treeViewDirections = New System.Windows.Forms.TreeView()
			Me.groupBox1 = New System.Windows.Forms.GroupBox()
			Me.txtEndState = New System.Windows.Forms.TextBox()
			Me.label1 = New System.Windows.Forms.Label()
			Me.txtEndZipCode = New System.Windows.Forms.TextBox()
			Me.label3 = New System.Windows.Forms.Label()
			Me.txtEndCity = New System.Windows.Forms.TextBox()
			Me.label4 = New System.Windows.Forms.Label()
			Me.txtEndStreetAddress = New System.Windows.Forms.TextBox()
			Me.label5 = New System.Windows.Forms.Label()
			Me.groupBox3 = New System.Windows.Forms.GroupBox()
			Me.txtStartState = New System.Windows.Forms.TextBox()
			Me.label2 = New System.Windows.Forms.Label()
			Me.txtStartZipCode = New System.Windows.Forms.TextBox()
			Me.lblStartZipCode = New System.Windows.Forms.Label()
			Me.txtStartCity = New System.Windows.Forms.TextBox()
			Me.lblStartCity = New System.Windows.Forms.Label()
			Me.txtStartStreetAddress = New System.Windows.Forms.TextBox()
			Me.lblStartStreetAddress = New System.Windows.Forms.Label()
			Me.groupBox2 = New System.Windows.Forms.GroupBox()
			Me.groupBox4 = New System.Windows.Forms.GroupBox()
			CType(Me.pictureBox, System.ComponentModel.ISupportInitialize).BeginInit()
			Me.tabCtrlOutput.SuspendLayout()
			Me.tabReturnMap.SuspendLayout()
			Me.tabReturnDirections.SuspendLayout()
			Me.groupBox1.SuspendLayout()
			Me.groupBox4.SuspendLayout()
			Me.SuspendLayout()
			' 
			' cmdSolve
			' 
			Me.cmdSolve.Location = New System.Drawing.Point(120, 384)
			Me.cmdSolve.Name = "cmdSolve"
			Me.cmdSolve.Size = New System.Drawing.Size(200, 32)
			Me.cmdSolve.TabIndex = 29
			Me.cmdSolve.Text = "Find Route"
			'			Me.cmdSolve.Click += New System.EventHandler(Me.cmdSolve_Click);
			' 
			' pictureBox
			' 
			Me.pictureBox.BackColor = System.Drawing.Color.White
			Me.pictureBox.Location = New System.Drawing.Point(8, 16)
			Me.pictureBox.Name = "pictureBox"
			Me.pictureBox.Size = New System.Drawing.Size(448, 360)
			Me.pictureBox.TabIndex = 20
			Me.pictureBox.TabStop = False
			' 
			' chkReturnMap
			' 
			Me.chkReturnMap.Checked = True
			Me.chkReturnMap.CheckState = System.Windows.Forms.CheckState.Checked
			Me.chkReturnMap.Location = New System.Drawing.Point(8, 64)
			Me.chkReturnMap.Name = "chkReturnMap"
			Me.chkReturnMap.Size = New System.Drawing.Size(96, 16)
			Me.chkReturnMap.TabIndex = 7
			Me.chkReturnMap.Text = "Return Map"
			' 
			' cboNALayers
			' 
			Me.cboNALayers.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
			Me.cboNALayers.Location = New System.Drawing.Point(112, 24)
			Me.cboNALayers.Name = "cboNALayers"
			Me.cboNALayers.Size = New System.Drawing.Size(248, 21)
			Me.cboNALayers.TabIndex = 3
			' 
			' label8
			' 
			Me.label8.Location = New System.Drawing.Point(8, 24)
			Me.label8.Name = "label8"
			Me.label8.Size = New System.Drawing.Size(88, 16)
			Me.label8.TabIndex = 71
			Me.label8.Text = "NALayer Name"
			' 
			' chkReturnDirections
			' 
			Me.chkReturnDirections.Checked = True
			Me.chkReturnDirections.CheckState = System.Windows.Forms.CheckState.Checked
			Me.chkReturnDirections.Location = New System.Drawing.Point(160, 64)
			Me.chkReturnDirections.Name = "chkReturnDirections"
			Me.chkReturnDirections.Size = New System.Drawing.Size(160, 16)
			Me.chkReturnDirections.TabIndex = 19
			Me.chkReturnDirections.Text = "Generate Directions"
			' 
			' tabCtrlOutput
			' 
			Me.tabCtrlOutput.Controls.Add(Me.tabReturnMap)
			Me.tabCtrlOutput.Controls.Add(Me.tabReturnDirections)
			Me.tabCtrlOutput.Enabled = False
			Me.tabCtrlOutput.Location = New System.Drawing.Point(440, 32)
			Me.tabCtrlOutput.Name = "tabCtrlOutput"
			Me.tabCtrlOutput.SelectedIndex = 0
			Me.tabCtrlOutput.Size = New System.Drawing.Size(472, 408)
			Me.tabCtrlOutput.TabIndex = 30
			' 
			' tabReturnMap
			' 
			Me.tabReturnMap.Controls.Add(Me.pictureBox)
			Me.tabReturnMap.Location = New System.Drawing.Point(4, 22)
			Me.tabReturnMap.Name = "tabReturnMap"
			Me.tabReturnMap.Size = New System.Drawing.Size(464, 382)
			Me.tabReturnMap.TabIndex = 0
			Me.tabReturnMap.Text = "Map"
			' 
			' tabReturnDirections
			' 
			Me.tabReturnDirections.Controls.Add(Me.treeViewDirections)
			Me.tabReturnDirections.Location = New System.Drawing.Point(4, 22)
			Me.tabReturnDirections.Name = "tabReturnDirections"
			Me.tabReturnDirections.Size = New System.Drawing.Size(464, 382)
			Me.tabReturnDirections.TabIndex = 1
			Me.tabReturnDirections.Text = "Directions"
			' 
			' treeViewDirections
			' 
			Me.treeViewDirections.Location = New System.Drawing.Point(0, 8)
			Me.treeViewDirections.Name = "treeViewDirections"
			Me.treeViewDirections.Size = New System.Drawing.Size(448, 368)
			Me.treeViewDirections.TabIndex = 69
			' 
			' groupBox1
			' 
			Me.groupBox1.Controls.Add(Me.txtEndState)
			Me.groupBox1.Controls.Add(Me.label1)
			Me.groupBox1.Controls.Add(Me.txtEndZipCode)
			Me.groupBox1.Controls.Add(Me.label3)
			Me.groupBox1.Controls.Add(Me.txtEndCity)
			Me.groupBox1.Controls.Add(Me.label4)
			Me.groupBox1.Controls.Add(Me.txtEndStreetAddress)
			Me.groupBox1.Controls.Add(Me.label5)
			Me.groupBox1.Controls.Add(Me.groupBox3)
			Me.groupBox1.Controls.Add(Me.txtStartState)
			Me.groupBox1.Controls.Add(Me.label2)
			Me.groupBox1.Controls.Add(Me.txtStartZipCode)
			Me.groupBox1.Controls.Add(Me.lblStartZipCode)
			Me.groupBox1.Controls.Add(Me.txtStartCity)
			Me.groupBox1.Controls.Add(Me.lblStartCity)
			Me.groupBox1.Controls.Add(Me.txtStartStreetAddress)
			Me.groupBox1.Controls.Add(Me.lblStartStreetAddress)
			Me.groupBox1.Controls.Add(Me.groupBox2)
			Me.groupBox1.Location = New System.Drawing.Point(24, 24)
			Me.groupBox1.Name = "groupBox1"
			Me.groupBox1.Size = New System.Drawing.Size(408, 232)
			Me.groupBox1.TabIndex = 72
			Me.groupBox1.TabStop = False
			Me.groupBox1.Text = "Enter addresses to get map and directions"
			' 
			' txtEndState
			' 
			Me.txtEndState.Location = New System.Drawing.Point(216, 184)
			Me.txtEndState.Name = "txtEndState"
			Me.txtEndState.Size = New System.Drawing.Size(72, 20)
			Me.txtEndState.TabIndex = 15
			Me.txtEndState.Text = "California"
			' 
			' label1
			' 
			Me.label1.Location = New System.Drawing.Point(176, 184)
			Me.label1.Name = "label1"
			Me.label1.Size = New System.Drawing.Size(32, 16)
			Me.label1.TabIndex = 14
			Me.label1.Text = "State"
			' 
			' txtEndZipCode
			' 
			Me.txtEndZipCode.Location = New System.Drawing.Point(344, 184)
			Me.txtEndZipCode.Name = "txtEndZipCode"
			Me.txtEndZipCode.Size = New System.Drawing.Size(48, 20)
			Me.txtEndZipCode.TabIndex = 17
			Me.txtEndZipCode.Text = "94123"
			' 
			' label3
			' 
			Me.label3.Location = New System.Drawing.Point(296, 184)
			Me.label3.Name = "label3"
			Me.label3.Size = New System.Drawing.Size(56, 16)
			Me.label3.TabIndex = 16
			Me.label3.Text = "Zip Code"
			' 
			' txtEndCity
			' 
			Me.txtEndCity.Location = New System.Drawing.Point(56, 184)
			Me.txtEndCity.Name = "txtEndCity"
			Me.txtEndCity.Size = New System.Drawing.Size(112, 20)
			Me.txtEndCity.TabIndex = 13
			Me.txtEndCity.Text = "San Francisco"
			' 
			' label4
			' 
			Me.label4.Location = New System.Drawing.Point(24, 184)
			Me.label4.Name = "label4"
			Me.label4.Size = New System.Drawing.Size(64, 16)
			Me.label4.TabIndex = 12
			Me.label4.Text = "City"
			' 
			' txtEndStreetAddress
			' 
			Me.txtEndStreetAddress.Location = New System.Drawing.Point(104, 152)
			Me.txtEndStreetAddress.Name = "txtEndStreetAddress"
			Me.txtEndStreetAddress.Size = New System.Drawing.Size(288, 20)
			Me.txtEndStreetAddress.TabIndex = 11
			Me.txtEndStreetAddress.Text = "171 Capra Way"
			' 
			' label5
			' 
			Me.label5.Location = New System.Drawing.Point(24, 152)
			Me.label5.Name = "label5"
			Me.label5.Size = New System.Drawing.Size(96, 16)
			Me.label5.TabIndex = 10
			Me.label5.Text = "Street Address"
			' 
			' groupBox3
			' 
			Me.groupBox3.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, (CByte(0)))
			Me.groupBox3.Location = New System.Drawing.Point(8, 128)
			Me.groupBox3.Name = "groupBox3"
			Me.groupBox3.Size = New System.Drawing.Size(392, 88)
			Me.groupBox3.TabIndex = 18
			Me.groupBox3.TabStop = False
			Me.groupBox3.Text = "Arriving at:"
			' 
			' txtStartState
			' 
			Me.txtStartState.Location = New System.Drawing.Point(216, 88)
			Me.txtStartState.Name = "txtStartState"
			Me.txtStartState.Size = New System.Drawing.Size(72, 20)
			Me.txtStartState.TabIndex = 6
			Me.txtStartState.Text = "California"
			' 
			' label2
			' 
			Me.label2.Location = New System.Drawing.Point(176, 90)
			Me.label2.Name = "label2"
			Me.label2.Size = New System.Drawing.Size(32, 16)
			Me.label2.TabIndex = 5
			Me.label2.Text = "State"
			' 
			' txtStartZipCode
			' 
			Me.txtStartZipCode.Location = New System.Drawing.Point(344, 88)
			Me.txtStartZipCode.Name = "txtStartZipCode"
			Me.txtStartZipCode.Size = New System.Drawing.Size(48, 20)
			Me.txtStartZipCode.TabIndex = 8
			Me.txtStartZipCode.Text = "94110"
			' 
			' lblStartZipCode
			' 
			Me.lblStartZipCode.Location = New System.Drawing.Point(296, 90)
			Me.lblStartZipCode.Name = "lblStartZipCode"
			Me.lblStartZipCode.Size = New System.Drawing.Size(56, 16)
			Me.lblStartZipCode.TabIndex = 7
			Me.lblStartZipCode.Text = "Zip Code"
			' 
			' txtStartCity
			' 
			Me.txtStartCity.Location = New System.Drawing.Point(56, 88)
			Me.txtStartCity.Name = "txtStartCity"
			Me.txtStartCity.Size = New System.Drawing.Size(112, 20)
			Me.txtStartCity.TabIndex = 4
			Me.txtStartCity.Text = "San Francisco"
			' 
			' lblStartCity
			' 
			Me.lblStartCity.Location = New System.Drawing.Point(24, 90)
			Me.lblStartCity.Name = "lblStartCity"
			Me.lblStartCity.Size = New System.Drawing.Size(64, 16)
			Me.lblStartCity.TabIndex = 3
			Me.lblStartCity.Text = "City"
			' 
			' txtStartStreetAddress
			' 
			Me.txtStartStreetAddress.Location = New System.Drawing.Point(104, 56)
			Me.txtStartStreetAddress.Name = "txtStartStreetAddress"
			Me.txtStartStreetAddress.Size = New System.Drawing.Size(288, 20)
			Me.txtStartStreetAddress.TabIndex = 2
			Me.txtStartStreetAddress.Text = "113 Cleridge Street"
			' 
			' lblStartStreetAddress
			' 
			Me.lblStartStreetAddress.Location = New System.Drawing.Point(24, 58)
			Me.lblStartStreetAddress.Name = "lblStartStreetAddress"
			Me.lblStartStreetAddress.Size = New System.Drawing.Size(96, 16)
			Me.lblStartStreetAddress.TabIndex = 1
			Me.lblStartStreetAddress.Text = "Street Address"
			' 
			' groupBox2
			' 
			Me.groupBox2.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, (CByte(0)))
			Me.groupBox2.Location = New System.Drawing.Point(8, 32)
			Me.groupBox2.Name = "groupBox2"
			Me.groupBox2.Size = New System.Drawing.Size(392, 88)
			Me.groupBox2.TabIndex = 9
			Me.groupBox2.TabStop = False
			Me.groupBox2.Text = "Starting from:"
			' 
			' groupBox4
			' 
			Me.groupBox4.Controls.Add(Me.label8)
			Me.groupBox4.Controls.Add(Me.cboNALayers)
			Me.groupBox4.Controls.Add(Me.chkReturnDirections)
			Me.groupBox4.Controls.Add(Me.chkReturnMap)
			Me.groupBox4.Location = New System.Drawing.Point(24, 272)
			Me.groupBox4.Name = "groupBox4"
			Me.groupBox4.Size = New System.Drawing.Size(408, 88)
			Me.groupBox4.TabIndex = 72
			Me.groupBox4.TabStop = False
			Me.groupBox4.Text = "Solve Parameters"
			' 
			' Route_WebServiceClass
			' 
			Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
			Me.ClientSize = New System.Drawing.Size(936, 454)
			Me.Controls.Add(Me.groupBox1)
			Me.Controls.Add(Me.tabCtrlOutput)
			Me.Controls.Add(Me.cmdSolve)
			Me.Controls.Add(Me.groupBox4)
			Me.Name = "Route_WebServiceClass"
			Me.Text = "NAServer - Geocode Route Web Service"
			'			Me.Load += New System.EventHandler(Me.Form1_Load);
			CType(Me.pictureBox, System.ComponentModel.ISupportInitialize).EndInit()
			Me.tabCtrlOutput.ResumeLayout(False)
			Me.tabReturnMap.ResumeLayout(False)
			Me.tabReturnDirections.ResumeLayout(False)
			Me.groupBox1.ResumeLayout(False)
			Me.groupBox1.PerformLayout()
			Me.groupBox4.ResumeLayout(False)
			Me.ResumeLayout(False)

		End Sub
#End Region

		''' <summary>
		''' The main entry point for the application.
		''' </summary>
		<STAThread()> _
		Shared Sub Main()
			Application.Run(New Route_WebServiceClass())
		End Sub

		''' <summary>
		''' This function
		'''     - sets the server and solver parameters
		'''     - populates the stops NALocations
		'''     - gets and displays the server results (map, directions)
		''' </summary>
		Private Sub cmdSolve_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdSolve.Click
			Me.Cursor = Cursors.WaitCursor

			Try
				' Get SolverParams
				Dim solverParams As NAServerSolverParams = TryCast(m_naServer.GetSolverParameters(cboNALayers.Text), NAServerSolverParams)

				' Set Solver params
				SetServerSolverParams(solverParams)

				' Load Locations
				LoadLocations(solverParams)

				'Solve the Route
				Dim solverResults As NAServerSolverResults
				solverResults = m_naServer.Solve(solverParams)

				'Get NAServer results in the tab controls
				OutputResults(solverParams, solverResults)

			Catch exception As Exception
				MessageBox.Show(exception.Message, "An error has occurred")
			End Try

			Me.Cursor = Cursors.Default
		End Sub

		''' <summary>
		''' This function
		'''     - gets all route network analysis layers
		'''     - selects the first route network analysis layer
		'''     - sets all controls for this route network analysis layer
		''' </summary>
		Private Sub GetNetworkAnalysisLayers()

			Me.Cursor = Cursors.WaitCursor

			Try

				'Get Route NA layer names
				cboNALayers.Items.Clear()
				Dim naLayers As String() = m_naServer.GetNALayerNames(esriNAServerLayerType.esriNAServerRouteLayer)
				Dim i As Integer = 0
				Do While i < naLayers.Length
					cboNALayers.Items.Add(naLayers(i))
					i += 1
				Loop

				' Select the first NA Layer name
				If cboNALayers.Items.Count > 0 Then
					cboNALayers.SelectedIndex = 0
				Else
					MessageBox.Show("There is no Network Analyst layer associated with this MapServer object!", "NAServer - Route Sample", System.Windows.Forms.MessageBoxButtons.OK)
				End If

			Catch exception As Exception
				MessageBox.Show(exception.Message, "An error has occurred")
			End Try

			Me.Cursor = Cursors.Default
		End Sub

		''' <summary>
		''' Set server solver paramaters  (ReturnMap, SnapTolerance, etc.)
		''' </summary>
		Private Sub SetServerSolverParams(ByVal solverParams As NAServerSolverParams)
			solverParams.ReturnMap = chkReturnMap.Checked
			solverParams.ImageDescription.ImageDisplay.ImageWidth = pictureBox.Width
			solverParams.ImageDescription.ImageDisplay.ImageHeight = pictureBox.Height


			Dim routeParams As NAServerRouteParams = TryCast(solverParams, NAServerRouteParams)
			If Not routeParams Is Nothing Then
				routeParams.ReturnDirections = chkReturnDirections.Checked
			End If
		End Sub

		''' <summary>
		''' Load form
		''' </summary> 
		Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
			Try
				ConnectToWebService()
				GetNetworkAnalysisLayers()
			Catch exception As Exception
				MessageBox.Show(exception.Message, "An error has occurred")
			End Try
		End Sub

		''' <summary>
		''' Get NAServer Object from the web service
		''' </summary>		
		Private Sub ConnectToWebService()
			m_naServer = Nothing

			' Get NAServer
			m_naServer = New SanFrancisco_NAServer()
			If Not m_naServer Is Nothing Then
				Return
			End If

			Throw (New System.Exception("Could not find the web service."))

		End Sub

		''' <summary>
		''' This function shows how to populate stop locations using an array of PropertySets
		''' </summary>
		Private Sub LoadLocations(ByVal solverParams As NAServerSolverParams)
			' Geocode Addresses
			Dim propSets As PropertySet() = New PropertySet(1) {}
			propSets(0) = GeocodeAddress(txtStartStreetAddress.Text, txtStartCity.Text, txtStartState.Text, txtStartZipCode.Text)
			propSets(1) = GeocodeAddress(txtEndStreetAddress.Text, txtEndCity.Text, txtEndState.Text, txtEndZipCode.Text)

			Dim StopsPropSets As NAServerPropertySets = New NAServerPropertySets()
			StopsPropSets.PropertySets = propSets

			Dim routeParams As NAServerRouteParams = TryCast(solverParams, NAServerRouteParams)
			routeParams.Stops = StopsPropSets
		End Sub

		''' <summary>
		''' Geocode an address based on the street name, city, state, and zip code
		''' Throws and exception and returns null if the address was unmatched.
		''' </summary> 
		Private Function GeocodeAddress(ByVal StreetAddress As String, ByVal City As String, ByVal State As String, ByVal ZipCode As String) As PropertySet
			Dim propSet As PropertySet = Nothing

			Try
				Dim gc As SanFranciscoLocator_GeocodeServer = New SanFranciscoLocator_GeocodeServer()
				Dim pAddressProperties As PropertySet = New PropertySet()

				Dim pAddressFields As Fields
				Dim pField As Field

				Dim propSetProperty As PropertySetProperty() = New PropertySetProperty(3) {}
				pAddressFields = gc.GetAddressFields()
				Dim i As Integer = 0
				Do While i < pAddressFields.FieldArray.GetLength(0)
					pField = pAddressFields.FieldArray(i)

					If pField.Name.ToUpper() = "STREET" Then
						propSetProperty(0) = TryCast(CreatePropertySetProperty(pField.AliasName, StreetAddress), PropertySetProperty)
					End If

					If pField.Name.ToUpper() = "CITY" Then
						propSetProperty(1) = TryCast(CreatePropertySetProperty(pField.AliasName, City), PropertySetProperty)
					End If

					If pField.Name.ToUpper() = "STATE" Then
						propSetProperty(2) = TryCast(CreatePropertySetProperty(pField.AliasName, State), PropertySetProperty)
					End If

					If pField.Name.ToUpper() = "ZIP" Then
						propSetProperty(3) = TryCast(CreatePropertySetProperty(pField.AliasName, ZipCode), PropertySetProperty)
					End If

					i += 1
				Loop

				pAddressProperties.PropertyArray = propSetProperty

				' find the matching address	
				propSet = gc.GeocodeAddress(pAddressProperties, Nothing)
			Catch exception As Exception
				MessageBox.Show(exception.Message, "An error has occurred")
			End Try

			' Throw and error if the geocoded address is "Unmatched"
			If (Not propSet Is Nothing) AndAlso (propSet.PropertyArray(1).Value.ToString() = "U") Then
				Throw (New System.Exception("Could not geocode [" & StreetAddress & "]"))
			End If

			Return propSet
		End Function

		''' <summary>
		''' CreatePropertySetProperty
		''' </summary> 
		Private Function CreatePropertySetProperty(ByVal key As String, ByVal value As Object) As PropertySetProperty
			Dim propSetProperty As PropertySetProperty = New PropertySetProperty()
			propSetProperty.Key = key
			propSetProperty.Value = value
			Return propSetProperty
		End Function

		''' <summary>
		''' Output Results map, Directions
		''' </summary>
		Private Sub OutputResults(ByVal solverParams As NAServerSolverParams, ByVal solverResults As NAServerSolverResults)
			Dim messagesSolverResults As String = ""

			' Output Solve messages
			Dim gpMessages As GPMessages = solverResults.SolveMessages
			Dim arrGPMessage As GPMessage() = gpMessages.GPMessages1
			If Not arrGPMessage Is Nothing Then
				Dim i As Integer = 0
				Do While i < arrGPMessage.GetLength(0)
					Dim gpMessage As GPMessage = arrGPMessage(i)
					messagesSolverResults &= Constants.vbLf + gpMessage.MessageDesc
					i += 1
				Loop
			End If

			' Output the total impedance of each route
			Dim routeSolverResults As NAServerRouteResults = TryCast(solverResults, NAServerRouteResults)

			'Output Map
			pictureBox.Image = Nothing
			If solverParams.ReturnMap Then
				pictureBox.Image = System.Drawing.Image.FromStream(New System.IO.MemoryStream(solverResults.MapImage.ImageData))
			End If
			pictureBox.Refresh()

			If Not routeSolverResults Is Nothing Then
				OutputDirections(routeSolverResults.Directions)	' Return Directions if generated
			End If

			tabCtrlOutput.Enabled = True
		End Sub

		''' <summary>
		''' Output Directions if a TreeView control
		''' </summary> 
		Private Sub OutputDirections(ByVal serverDirections As NAStreetDirections())
			If serverDirections Is Nothing Then
				treeViewDirections.Nodes.Clear()
				Dim newNode As TreeNode = New TreeNode("Directions not generated")
				treeViewDirections.Nodes.Add(newNode)
				Return
			End If

			' Suppress repainting the TreeView until all the objects have been created.
			treeViewDirections.BeginUpdate()

			' Clear the TreeView each time the method is called.
			treeViewDirections.Nodes.Clear()

			Dim i As Integer = serverDirections.GetLowerBound(0)
			Do While i <= serverDirections.GetUpperBound(0)
				' get Directions from the ith route
				Dim directions As NAStreetDirections
				directions = serverDirections(i)

				' get Summary (Total Distance and Time)
				Dim direction As NAStreetDirection = directions.Summary
				Dim totallength As String = Nothing, totaltime As String = Nothing
				Dim SummaryStrings As String() = direction.Strings
				Dim k As Integer = SummaryStrings.GetLowerBound(0)
				Do While k < SummaryStrings.GetUpperBound(0)
					If direction.StringTypes(k) = esriDirectionsStringType.esriDSTLength Then
						totallength = SummaryStrings(k)
					End If
					If direction.StringTypes(k) = esriDirectionsStringType.esriDSTTime Then
						totaltime = SummaryStrings(k)
					End If
					k += 1
				Loop

				' Add a Top a Node with the Route number and Total Distance and Total Time
				Dim newNode As TreeNode = New TreeNode("Directions for Route [" & (i + 1) & "] - Total Distance: " & totallength & " Total Time: " & totaltime)
				treeViewDirections.Nodes.Add(newNode)

				' Then add a node for each step-by-step directions
				Dim StreetDirections As NAStreetDirection() = directions.Directions
				Dim directionIndex As Integer = StreetDirections.GetLowerBound(0)
				Do While directionIndex <= StreetDirections.GetUpperBound(0)
					Dim streetDirection As NAStreetDirection = StreetDirections(directionIndex)
					Dim StringStreetDirection As String() = streetDirection.Strings
					Dim stringIndex As Integer = StringStreetDirection.GetLowerBound(0)
					Do While stringIndex <= StringStreetDirection.GetUpperBound(0)
						If streetDirection.StringTypes(stringIndex) = esriDirectionsStringType.esriDSTGeneral OrElse streetDirection.StringTypes(stringIndex) = esriDirectionsStringType.esriDSTDepart OrElse streetDirection.StringTypes(stringIndex) = esriDirectionsStringType.esriDSTArrive Then
							treeViewDirections.Nodes(i).Nodes.Add(New TreeNode(StringStreetDirection(stringIndex)))
						End If
						stringIndex += 1
					Loop
					directionIndex += 1
				Loop
				i += 1
			Loop

			' Check if Directions have been generated
			If serverDirections.Length = 0 Then
				Dim newNode As TreeNode = New TreeNode("Directions not generated")
				treeViewDirections.Nodes.Add(newNode)
			End If

			' Begin repainting the TreeView.
			treeViewDirections.ExpandAll()
			treeViewDirections.EndUpdate()
		End Sub
	End Class

End Namespace