Merhabalar,
Bir önceki makalemizde Silverlight Virtal Earth de bir textboxa girilen lokasyonun yerini ve gps pointlerinin nasıl alınacağını ögrenmiştik. Şimdi ise belirtilen lokasyonlar arasında rotalama işlemini anlatacağız.
Rotalama işlminde Geocoding gibi MapPoint servisinin RouteServiceClient Class ını kullanacağız.
Bir önceki makalemizde bir lokasyon adı girdigimizde bize GocodeResult class ından türemiş bir sonuç döndürüyordu. Bu nesneleri bir listbox içine ekleyerek eklediğimiz noktalar arasında eklenme sırasına gore rota oluşturacagız. Önce Lokasyon Bulma ve ekleme kodlarına değinelim.
private void GeocodeAddress(string address)
{
MapGeocodeService.GeocodeRequest request = new MapGeocodeService.GeocodeRequest();
request.Culture = MyMap.Culture;
request.Query = address;
request.ExecutionOptions = new MapGeocodeService.ExecutionOptions();
request.ExecutionOptions.SuppressFaults = true;
request.Credentials = new MapGeocodeService.Credentials();
request.Credentials.Token = Token;
request.Options = new MapGeocodeService.GeocodeOptions();
request.Options.Filters = new ObservableCollection();
MapGeocodeService.ConfidenceFilter filter = new MapGeocodeService.ConfidenceFilter();
filter.MinimumConfidence = MapGeocodeService.Confidence.High;
request.Options.Filters.Add(filter);
FromOutput.Text = "";
// Service Çağrılır
GeocodeClient.GeocodeAsync(request);
}
private void client_GeocodeCompleted(object sender, MapGeocodeService.GeocodeCompletedEventArgs e)
{
string outString;
try
{
if (e.Result.ResponseSummary.StatusCode != MapGeocodeService.ResponseStatusCode.Success)
{
FromOutput.Text = outString = "error geocoding ... status <" + e.Result.ResponseSummary.StatusCode.ToString() + ">";
}
else if (0 == e.Result.Results.Count)
{
FromOutput.Text = outString = "No result";
}
else
{
GeocodeResult res = e.Result.Results[0];
lstLocations.Items.Add(res);
System.Windows.Shapes.Rectangle rec = new System.Windows.Shapes.Rectangle();
rec.Fill = new SolidColorBrush(Colors.Red);
rec.Width = 15;
rec.Height = 15;
rec.Opacity = 0.65;
mapLayer.AddChild(rec,new Microsoft.VirtualEarth.MapControl.Location(res.Locations[0].Latitude,res.Locations[0].Longitude));
}
}
catch (Exception)
{
outString = "Exception raised";
}
}
GeocodeAdress Methodu gelen adres bilgisini Mappoint servisine gönderir ve
client_GeocodeCompleted eventi de kodu incelediğimizde GeocodeResult tipindeki nesneyi lstLocations.Items.Add(res); diyerek listboxa ekler.
Rotalama kodlarını inceleyecek olursak :
void Rotala()
{
MapRouteService.RouteRequest request = new MapRouteService.RouteRequest();
request.Culture = MyMap.Culture;
request.Waypoints = new ObservableCollection();
for (int a = 0; a < lstLocations.Items.Count;a++)
{
request.Waypoints.Add(GeocodeResultToWaypoint(lstLocations.Items[a] as GeocodeResult));
}
request.ExecutionOptions = new MapRouteService.ExecutionOptions();
request.ExecutionOptions.SuppressFaults = true;
request.Credentials = new MapRouteService.Credentials();
request.Credentials.Token = Token;
request.Options = new MapRouteService.RouteOptions();
request.Options.RoutePathType = MapRouteService.RoutePathType.Points;
RouteClient.CalculateRouteAsync(request);
}
private MapRouteService.Waypoint GeocodeResultToWaypoint(MapGeocodeService.GeocodeResult result)
{
MapRouteService.Waypoint waypoint = new MapRouteService.Waypoint();
waypoint.Description = result.DisplayName;
waypoint.Location = new MapRouteService.Location();
waypoint.Location.Latitude = result.Locations[0].Latitude;
waypoint.Location.Longitude = result.Locations[0].Longitude;
return waypoint;
}
void routeClient_CalculateRouteCompleted(object sender, VirtualEarth1.MapRouteService.CalculateRouteCompletedEventArgs e)
{
string outString;
try
{
if (e.Result.ResponseSummary.StatusCode != MapRouteService.ResponseStatusCode.Success)
{
outString = "error routing ... status <" + e.Result.ResponseSummary.StatusCode.ToString() + ">";
}
else if (0 == e.Result.Result.Legs.Count)
{
outString = "Cannot find route";
}
else
{
MapPolyline routeLine = new MapPolyline();
routeLine.Locations = new LocationCollection();
routeLine.Stroke = new SolidColorBrush(Colors.Blue);
routeLine.Opacity = 0.65;
routeLine.StrokeThickness = 5.0;
foreach (MapRouteService.Location p in e.Result.Result.RoutePath.Points)
{
routeLine.Locations.Add(new Microsoft.VirtualEarth.MapControl.Location(p.Latitude, p.Longitude));
}
routeLayer.AddChild(routeLine);
}
}
catch (Exception)
{
outString = "Exception raised routine";
}
}
Rotala methodu listboxımıza eklenmiş olan GeocodeResult nesnelerini rotalama servisine gönderir. Bu gönderme esnasında bir dönüşüm yapmak zorundayız. Rotalama servisi rotalanacak olan noktaları WayPoint tipinde nesnelerden anlamaktadır. Elimizdede GeocodeResult tipinde nesneler olduğu için bir dönüşüm yapmak zorunda kalırız bu dönüşüm sadece Gps pointlerin dönüştürülmesinden başka birşey değildir.
Rotalama servisinden dönen event(routeClient_CalculateRouteCompleted) bize rotada geçilen bütün noktaların bilgilerini döner. Map kontrolumuzun nesnelerinden olan MapPolyline tipinden oluşturduğumuz nesneye geçtiği noktaları ekleyip bu MapPolyline nesnemizide mapimizin içnde bulunan bir layer a eklediğimizdeki bu projemizde "routeLayer" olarak tanımlanmıştır, haritamızda rotayı mavi bir çizgi ile gösterir.
Bu makalemizdede harita üzerinde rotalama işlemlerini gerçekleştirdik. Bir sonraki makalemizde iste harita üzerine nesneler ekleyip bu nesneler üzeridne değişiklikler drag & drop işlemleri üzerinde duracağız.
Sağlıcakla kalın...
Ömer Emre AKTEPE
Yazılım Mühendisi