我在 C# 中有一个类库。从那里我必须调用谷歌服务并获取纬度和经度。
我知道如何在页面上使用 AJAX,但我想直接从我的 C# 类文件中调用 Google 地理编码服务。
有什么办法可以做到这一点,或者我可以使用任何其他服务。
我在 C# 中有一个类库。从那里我必须调用谷歌服务并获取纬度和经度。
我知道如何在页面上使用 AJAX,但我想直接从我的 C# 类文件中调用 Google 地理编码服务。
有什么办法可以做到这一点,或者我可以使用任何其他服务。
你可以这样做:
string address = "123 something st, somewhere";
string requestUri = string.Format("https://maps.googleapis.com/maps/api/geocode/xml?key={1}&address={0}&sensor=false", Uri.EscapeDataString(address), YOUR_API_KEY);
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。
我没有评论的声誉,但只想说克里斯约翰逊的代码就像一个魅力。组件是:
using System.Net;
using System.Xml.Linq;
您还可以使用经常与 Asp.Net Web Api 或 Asp.Net 5.0 一起使用的 HttpClient 类。
您还有一个免费的 http 状态代码、异步/等待编程模型和使用 HttpClient 处理异常非常容易。
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);
}
这是一个老问题。但是我今天有同样的问题,并提出了这个作为解决方案:C# GeoCoding / Address Validation API(支持包括谷歌地图在内的多个提供商)。
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 包:
您可以调用 Web 服务并使用 json/xml 响应。
这将返回一个您可以使用的 json 响应。
正如您可以在使用条款中阅读的那样,只有在显示谷歌地图时,您才能使用他们的网络服务。
在这里您可以找到有关该服务的所有信息:https ://developers.google.com/maps/documentation/geocoding/
要了解如何处理 json 响应,请查看以下主题:Google Maps v3 geocoding server-side
编辑: 我刚刚找到这篇文章: http: //www.codeproject.com/Tips/505361/Google-Map-Distance-Matrix-and-Geocoding-API-V3-we
我没有对此进行测试,但也许它对您有用:)
EDIT2: codeproject示例似乎不起作用:(那里提到的url总是返回相同的,无论输入的地址点是什么......
但是你应该尝试使用JSON或XML结果,因为这是我会说的最佳实践。
更新:这里提到的以前的包已被弃用 - 有一个新版本是最新的并且适合 .Net Core。
这个答案可能为时已晚,但对于那些仍在寻找使用 Google Places 或地理编码 API 的简单方法的人来说,我编写了这个名为 GuigleCore 的简单 nuget,它可以像这样使用:
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安装它 或在此处 fork 它。
要完成 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;
}
}
}
这可能不多,但如果您只想以双重形式获得 lat 和 lng 值,我只想对@Chris Johnson 代码进行一项改进,chris johnson 的 var lat 和 var lng 具有这种格式 < lat> 的价值。 ..数字...</lat>
所以如果你传递的值是一个字符串来获取数值你必须这样做
double latitude = Double.Pars(lat.Value)
double longitude = Double.Pars(lng.Value)
这是我在 .Net Core API(s) 中使用的方法,在这种情况下,我们只需要 Lat 和 Lng 值来匹配我们的内部 LocationModel:
public async Task<LocationModel> GetAddressLocation(string address)
{
try
{
var targetUrl = $"https://maps.googleapis.com/maps/api/geocode/json" +
$"?address={address}" +
$"&inputtype=textquery&fields=geometry" +
$"&key={_apiKey}";
_logger.LogDebug($"GetAddressLocation : targetUrl:{targetUrl}");
using var client = new HttpClient();
using var request = new HttpRequestMessage(HttpMethod.Get, targetUrl);
using var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
var stream = await response.Content.ReadAsStreamAsync();
if (response.IsSuccessStatusCode)
{
if (stream == null || stream.CanRead == false)
return null;
using var sr = new StreamReader(stream);
var jsonString = sr.ReadToEnd();
dynamic responseObject = JObject.Parse(jsonString);
var results = responseObject["results"];
var lat = results[0]?["geometry"]?["location"]?["lat"];
var lng = results[0]?["geometry"]?["location"]?["lng"];
var result = new LocationModel { Latitude = lat, Longitude = lng };
return result;
}
else
{
await HandleApiError(response, stream);
throw new DomainException($"UNKNOWN ERROR USING GEOCODING API :: {response}");
}
}
catch (Exception ex)
{
_logger.LogError("ERROR USING Geocoding Service", ex);
throw;
}
}