====== Map Suite Routing Quick Start Guide ====== {{section>upgrade_map_suite_to_10.0}}
private void Form1_Load(object sender, EventArgs e)
{
// Set the Map Unit and current extent
winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
winformsMap1.CurrentExtent = new RectangleShape(-97.7970203443604, 30.3231958204346, -97.6787456556397, 30.2358201795654);
// Define a new layer to render the the Austin streets
ShapeFileFeatureLayer austinStreetsLayer = new ShapeFileFeatureLayer(@"..\..\App_Data\Austinstreets.shp ");
austinStreetsLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.LocalRoad4;
austinStreetsLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
LayerOverlay austinStreetOverlay = new LayerOverlay();
austinStreetOverlay.Layers.Add("austinStreetsLayer", austinStreetsLayer);
winformsMap1.Overlays.Add("austinStreetOverlay", austinStreetOverlay);
// Define a Routing layer to render the route and stops
RoutingLayer routingLayer = new RoutingLayer();
austinStreetsLayer.Open();
routingLayer.StartPoint = austinStreetsLayer.FeatureSource.GetFeatureById("4716", ReturningColumnsType.NoColumns).GetShape().GetCenterPoint();
routingLayer.EndPoint = austinStreetsLayer.FeatureSource.GetFeatureById("9638", ReturningColumnsType.NoColumns).GetShape().GetCenterPoint();
austinStreetsLayer.Close();
LayerOverlay routingOverlay = new LayerOverlay();
routingOverlay.Layers.Add("RoutingLayer", routingLayer);
winformsMap1.Overlays.Add("RoutingOverlay", routingOverlay);
winformsMap1.Refresh();
}
(**NOTE:** The data used in this sample can be found in the attached sample above at "\AppData" folder)
Figure 4 shows what you'll see when you run your application.
{{routing:QSG_Routing_Img08.jpg}}
\\
// Figure 4. Initialize the map for finding a route.//
2. Find the shortest route and render it on the map.
Add a button named "Find The Shortest Path" and double-click it to add the click event. Next, enter the code below to find the shortest route and render it on the map.
private void button1_Click(object sender, EventArgs e)
{
ShapeFileFeatureSource featureSource = new ShapeFileFeatureSource(@"..\..\App_Data\Austinstreets.shp");
RtgRoutingSource routingSource = new RtgRoutingSource(@"..\..\App_Data\Austinstreets.rtg");
RoutingEngine routingEngine = new RoutingEngine(routingSource, featureSource);
RoutingLayer routingLayer = (RoutingLayer)((LayerOverlay)winformsMap1.Overlays[["RoutingOverlay"]]).Layers[["RoutingLayer"]];
winformsMap1.Overlays[["RoutingOverlay"]].Lock.EnterWriteLock();
try
{
routingLayer.Routes.Clear();
routingLayer.Routes.Add(routingEngine.GetRoute("4716", "9638").Route);
}
finally
{
winformsMap1.Overlays[["RoutingOverlay"]].Lock.ExitWriteLock();
}
winformsMap1.Refresh();
}
Run the sample and click the "Find The Shortest Path" button. You will see the result as shown in Figure 5.
{{routing:QSG_Routing_Img09.jpg}}
\\
// Figure 5. The shortest path between points has been generated.//
(**NOTE:** We can also use ''InMemoryFeatureLayer'' to render the routing result; ''RoutingLayer'' is just a shortcut to make it more convenient.)
==== Finding The Shortest Path Using Coordinates ====
The Map Suite Routing Extension also supports finding a route between specified coordinates. Below is the sample code that will make this happen.
private void Form1_Load(object sender, EventArgs e)
{
// Set the Map Unit and current extent
winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
winformsMap1.CurrentExtent = new RectangleShape(-97.7970203443604, 30.3231958204346, -97.6787456556397, 30.2358201795654);
// Define a new layer to render the the Austin streets
ShapeFileFeatureLayer austinStreetsLayer = new ShapeFileFeatureLayer(@"..\..\App_Data\Austinstreets.shp");
austinStreetsLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.LocalRoad4;
austinStreetsLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
LayerOverlay austinStreetOverlay = new LayerOverlay();
austinStreetOverlay.Layers.Add("austinStreetsLayer", austinStreetsLayer);
winformsMap1.Overlays.Add("austinStreetOverlay", austinStreetOverlay);
// Define a Routing layer to render the path and stops
RoutingLayer routingLayer = new RoutingLayer();
austinStreetsLayer.Open();
// The code that routes using coordinates
routingLayer.StartPoint = new PointShape(-97.763184, 30.299407);
routingLayer.EndPoint = new PointShape(-97.713382, 30.259609);
austinStreetsLayer.Close();
LayerOverlay routingOverlay = new LayerOverlay();
routingOverlay.Layers.Add("RoutingLayer", routingLayer);
winformsMap1.Overlays.Add("RoutingOverlay", routingOverlay);
winformsMap1.Refresh();
}
private void button1_Click(object sender, EventArgs e)
{
ShapeFileFeatureSource featureSource = new ShapeFileFeatureSource(@"..\..\App_Data\Austinstreets.shp");
RtgRoutingSource routingSource = new RtgRoutingSource(@"..\..\App_Data\Austinstreets.rtg");
RoutingEngine routingEngine = new RoutingEngine(routingSource, featureSource);
RoutingLayer routingLayer = (RoutingLayer)((LayerOverlay)winformsMap1.Overlays[["RoutingOverlay"]]).Layers[["RoutingLayer"]];
winformsMap1.Overlays[["RoutingOverlay"]].Lock.EnterWriteLock();
try
{
routingLayer.Routes.Clear();
routingLayer.Routes.Add(routingEngine.GetRoute(routingLayer.StartPoint, routingLayer.EndPoint).Route);
}
finally
{
winformsMap1.Overlays[["RoutingOverlay"]].Lock.ExitWriteLock();
}
winformsMap1.Refresh();
}
Now, you will see the same result as in Figure 5 after running.
==== Adding Sequential Intermediate Stops ====
With the help of a Routing Layer, it's easier to add sequential intermediate stops. Let's define two intermediate stops whose feature ids are "5137" and "8179." Use the code below to accomplish this.
private void Form1_Load(object sender, EventArgs e)
{
// Set the Map Unit and current extent
winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
winformsMap1.CurrentExtent = new RectangleShape(-97.7970203443604, 30.3231958204346, -97.6787456556397, 30.2358201795654);
// Define a new layer to render the the Austin streets
ShapeFileFeatureLayer austinStreetsLayer = new ShapeFileFeatureLayer(@"..\..\App_Data\Austinstreets.shp");
austinStreetsLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.LocalRoad4;
austinStreetsLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
LayerOverlay austinStreetOverlay = new LayerOverlay();
austinStreetOverlay.Layers.Add("austinStreetsLayer", austinStreetsLayer);
winformsMap1.Overlays.Add("austinStreetOverlay", austinStreetOverlay);
// Define a Routing layer to render the path and stops
RoutingLayer routingLayer = new RoutingLayer();
austinStreetsLayer.Open();
routingLayer.StartPoint = austinStreetsLayer.FeatureSource.GetFeatureById("4716", ReturningColumnsType.NoColumns).GetShape().GetCenterPoint();
PointShape stopPoint1 = austinStreetsLayer.FeatureSource.GetFeatureById("5137", ReturningColumnsType.NoColumns).GetShape().GetCenterPoint();
PointShape stopPoint2 = austinStreetsLayer.FeatureSource.GetFeatureById("8179", ReturningColumnsType.NoColumns).GetShape().GetCenterPoint();
routingLayer.StopPoints.Add(stopPoint1);
routingLayer.StopPoints.Add(stopPoint2);
routingLayer.EndPoint = austinStreetsLayer.FeatureSource.GetFeatureById("9638", ReturningColumnsType.NoColumns).GetShape().GetCenterPoint();
austinStreetsLayer.Close();
LayerOverlay routingOverlay = new LayerOverlay();
routingOverlay.Layers.Add("RoutingLayer", routingLayer);
winformsMap1.Overlays.Add("RoutingOverlay", routingOverlay);
winformsMap1.Refresh();
}
private void button1_Click(object sender, EventArgs e)
{
ShapeFileFeatureSource featureSource = new ShapeFileFeatureSource(@"..\..\App_Data\Austinstreets.shp");
RtgRoutingSource routingSource = new RtgRoutingSource(@"..\..\App_Data\Austinstreets.rtg");
RoutingEngine routingEngine = new RoutingEngine(routingSource, featureSource);
RoutingLayer routingLayer = (RoutingLayer)((LayerOverlay)winformsMap1.Overlays[["RoutingOverlay"]]).Layers[["RoutingLayer"]];
winformsMap1.Overlays[["RoutingOverlay"]].Lock.EnterWriteLock();
try
{
routingLayer.Routes.Clear();
// Generate all key points
Collection keyPoints = new Collection();
keyPoints.Add(routingLayer.StartPoint);
foreach (PointShape stop in routingLayer.StopPoints)
{
keyPoints.Add(stop);
}
keyPoints.Add(routingLayer.EndPoint);
// Get the path for each segment between two key points
for (int i = 0; i < keyPoints.Count - 1; i++)
{
routingLayer.Routes.Add(routingEngine.GetRoute(keyPoints[[i]], keyPoints[[i|+ 1]]).Route);
}
}
finally
{
winformsMap1.Overlays[["RoutingOverlay"]].Lock.ExitWriteLock();
}
winformsMap1.Refresh();
}
(**NOTE:** Here we also need to have a ''using Collections.ObjectModel'' added to the application.)
Let's run the application and click the "Find The Shortest Path" button. You will see the path and stops rendered on the map as shown in Figure 6.
{{routing:QSG_Routing_Img10.jpg}}
\\
// Figure 6. Finding path with intermediate stops.//
(**NOTE:** The Map Suite Routing Extension doesn't support finding a path between Matrix points (Points-to-Points Route), so the intermediate stops must be added in order.)
===== Summary =====
You now know how to use the Map Suite Routing Extension to find the shortest route. Let's recap what we have learned about the objects' relationships and how the pieces of Map Suite work together:
-It is of the utmost importance to make sure the features in the routing data source (including Shape Files and other data sources like Oracle, Postgre Database, SQL Server 2008, etc.) are LineShapes.
-The ''RoutingEngine'' is the main class that contains all of the other objects that define how to find a route.
-The ''RoutingLayer'' is a convenient class for finding and rendering a route. It allows us to add sequential intermediate stops.