如何从C#代码调用Google地理编码服务

如何从C#代码调用Google地理编码服务,c#,google-api,C#,Google Api,我在C#有一个类库。从那里我必须打电话给谷歌服务,获取纬度和经度 我知道如何在页面上使用AJAX,但我想直接从我的C#类文件调用Google地理编码服务 是否有任何方法可以做到这一点,或者是否有其他服务可供我使用。您可以调用web服务并使用json/xml响应 这将返回一个json响应,您可以使用它 正如你在使用条款中所看到的,只有在你展示谷歌地图的情况下,你才被允许使用他们的网络服务 您可以在此处找到有关该服务的所有信息: 要了解如何处理json响应,请查看以下主题: 编辑: 我刚刚发现这篇

我在C#有一个类库。从那里我必须打电话给谷歌服务,获取纬度和经度

我知道如何在页面上使用AJAX,但我想直接从我的C#类文件调用Google地理编码服务


是否有任何方法可以做到这一点,或者是否有其他服务可供我使用。

您可以调用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密钥