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? ;-)
Das wars! Keine Zauberei, oder? ;-)
Bis zum nächsten Mal!
Euer Flo :-)
Euer Flo :-)
WÄRE SCHÖN WENN DIE KLASSEN ROUTE; DISTANCE UND DURATION BEKANNT WÄREN :(
AntwortenLöschen