Mittwoch, 25. April 2012

C# .NET - Routen über Google Maps API berechnen

 Guten Tag Leute,

Screenshot von Google Maps
zur Eröffnung meines Blogs möchte ich gleich eine nützliche kleine Methode vorstellen, um die Google Maps API in C# zu benutzen und zum Beispiel die Entfernungen zwischen zwei Standpunkten zu berechnen.







Zuerst einmal sehen wir uns die API-URL (inklusive der Parameter) an, über die wir den Service ansprechen können:
http://maps.google.com/maps/api/directions/xml?origin={0}&destination={1}&sensor=false
Die Erklärung der Parameter:
  • origin
    Die erste Adresse (Startadresse), die für die Berechnung verwendet werden soll.
    Dies kann ein Ortsname, eine Postleitzahl oder beides kombiniert mit einer genauen Anschrift sein.
  • destination
    Die zweite Adresse (Zieladresse). Selbes Format wie bei origin.
  • sensor
    Für uns uninteressant. true würde angeben, dass wir einen GPS-Sender in unserem Endgerät verbaut haben.
Wenn man die oben genannte Zeile mit den richtigen Parametern im Browser aufruft, bekommt man die Routeninformationen in einem XML-formatierten Text angezeigt.
Diesen müssen wir jetzt nur noch in unsere Anwendung bekommen und wissen, wie wir damit arbeiten ;-)

Das .NET Framework bietet uns in System.Xml.Linq einfache Werkzeuge zum Arbeiten mit XML-Werten an.
Das Laden der Routeninformationen geschieht in einem Einzeiler:
XDocument doc = XDocument.Load(String.Format(@"http://maps.google.com/maps/api/directions/xml?origin={0}&destination={1}&sensor=false", startAddress, endAddress));
Jetzt müssen nur noch die einzelnen Informationen aus den XML-Tags (welche "nahezu" selbsterklärend sind) gelesen und weiterverarbeitet werden.
Dazu meine kleine Methode, die ich in einem privaten Projekt verwende:
/// <summary>  
 /// Gibt eine Route anhand der Start- und Zieladresse zurück.  
 /// </summary>  
 /// <param name="startAddress">Start-Adresse.</param>  
 /// <param name="endAddress">End-Adresse.</param>  
 public Route GetRoute(string startAddress, string endAddress)  
 {  
   Route route = new Route();  
   try  
   {  
     XDocument doc = XDocument.Load(  
       String.Format(@"http://maps.google.com/maps/api/directions/xml?origin={0}&destination={1}&sensor=false",  
       startAddress, endAddress));  
     XElement dirResp = doc.Element(XName.Get("DirectionsResponse"));  
     XElement eStatus = dirResp.Element(XName.Get("status"));  
     route.Status = eStatus.Value == "OK" ? RouteStatus.OK : RouteStatus.NotFound;  
     if (route.Status == RouteStatus.OK)  
     {  
       XElement eRoute = dirResp.Element(XName.Get("route"));  
       XElement eLeg = eRoute.Element(XName.Get("leg"));  
       XElement eDuration = eLeg.Element(XName.Get("duration"));  
       XElement eDistance = eLeg.Element(XName.Get("distance"));  
       XElement eStartAddress = eLeg.Element(XName.Get("start_address"));  
       XElement eEndAddress = eLeg.Element(XName.Get("end_address"));  
       route.Duration = new Duration(Convert.ToUInt64(eDuration.Element(XName.Get("value")).Value));  
       route.Distance = new Distance(Convert.ToUInt64(eDistance.Element(XName.Get("value")).Value));  
       route.StartAddress = eStartAddress.Value;  
       route.EndAddress = eEndAddress.Value;  
     }  
   }  
   // Ein Verbindungsfehler wurde abgefangen  
   catch (WebException ex)  
   {  
     route.Status = RouteStatus.ConnectionError;  
   }  
   // Ein unbekannter Fehler ist aufgetreten  
   catch (Exception ex)  
   {  
     route.Status = RouteStatus.UnknownError;  
   }  
   return route;  
 }

(Route, Distance und Duration sind eigene Klassen)

Das wars! Keine Zauberei, oder? ;-)

Bis zum nächsten Mal!
Euer Flo :-)

1 Kommentar:

  1. WÄRE SCHÖN WENN DIE KLASSEN ROUTE; DISTANCE UND DURATION BEKANNT WÄREN :(

    AntwortenLöschen