Abfragen eines Standortes bei Google-Maps

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.
Die Adresse dafür ist:

http://maps.google.com/maps/geo

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... 

Currently rated 4.0 by 1 people

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Umrechnen einer IP-Adresse in einen Long-Wert

Um Standortdaten anhand der IP-Adresse aus Datenbanken zu ermitteln, wird meist nicht die Standardform (z.B 192.168.100.23), sondern sie muß in einen Long-wert umgewandelt werden.

Mit Hilfe des folgenden kleinen Code-Schnippsels kannst Du das ganz schnell erledigen:

 

public string Ip
{
  get { return _Ip; }
}

public Int64 LongIP

{

   get

   {

      int i;

      string[] arrDec;

      Int64 num = 0;

      if (_Ip == null)

      {

        return 0;

      }

      else

      {

        arrDec = _Ip.Split('.');

        for (i = arrDec.Length - 1; i >= 0; i--)

        {

          num += Convert.ToInt64(((long.Parse(arrDec[i]) % 256) * Math.Pow(256, (3 - i))));

        }

        return num;

      }

   }

}

 

Currently rated 4.0 by 1 people

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5