In vielen Fällen ist es notwendig, den genauen Standort zu einer Adresse zu ermitteln.
Meist wird dies dazu benötigt, um eine Position auf einer Karte (z.B. Google-Map) darzustellen.
Das Client-Framework von Google nimmt von Hause aus die Längen- und Breitengrade entgegen, um Positionen auf der Karte darzustellen.
Aber wie erhalte ich diese Informationen?
Es existiert eine Art Webservice, über den man eine Anfrage an Google stellen kann. Der Anfragetext kann dann genauso aussehen, als ob es in die entsprechenden Textbox auf der Google-Maps-Seite eingegen wird. Zum Beispiel: Berlin, Brandenburger Tor usw.
Es werden noch zwei Parameter benötigt, um ein Abfrageergebnis zu erhalten.
Das ist einmal ein Key, den man sich bei Google-Maps besorgen muß, um sich zu authentifizieren. Website
Dieser Schlüssel gilt jeweils für ein Verzeichnis, so das man sich mehrere Schlüssel generieren lassen muß, wenn eine Visualisierung in mehreren Verzeichnissen geplant ist.
Ich habe dafür einfach ein Dictionary eingerichtet, das je nach Verzeichnis den entsprechenden Schlüssel übergibt.
Der andere Parameter ist die Anfragetext, der natürlich url-kodiert sein muß.
So könnte eine Abfrage-Url aussehen:
string url =
string.Format(
"http://maps.google.com/maps/geo?q={0}&output=xml&key={1}", HttpUtility.UrlEncode(address),key);
Zur Abfrage kann dann einfach das Webrequest-Object benutzt werden:
WebRequest webRequest =
WebRequest.Create(url);
WebResponse webResponse =
webRequest.GetResponse();
sResponse = new StreamReader(
webResponse.GetResponseStream(), Encoding.Default).ReadToEnd();
webResponse.Close();
XmlDocument xmlDocument =
new XmlDocument();
xmlDocument.LoadXml(sResponse);
Zurückgegeben wird ein XML-Dokument, das einen Returncode und den Standort enthält, falls einer gefunden wurde.
Der Code 200 heißt wie immer, das die Anfrage erfolgreich war.
Die Returncodes:
601 => "G_GEO_MISSING_ADDRESS: No address specified",
602 => "G_GEO_UNKNOWN_ADDRESS: The address entered cannot be identified",
603 => "G_GEO_UNAVAILABLE_ADDRESS: There is no geocoding information for this address",
610 => "G_GEO_BAD_KEY: The API KEY supplied is invalid",
620 => "G_GEO_TOO_MANY_QUERIES: This client has exceeded the query count. Try later.",
500 => "G_GEO_SERVER_ERROR: Internal Geocode Service Error, Try later.",
Mit folgendem C#-Code können nun die gesuchten Koordianten aus dem XML-String ermittelt werden:
XmlNodeList ndCoord = xmlDocument.GetElementsByTagName("coordinates");
XmlNodeList ndCode = xmlDocument.GetElementsByTagName("code");
if (
ndCode != null &&
ndCode.Count == 1 &&
ndCode[0].InnerText.Equals("200") &&
ndCoord != null && ndCoord.Count > 0
)
{
NumberFormatInfo ni = new NumberFormatInfo();
ni.NumberDecimalSeparator = ".";
ga = new GoogleAddress(address);
string sCoord = ndCoord[0].InnerText;
string[] arrCoord = sCoord.Split(',');
ga.Longitude = float.Parse(arrCoord[0], ni);
ga.Latitude = float.Parse(arrCoord[1],ni);
Jetzt kann das Ergebnis zum Beispiel zur Darstellung bei Google-Maps genutzt werden. Aber dazu ein anderes Mal...