How to: Implement a Custom Route Provider
- 4 minutes to read
This example demonstrates how to implement a custom route provider and use it to calculate a route between two geographical points.
To do this, design a class inheriting the InformationDataProviderBase abstract class and implement its CreateData method. Then, design a class inheriting the IInformationData interface and override its IInformationData.OnDataResponse event. Implement the CalculateRouteCore method to provide custom route calculations.
Imports DevExpress.Xpf.Map
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Threading.Tasks
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Data
Imports System.Windows.Documents
Imports System.Windows.Input
Imports System.Windows.Media
Imports System.Windows.Media.Imaging
Imports System.Windows.Navigation
Imports System.Windows.Shapes
Namespace CustomRouteProvider
''' <summary>
''' Interaction logic for MainWindow.xaml
''' </summary>
Partial Public Class MainWindow
Inherits Window
Public Sub New()
InitializeComponent()
Dim provider As New RouteProvider()
infoLayer.DataProvider = provider
provider.CalculateRoute(New GeoPoint(70, 60), New GeoPoint(-60, -70))
End Sub
End Class
Public Class RouteProvider
Inherits InformationDataProviderBase
Protected Shadows ReadOnly Property Data() As RouteData
Get
Return CType(MyBase.Data, RouteData)
End Get
End Property
Public ReadOnly Property Route() As IEnumerable(Of GeoPoint)
Get
Return Data.Route
End Get
End Property
Public Overrides ReadOnly Property IsBusy() As Boolean
Get
Return False
End Get
End Property
Protected Overrides Function CreateData() As IInformationData
Return New RouteData()
End Function
Public Sub CalculateRoute(ByVal point1 As GeoPoint, ByVal point2 As GeoPoint)
Data.CalculateRoute(point1, point2)
End Sub
Public Overrides Sub Cancel()
Throw New NotImplementedException()
End Sub
Protected Overrides Function CreateObject() As MapDependencyObject
Return New RouteProvider()
End Function
End Class
Public Class RouteData
Implements IInformationData
Private ReadOnly route_Renamed As New List(Of GeoPoint)()
Public ReadOnly Property Route() As List(Of GeoPoint)
Get
Return route_Renamed
End Get
End Property
Public Event OnDataResponse As EventHandler(Of RequestCompletedEventArgs) Implements IInformationData.OnDataResponse
Private Function CreateEventArgs() As RequestCompletedEventArgs
Dim items(2) As MapItem
items(1) = New MapPushpin() With { _
.Location = route_Renamed(0), _
.Text = "A", _
.Information = route_Renamed(0).ToString() _
}
items(2) = New MapPushpin() With { _
.Location = route_Renamed(route_Renamed.Count - 1), _
.Text = "B", _
.Information = route_Renamed(route_Renamed.Count - 1).ToString() _
}
Dim polyline As New MapPolyline() With { _
.IsGeodesic = True, _
.Stroke = New SolidColorBrush() With {.Color = Colors.Red}, _
.StrokeStyle = New StrokeStyle() With {.Thickness = 4} _
}
For i As Integer = 0 To route_Renamed.Count - 1
polyline.Points.Add(route_Renamed(i))
Next i
items(0) = polyline
Return New RequestCompletedEventArgs(items, Nothing, False, Nothing)
End Function
Protected Sub RaiseChanged()
RaiseEvent OnDataResponse(Me, CreateEventArgs())
End Sub
Public Sub CalculateRoute(ByVal point1 As GeoPoint, ByVal point2 As GeoPoint)
CalculateRouteCore(point1, point2)
RaiseChanged()
End Sub
Private Sub CalculateRouteCore(ByVal point1 As GeoPoint, ByVal point2 As GeoPoint)
Me.route_Renamed.Clear()
route_Renamed.Add(point1)
route_Renamed.Add(point2)
End Sub
End Class
End Namespace