it-swarm.com.de

So rufen Sie den Google Geocoding-Dienst über C # -Code auf

Ich habe eine Klassenbibliothek in C #. Von dort muss ich den Google-Service anrufen und den Längen- und Breitengrad abrufen.

Ich weiß, wie es mit AJAX on page gemacht wird, aber ich möchte den Google Geocoding-Dienst direkt aus meiner C # -Klassendatei aufrufen.

Gibt es eine Möglichkeit, dies zu tun, oder gibt es andere Dienste, die ich dafür verwenden kann?.

43
vaibhav shah

Sie könnten so etwas tun:

string address = "123 something st, somewhere";
string requestUri = string.Format("http://maps.googleapis.com/maps/api/geocode/xml?address={0}&sensor=false", Uri.EscapeDataString(address));

WebRequest request = WebRequest.Create(requestUri);
WebResponse response = request.GetResponse();
XDocument xdoc = XDocument.Load(response.GetResponseStream());

XElement result = xdoc.Element("GeocodeResponse").Element("result");
XElement locationElement = result.Element("geometry").Element("location");
XElement lat = locationElement.Element("lat");
XElement lng = locationElement.Element("lng");

Sie möchten auch den Antwortstatus überprüfen und alle WebExceptions abfangen. Schauen Sie sich Google Geocoding API an.

100
Chris Johnson

Ich habe nicht den Ruf zu kommentieren, sondern wollte nur sagen, dass Chris Johnsons Code wie ein Zauber wirkt. Für jeden, der so dumm ist wie ich, sind die Versammlungen:

using System.Net;
using System.Xml.Linq;
32
DyreVaa

Sie können auch die HttpClient-Klasse verwenden, die häufig mit Asp.Net Web Api oder Asp.Net 5.0 verwendet wird.

Sie haben auch einen kostenlosen http-Statuscode, ein asyn/await-Programmiermodell und die Ausnahmebehandlung mit HttpClient ist kinderleicht.

var address = "paris, france";
var requestUri = string.Format("http://maps.googleapis.com/maps/api/geocode/xml?address={0}&sensor=false", Uri.EscapeDataString(address));

using (var client = new HttpClient())
{
    var request = await client.GetAsync(requestUri);
    var content = await request.Content.ReadAsStringAsync();
    var xmlDocument = XDocument.Parse(content);

}
7
Pascal

Sie können den Webdienst aufrufen und mit der json/xml-Antwort arbeiten.

http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway ,+Mountain+View ,+CAsensor=true

dies gibt eine JSON-Antwort zurück, mit der Sie arbeiten können.

Wie Sie in den Nutzungsbedingungen nachlesen können, dürfen Sie deren Webservice nur nutzen, wenn Sie eine Google-Karte anzeigen.

Hier finden Sie alle Informationen zum Dienst: https://developers.google.com/maps/documentation/geocoding/

Sehen Sie sich dieses Thema an, um zu erfahren, wie Sie mit der json-Antwort umgehen können: Google Maps v3-Geocodierung serverseitig

BEARBEITEN: Ich habe gerade diesen Artikel gefunden: http://www.codeproject.com/Tips/505361/Google-Map-Distance- Matrix-and-Geocoding-API-V3-we

Ich habe das nicht getestet, aber vielleicht funktioniert es für dich :)

EDIT2: Das Codeprojekt-Beispiel scheint nicht zu funktionieren :( Die dort angegebene URL gibt immer dieselbe zurück, egal welcher Adresspunkt die Eingabe ist. .
Sie sollten jedoch trotzdem versuchen, mit dem JSON- oder XML-Ergebnis zu arbeiten, da dies die beste Vorgehensweise ist, die ich sagen würde.

4
bema

Für diese Antwort ist es vielleicht etwas zu spät, aber für diejenigen, die noch auf der Suche nach einer einfachen Möglichkeit sind, die Google Geocoding-API zu verwenden, habe ich dieses einfache Nugget namens Guigle-API geschrieben und es kann so verwendet werden :

GoogleGeocodingAPI.GoogleAPIKey = "YOUR API KEY";
AddressResponse result = await GoogleGeocodingAPI.SearchAddressAsync("100 Market St, Southbank");

OR

var result = await GoogleGeocodingAPI.GetCityFromCoordinatesAsync(11.1111, 22.2222);
var city = result.Item1;
var country = result.Item3;
  • Eine Sache, die ich daran mag, ist, dass Sie vollständige Objekte aus den API-Antworten erhalten, so dass Sie einfachen Zugriff auf alles haben und mit Linq und anderen Sammlungshelfern einfach Daten daraus abrufen können. Zum Beispiel für Adressen haben Sie diese Typen und mehr:

    public class AddressResponse
    {
        public List<Address> Results { get; set; }
        public string Status { get; set; }
    }
    public class Address
    {
        public List<AddressComponent> AddressComponents { get; set; }
        public string FormattedAddress { get; set; }
        public Geometry Geometry { get; set; }
        public string PlaceId { get; set; }
        public List<string> Types { get; set; }
    }

Sie können also Folgendes tun:

(...)
var state = addressComponentes.FirstOrDefault(r => r.Types.Contains(AddressType.administrative_area_level_1.ToString()))?.ShortName;
  • Es kann auch für Google Places-API-Abfragen verwendet werden.
  • Alle Methoden verfügen über eine überladene Option, mit der Sie Ihren eigenen HTTP-Client übergeben können, wenn Sie mehrere Aufrufe tätigen, sodass Sie ihn selbst öffnen/schließen können.
  • Leider ist es noch nicht vollständig implementiert/getestet, aber für diese grundlegenden Suchvorgänge funktioniert es vollständig.

Die Methoden sind einfach anzuwenden und enthalten Zusammenfassungen mit detaillierten Erklärungen.

Sie können es mit dem Befehl nuget installieren Install-Package Easyforce.GuigleAPI

Wenn Sie nur den Quellcode wollen, ist das Projekt auf GitHub verfügbar. Fühlen Sie sich frei, eine PR für Ihren Beitrag zu machen =)

4
Guilherme

Das ist eine alte Frage. Aber ich hatte heute die gleiche Frage und fand diese Lösung: C # GeoCoding/Address Validation API (unterstützt mehrere Anbieter, einschließlich Google Maps).

IGeocoder geocoder = new GoogleGeocoder() { ApiKey = "this-is-my-optional-google-api-key" };

IEnumerable<Address> addresses = await geocoder.GeocodeAsync("1600 pennsylvania ave washington dc");

Console.WriteLine("Formatted: " + addresses.First().FormattedAddress);
// Formatted: 1600 Pennsylvania Ave SE, Washington, DC 20003, USA

Console.WriteLine("Coordinates: " + addresses.First().Coordinates.Latitude + ", " + addresses.First().Coordinates.Longitude);
// Coordinates: 38.8791981, -76.9818437

Hier ist das entsprechende NuGet-Paket:

Installationspaket Geocoding.Google

3
JP Hellemons

Dies mag nicht viel sein, aber ich möchte nur eine Verbesserung im @ Chris Johnson-Code vornehmen, wenn Sie nur den Lat- und Lng-Wert in doppelter Form erhalten möchten, den Var Lat- und Var Lng-Wert von Chris Johnson mit diesem Format <Lat> hat. ..number ... </ lat>

Wenn Sie also übergeben, dass der Wert eine Zeichenfolge ist, um einen numerischen Wert zu erhalten, müssen Sie folgendermaßen vorgehen

  double latitude = Double.Pars(lat.Value)
 double longitude = Double.Pars(lng.Value)
1
LittleThunder

Um die Antwort von JP Hellemons zu vervollständigen, verwenden Sie Geocoding.net und rufen Sie zum Beispiel nur den Namen der Stadt ab:

IGeocoder geocoder = new GoogleGeocoder() { ApiKey = "API_Key" };
IEnumerable<Address> addresses = await geocoder.GeocodeAsync("address");

foreach(var component in ((GoogleAddress)addresses.First()).Components)
{
    foreach(var type in component.Types)
    {
        if(type == GoogleAddressType.Locality)
        {
            return component.LongName;
        }
    }
}
0
A. Morel