如何从C#代码调用Google地理编码服务
我在C#有一个类库。从那里我必须打电话给谷歌服务,获取纬度和经度 我知道如何在页面上使用AJAX,但我想直接从我的C#类文件调用Google地理编码服务如何从C#代码调用Google地理编码服务,c#,google-api,C#,Google Api,我在C#有一个类库。从那里我必须打电话给谷歌服务,获取纬度和经度 我知道如何在页面上使用AJAX,但我想直接从我的C#类文件调用Google地理编码服务 是否有任何方法可以做到这一点,或者是否有其他服务可供我使用。您可以调用web服务并使用json/xml响应 这将返回一个json响应,您可以使用它 正如你在使用条款中所看到的,只有在你展示谷歌地图的情况下,你才被允许使用他们的网络服务 您可以在此处找到有关该服务的所有信息: 要了解如何处理json响应,请查看以下主题: 编辑: 我刚刚发现这篇
是否有任何方法可以做到这一点,或者是否有其他服务可供我使用。您可以调用web服务并使用json/xml响应 这将返回一个json响应,您可以使用它 正如你在使用条款中所看到的,只有在你展示谷歌地图的情况下,你才被允许使用他们的网络服务 您可以在此处找到有关该服务的所有信息: 要了解如何处理json响应,请查看以下主题: 编辑: 我刚刚发现这篇文章: 我没有测试这个,但也许它对你有用:) EDIT2:codeproject示例似乎不起作用:(此处提到的url返回的总是相同的,无论输入的地址点是什么…
但是,无论如何,您都应该尝试使用JSON或XML结果,因为这是我要说的最佳实践。您可以这样做:
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");
var googleGeocodingApi = new GoogleGeocodingApi("GoogleApiKey");
var address = await googleGeocodingApi.SearchAddressAsync(httpClient, "123 Street, Suburb A");
services.AddScoped(typeof(IGooglePlacesApi), x => new GooglePlacesApi(Configuration["GoogleApiKey"]));
您还需要验证响应状态并捕获任何WebException。请查看。我没有评论的名声,但我只想说Chris Johnson的代码工作起来很有魅力。程序集包括:
using System.Net;
using System.Xml.Linq;
您还可以使用通常与Asp.NETWebAPI或Asp.NET5.0一起使用的HttpClient类 您还有一个免费的http状态代码,asyn/WAIT编程模型,使用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);
}
这可能不多,但我只想在@Chris Johnson代码中做一个改进,如果您只想以双重形式获得lat和lng值,Chris Johnson的var lat和var lng具有以下格式的值:
double latitude = Double.Pars(lat.Value)
double longitude = Double.Pars(lng.Value)
更新:此处提到的前一个软件包已弃用-有一个最新版本,适合.Net Core 对于这个答案来说可能有点太晚了,但是对于那些仍然在这里寻找使用Google Places或地理编码API的简单方法的人来说,我写了这个简单的,它可以像这样使用:
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");
var googleGeocodingApi = new GoogleGeocodingApi("GoogleApiKey");
var address = await googleGeocodingApi.SearchAddressAsync(httpClient, "123 Street, Suburb A");
services.AddScoped(typeof(IGooglePlacesApi), x => new GooglePlacesApi(Configuration["GoogleApiKey"]));
或
您可以这样为DI注册它:
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");
var googleGeocodingApi = new GoogleGeocodingApi("GoogleApiKey");
var address = await googleGeocodingApi.SearchAddressAsync(httpClient, "123 Street, Suburb A");
services.AddScoped(typeof(IGooglePlacesApi), x => new GooglePlacesApi(Configuration["GoogleApiKey"]));
我喜欢它的一点是,您可以从API响应中获得完整的对象,因此您可以轻松访问所有内容,并且可以使用Linq和其他收集帮助程序轻松地从中检索数据
您可以使用nuget命令安装它install Package GuigleCore
或者。这是一个老问题。但我今天也遇到了同样的问题,并提出了一个解决方案:(支持多个提供商,包括谷歌地图)
IGeocoder geocoder=new GoogleGeocoder(){ApiKey=“这是我可选的google api密钥”};
数不清
要完成JP Hellemons的回答,请仅使用和检索城市名称,例如:
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;
}
}
}
IGeocoder geocoder=new GoogleGeocoder(){ApiKey=“API_Key”};
IEnumerable addresses=wait geocoder.GeocodeAsync(“地址”);
foreach(var组件位于((GoogleAddress)addresses.First()).Components中)
{
foreach(component.Types中的变量类型)
{
if(type==GoogleAddressType.Location)
{
返回component.LongName;
}
}
}
以下是我在.Net Core API中使用的方法,在这种情况下,我们只需要Lat和Lng值来匹配我们的内部位置模型:
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;
}
}
公共异步任务GetAddressLocation(字符串地址)
{
尝试
{
var targetUrl=$”https://maps.googleapis.com/maps/api/geocode/json" +
$“?地址={address}”+
$“&inputtype=textquery&fields=geometry”+
$“&key={{u apiKey}”;
_LogDebug($“GetAddressLocation:targetUrl:{targetUrl}”);
使用var client=new HttpClient();
使用var request=newhttprequestmessage(HttpMethod.Get,targetUrl);
使用var response=wait client.sendaync(请求,HttpCompletionOption.ResponseHeadersRead);
var stream=await response.Content.ReadAsStreamAsync();
if(响应。IsSuccessStatusCode)
{
if(stream==null | | stream.CanRead==false)
返回null;
使用var sr=新的StreamReader(stream);
var jsonString=sr.ReadToEnd();
动态响应对象=JObject.Parse(jsonString);
var结果=响应对象[“结果”];
var lat=结果[0]?[“几何体”]?[“位置”]?[“lat”];
var lng=结果[0]?[“几何体”]?[“位置”]?[“lng”];
var结果=新位置模型{纬度=纬度,经度=液化天然气};
返回结果;
}
其他的
{
等待handleappierror(响应、流);
抛出新的DomainException($“使用地理编码API时出现未知错误:{response}”);
}
}
捕获(例外情况除外)
{
_logger.LogError(“使用地理编码服务的错误”,ex);
投掷;
}
}
到目前为止您尝试过什么吗?请查看HttpWebRequest
class@SonerGönül我在本教程中尝试这样做,请确保使用System.Xml.Linq;
添加(如果缺少相应的引用-System.Xml.Linq.dll)。惊讶于这是多么简单。Mind=blow!问题是,如果输入无效地址,它将崩溃。如果输入无效地址,但说是valid city,它仍将返回近似值。使用SSIS包中的Visual C#2008和.NET 3.5,我必须先将响应加载到流
和流阅读器
n将读取器加载到XDocument
中。只有.NET 4.0+(源代码:)支持将流直接加载到xdcount中。这不再有效,您必须获得API密钥