image

Live Sample
Source Code

Se desejar acesse o post original em Oren Gal Post

No post anterior eu expliquei como obter direcções de condução a partir do ponto A ao ponto B. Neste post eu vou adicionar vários destinos, barreiras e mudar a ordem das paradas. Também usar a busca de linha livre para localizar um lugar ou endereço e ver se funciona onde você mora (América do Norte e Europa). Você pode modificar um pouco o código e ele vai funcionar no seu Windows Phone. Eu não fiz isso. Olhe para esta aplicação para ver o ESRI Windows Phone API em ação.
Notas:
• Colocar uma barreira no outro lado da estrada não vai afetar o roteamento! Se você ver que, com o botão direito exatamente na rota existente e adicionar a barreira de novo;
• O mais longo o percurso, mais longo que você espera para a resposta. Por favor, seja paciente.

Se beber não dirigir.

Passo 1 – Adicionar Três camadas gráfica para o Mapa – Route (linha), Stops (ponto) and Barriers (ponto):

private void m_esri_Initialized(object sender, EventArgs e)

{

   mRouteTask.SolveCompleted += new EventHandler<RouteEventArgs>(pRouteTask_SolveCompleted);

   mRouteTask.Failed += new EventHandler<TaskFailedEventArgs>(pRouteTask_Failed);

   m_map.Layers.Add(mGraphicRoute);

   m_map.Layers.Add(mGraphicsPushpins);

   m_map.Layers.Add(mGraphicsBarriers);

}

Passo 2 – clique com o botão direito no menu (mapa) para adicionar um ponto de parada, adicione barreira, calcular rota e ampliar a rota:

private void button_Click(object sender, RoutedEventArgs e)

{

   if (sender == this.pop_addpoint || sender == this.pop_addbarrier)

{

Graphic g = null;

   if (sender == this.pop_addpoint)

{

   g = new Graphic() { Geometry = mClickedMerPoint, Symbol = new PinSymbol(++mPinNumber),

   MapTip = new MapTip() { Tag = "stop" } };

   mGraphicsPushpins.Graphics.Add(g);

}

   if (sender == this.pop_addbarrier)

{

   g = new Graphic() { Geometry = mClickedMerPoint, Symbol = new BarrierSymbol(), MapTip = new MapTip()

{ Tag = "barrier" } };

   mGraphicsBarriers.Graphics.Add(g);

}

    g.MouseRightButtonDown += new MouseButtonEventHandler(g_MouseRightButtonDown);

}

    else if (sender == this.pop_calcroute)

{

   route_esri();

}

   else if (sender == this.pop_zoomtoroute)

{

   if (mGraphicRoute.Graphics.Count > 0)

   m_map.ZoomTo(mGraphicRoute.FullExtent.Expand(1.5));

   else if (mGraphicsPushpins.Graphics.Count > 0)

   m_map.ZoomTo(mGraphicsPushpins.FullExtent.Expand(1.5));

   else

   MessageBox.Show("Please set a route first");

}

   else if (sender == this.pop_clearroute)

{

   mPointNumber= 0;

   mGraphicsPushpins.ClearGraphics();

   mGraphicsBarriers.ClearGraphics();

   mGraphicRoute.ClearGraphics();

}

}

Passo 3 – Habilitando botão direito sobre uma parada e uma barreira:

void g_MouseRightButtonDown(object sender, MouseButtonEventArgs e)

{

   Point p = e.GetPosition(this);

   e.Handled = true;

   Graphic g = (Graphic)sender;

   if (g.MapTip.Tag.ToString().ToLower().StartsWith("stop"))

{

   m_popup_pushpin.Margin = new Thickness(p.X, p.Y+10, 0, 0);

   m_popup_pushpin.IsOpen = true;

   m_popup_pushpin.Tag = g;

}

   else

{

   m_popup_barrier.Margin = new Thickness(p.X, p.Y+10, 0, 0);

   m_popup_barrier.IsOpen = true;

   m_popup_barrier.Tag = g;

}

}

Passo 4 – Funções de ponto de parada (zoom para, remover, remover todos, defina início, defina fim):

private void button_pushpin_Click(object sender, RoutedEventArgs e)

{

Graphic g = (Graphic)m_popup_pushpin.Tag;

if (sender == pop_zoomandcenter)

{

   MapPoint pMercatorPoint = (MapPoint)g.Geometry;

   double f = 2500;

   m_map.ZoomTo(new Envelope(pMercatorPoint.X – f, pMercatorPoint.Y – f, pMercatorPoint.X + f, pMercatorPoint.Y + f));

}

   else if (sender == pop_removepin)

   {

     mGraphicsPushpins.Graphics.Remove(g);

     mPointNumber = 0;

     foreach (Graphic g1 in mGraphicsPushpins.Graphics)

{

     mPointNumber++;

      g1.Symbol = new PointSymbol(mPointNumber);

}

else if (sender == pop_removeallpins)

{

   mGraphicsPushpins.ClearGraphics();

   mPointNumber = 0;

}

else if (sender == pop_setpointas1)

{

   mPointNumber = 1;

   g.Symbol = new PointSymbol(mPointNumber);

   mGraphicsPushpins.Graphics.Remove(g);

   mGraphicsPushpins.Graphics.Insert(0, g);

   foreach (Graphic g1 in mGraphicsPushpins.Graphics)

{

    if (g1 != g)

{

    mPointNumber++;

    g1.Symbol = new PointSymbol(mPointNumber);

   }

   }

   }

   else if (sender == pop_setpointaslast)

   {

   mPointNumber = 0;

   foreach (Graphic g1 in mGraphicsPushpins.Graphics)

{

   if (g1 != g)

{

   mPointNumber++;

   g1.Symbol = new PointSymbol(mPointNumber);

}

}

   mPointNumber++;

   g.Symbol = new PointSymbol(mPointNumber);

   mGraphicsPushpins.Graphics.Remove(g);

   mGraphicsPushpins.Graphics.Add(g);

}

}

Passo 5 – funções Barreira (remove only):

private void button_barrier_Click(object sender, RoutedEventArgs e)

{

   Graphic g = (Graphic)m_popup_barrier.Tag;

   if (sender == this.pop_removebarrier)

  mGraphicsBarriers.Graphics.Remove(g);

}

Passo 6 – calcular a rota com múltiplos pontos de parada e as barreiras através do serviço ESRI:
• O processo será iniciado somente se tivermos dois pontos ou mais, e se a tarefa não estiver rodando atualmente.
• América do Norte e Europa estão em duas diferentes URLs, de acordo com as coordenadas irá escolher a URL correta.

private void route_esri()

{

   if (mGraphicsPushpins.Graphics[0].Geometry.Extent.XMin< -3000000)

   mRouteTask.Url = "http://tasks.arcgisonline.com/ArcGIS/rest/services/NetworkAnalysis/ESRI_Route_NA/NAServer/Route&quot;;

   else

   mRouteTask.Url = "http://tasks.arcgisonline.com/ArcGIS/rest/services/NetworkAnalysis/ESRI_Route_EU/NAServer/Route&quot;;

   RouteParameters pRouteParameters = new RouteParameters()

{

   Stops = mGraphicsPushpins,

   Barriers = mGraphicsBarriers,

   UseTimeWindows = true,

   ReturnDirections = true

};

mRouteTask.SolveAsync(pRouteParameters);

}

Passo 7 – Preencher a condução direções ListBox (ver parte 1).

Passo 8 – Pressionar em uma ou mais direções na ListBox direções de condução:
• Cada linha pressionado irá mostrar uma linha amarela em movimento, não selecionados será verde.
• O mapa de zoom para as linhas selecionadas.

private void m_lst_directions_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

   foreach (TextBlock pTextBlock in e.AddedItems)

{

   Graphic g = (Graphic)pTextBlock.Tag;

   g.Symbol = new DashedLineSymbol(System.Windows.Media.Colors.Yellow, 5);

}

   foreach (TextBlock pTextBlock in e.RemovedItems)

{

    Graphic g = (Graphic)pTextBlock.Tag;

   g.Symbol = new DashedLineSymbol(System.Windows.Media.Colors.Green, 5);

}

    Envelope pEnv = new Envelope();

    foreach (TextBlock pTextBlock in m_lst_directions.SelectedItems)

{

   Graphic g = (Graphic)pTextBlock.Tag;

    pEnv = pEnv.Union(g.Geometry.Extent);

}

m_map.ZoomTo(pEnv.Expand(2));

Até o próximo post.

#Silverlight pra dentro da cabeça.

Washington Azevedo | Consultor em Arquitetura/Desenvolvimento RIA

clip_image0044clip_image0064clip_image0084