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";
else
mRouteTask.Url = "http://tasks.arcgisonline.com/ArcGIS/rest/services/NetworkAnalysis/ESRI_Route_EU/NAServer/Route";
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