clip_image002

Live Sample
Source Code

Estava um dia desse fazendo algumas pesquisas na internet e encontrei uma séries de post no blog do grande Oren Gal, pedi a autorização dele para traduzir para português esta série de post e publica-los aqui no blog da comunidade.

Se desejar acesse o post original em Oren Gal Post

A fim de obter direções de condução, é preciso conectar a um serviço de roteamento. Há vários fornecedores, e este post trata de um deles (ESRI), mas é claro você pode mudá-lo com desejar.
Você não precisa de um mapa para chamar um serviço de roteamento. Tudo que você precisa é enviar duas ou mais coordenadas (início e destino em Latitude / Longitude) e o serviço retornará a direções de condução. As coordenadas podem ser criadas através de um serviço de geocodificação de endereços para o que se traduz a Latitude / Longitude.

Esta amostra é, naturalmente, em um mapa, porque é mais divertido. Neste demo iremos clicar no ponto de partida e no ponto de destino. Em seguida, o serviço será chamado e os resultados serão gravados para a página (ListBox). Clicar em um item na lista vai destacar a seção de condução no mapa. Tudo é feito com a ESRI Silverlight API.

Dirigir com segurança.

/ / criar a tarefa e duas camadas gráfico
public partial class MainPage : UserControl
{
    GraphicsLayer mGraphicRoute = new GraphicsLayer();
    GraphicsLayer mGraphicPoints = new GraphicsLayer();
    RouteTask mRouteTask = new RouteTask("http://tasks.arcgisonline.com/ArcGIS/rest/services/NetworkAnalysis/ESRI_Route_NA/NAServer/Route");
    MapPoint mClicked = new MapPoint(0, 0);
public MainPage()
{
    InitializeComponent();
    mRouteTask.SolveCompleted += new EventHandler<RouteEventArgs>(pRouteTask_SolveCompleted);
    mRouteTask.Failed += new EventHandler<TaskFailedEventArgs>(pRouteTask_Failed);
}
/ / Criando duas bandeiras em uma camada e outra camada vazia
private void m_esri_Initialized(object sender, EventArgs e)
{
    Graphic g1 = new Graphic() { Geometry = new MapPoint(0, 0), Symbol = new FlagSymbol("red") };
    Graphic g2 = new Graphic() { Geometry = new MapPoint(0, 0), Symbol = new FlagSymbol("blue") };
    mGraphicPoints.Graphics.Add(g1);
    mGraphicPoints.Graphics.Add(g2);
    m_map.Layers.Add(mGraphicRoute);
    m_map.Layers.Add(mGraphicPoints);
}
/ / Mostrando um popup quando o botão direito no mapa
private void m_map_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
    Point p = e.GetPosition(this);
    mClicked = m_map.ScreenToMap(p);
    m_popup.Margin = new Thickness(p.X, p.Y, 0, 0);
    m_popup.IsOpen = true;
}
/ / Definindo os pontos e executar a tarefa (se já não estiver em execução)
private void button_Click(object sender, RoutedEventArgs e)
{
    this.m_popup.IsOpen = false;
    if (sender == this.SetStart)
    mGraphicPoints.Graphics[0].Geometry = mClicked;
    if (sender == this.SetDestination)
    mGraphicPoints.Graphics[1].Geometry = mClicked;
    if (mGraphicPoints.Graphics[0].Geometry.Extent.XMax != 0 && mGraphicPoints.Graphics[1].Geometry.Extent.XMax != 0)
    {
        if (mRouteTask.IsBusy)
    {
        mRouteTask.CancelAsync();
    }
    else
{
/ / Nós pedimos o serviço para retornar as direções (o padrão é false)
RouteParameters pRouteParameters = new RouteParameters()
{
Stops = mGraphicPoints, UseTimeWindows = true, ReturnDirections = true
};
mRouteTask.SolveAsync(pRouteParameters);
}
}
}
/ / Agora precisamos obter os resultados e analisá-lo a uma lista legível. Copiado algumas linhas de formatação a partir de amostras ESRI.
void pRouteTask_SolveCompleted(object sender, RouteEventArgs e)
{
    mGraphicRoute.ClearGraphics();
    RouteResult pRouteResult = e.RouteResults[0];
    int i = 0;
    m_lst_directions.Items.Clear();
    DirectionsFeatureSet dfs = pRouteResult.Directions;
    foreach (Graphic g in dfs.Features)
{
    StringBuilder pStringBuilder = new SystemTextStringBuilder();
    pStringBuilder.AppendFormat("{0}. {1}", i, g.Attributes["text"]);
    if (i > 0 && i < dfs.Features.Count – 1)
{
    string distance = FormatDistance(Convert.ToDouble(g.Attributes["length"]), "miles");
    string time = null;
    if (g.Attributes.ContainsKey("time"))
    {
         time = FormatTime(Convert.ToDouble(g.Attributes["time"]));
    }
    if (!string.IsNullOrEmpty(distance) || !string.IsNullOrEmpty(time))
    pStringBuilder.Append(" (");
    pStringBuilder.Append(distance);
    if (!string.IsNullOrEmpty(distance) && !string.IsNullOrEmpty(time))
    pStringBuilder.Append(", ");
    pStringBuilder.Append(time);
    if (!string.IsNullOrEmpty(distance) || !string.IsNullOrEmpty(time))
    pStringBuilder.Append(")");
/ / Cada sentido é inserida para o Mapa eo ListBox após convertê-la de volta à Web-Mercator
Graphic g2 = new Graphic()
{
    Geometry = reverse_polyline((Polyline)get_mercator_geometry(g.Geometry)),
    Symbol = new DashedLineSymbol(System.Windows.Media.Colors.Green, 5)
};
mGraphicRoute.Graphics.Add(g2);
TextBlock pTextBlock = new TextBlock() { Text = pStringBuilder.ToString(), Tag = g2 };
m_lst_directions.Items.Add(pTextBlock);
}
    i++;
}
}
/ / Se o serviço não funcionar- passe o limpa a lista
void pRouteTask_Failed(object sender, TaskFailedEventArgs e)
{
    mGraphicRoute.ClearGraphics();
    m_lst_directions.Items.Clear();
}
}

Antes do fim desta semana irei postar os outros artigos desta série. Espero que gostem e se divirtam muito.

#Silverlight pra dentro da cabeça.

Washington Azevedo | Consultor em Arquitetura/Desenvolvimento RIA

clip_image004clip_image006clip_image008