Как вызвать службу геокодирования Google из кода С#
У меня есть одна библиотека классов в С#. Оттуда я должен позвонить в службу Google и получить широту и долготу.
Я знаю, как это сделать, используя AJAX на странице, но я хочу позвонить в службу Google Geocoding непосредственно из моего файла класса С#.
Есть ли способ сделать это или есть какие-либо другие сервисы, которые я могу использовать для этого.
Ответы
Ответ 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;
}
}
}