Подтвердить что ты не робот

Как вызвать службу геокодирования Google из кода С#

У меня есть одна библиотека классов в С#. Оттуда я должен позвонить в службу Google и получить широту и долготу.

Я знаю, как это сделать, используя AJAX на странице, но я хочу позвонить в службу Google Geocoding непосредственно из моего файла класса С#.

Есть ли способ сделать это или есть какие-либо другие сервисы, которые я могу использовать для этого.

4b9b3361

Ответ 1

Вы можете сделать что-то вроде этого:

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");

Вы также захотите проверить статус ответа и поймать любые WebExceptions. Посмотрите API геокодирования Google.

Ответ 2

У меня нет репутации, чтобы комментировать, но просто хотел сказать, что код Криса Джонсона работает как шарм. Для всех, кто так глуп, как я, сборки:

using System.Net;
using System.Xml.Linq;

Ответ 3

Вы также можете использовать класс HttpClient, который часто используется с Asp.Net Web Api или Asp.Net 5.0.

У вас также есть коды состояния HTTP для бесплатной, асинхронной/ожидающей модели программирования и обработки исключений с помощью HttpClient, просто как pie.

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);

}

Ответ 4

Вы можете вызвать веб-службу и работать с ответом json/xml.

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

это возвращает ответ json, с которым вы можете работать.

Как вы можете прочитать в условиях использования, вы можете использовать их веб-сервис, если вы показываете карту google.

Здесь вы можете найти всю информацию об услуге: https://developers.google.com/maps/documentation/geocoding/

Чтобы узнать, как обрабатывать ответ json, посмотрите на эту тему: сервер Google Maps v3 на стороне сервера

EDIT: Я только что нашел эту статью: http://www.codeproject.com/Tips/505361/Google-Map-Distance-Matrix-and-Geocoding-API-V3-we

Я не тестировал это, но, возможно, он работает для вас:)

EDIT2: Пример codeproject, похоже, не работает:( URL-адрес, указанный там, всегда возвращает то же самое, независимо от того, какая точка адреса является входным... Однако вы должны попробовать работать с результатом JSON или XML, так как это лучшая практика, которую я бы сказал.

Ответ 5

ОБНОВЛЕНО: Предыдущий пакет, упомянутый здесь, устарел - есть новая версия, которая актуальна и подходит .Net Core.

Может быть, уже слишком поздно для этого ответа, но для тех, кто все еще пытается найти простой способ использовать Google Places или API геокодирования, я написал этот простой -метр с именем GuigleCore, и его можно использовать вот так :

var googleGeocodingApi = new GoogleGeocodingApi("GoogleApiKey");
var address = await googleGeocodingApi.SearchAddressAsync(httpClient, "123 Street, Suburb A");

ИЛИ

var googlePlacesApi = new GooglePlacesApi("GoogleApiKey");
var place = await googlePlacesApi.FindPlaces(httpClient, "123 Street, Suburb A"));

Вы можете зарегистрировать его для DI следующим образом:

services.AddScoped(typeof(IGooglePlacesApi), x => new GooglePlacesApi(Configuration["GoogleApiKey"]));

Одна вещь, которая мне нравится в этом, это то, что вы получаете полные объекты из ответов API, поэтому у вас есть легкий доступ ко всему, и вы можете использовать Linq и других помощников по сбору, чтобы легко извлекать данные из него.

Вы можете установить его с помощью команды nuget Install-Package GuigleCore или раскошелиться здесь.

Ответ 6

Это старый вопрос. Но сегодня у меня возник тот же вопрос, и я решил это как С# GeoCoding/Address Validation API (поддерживает несколько поставщиков, включая 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

Вот соответствующий пакет NuGet:

Install-Package Geocoding.Google

Ответ 7

Это может быть не так много, но я просто хочу сделать одно улучшение в коде @Chris Johnson, если вы просто хотите получить значение lat и lng в двойной форме. var lat и var lng of chris johnson имеют значение с этим форматом < лат > ... номер... </Ш >

Итак, если вы передадите значение, это строка для получения числового значения, которое вам нужно сделать, например

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

Ответ 8

Чтобы завершить ответ JP Hellemons, используйте Geocoding.net и получите только название города, например:

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;
        }
    }
}