49

我在 C# 中有一个类库。从那里我必须调用谷歌服务并获取纬度和经度。

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

有什么办法可以做到这一点,或者我可以使用任何其他服务。

4

9 回答 9

116

你可以这样做:

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

于 2013-04-29T09:14:44.843 回答
40

我没有评论的声誉,但只想说克里斯约翰逊的代码就像一个魅力。组件是:

using System.Net;
using System.Xml.Linq;
于 2014-06-26T09:40:03.840 回答
12

您还可以使用经常与 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);

}
于 2015-11-29T15:13:59.653 回答
5

这是一个老问题。但是我今天有同样的问题,并提出了这个作为解决方案: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 包:

安装包Geocoding.Google

于 2017-10-23T12:00:31.300 回答
4

您可以调用 Web 服务并使用 json/xml 响应。

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

这将返回一个您可以使用的 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结果,因为这是我会说的最佳实践。

于 2013-04-29T08:55:18.073 回答
4

更新:这里提到的以前的包已被弃用 - 有一个新版本是最新的并且适合 .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 它

于 2017-06-11T12:43:17.643 回答
2

要完成 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;
        }
    }
}
于 2019-08-30T14:23:07.960 回答
1

这可能不多,但如果您只想以双重形式获得 lat 和 lng 值,我只想对@Chris Johnson 代码进行一项改进,chris johnson 的 var lat 和 var lng 具有这种格式 < lat> 的价值。 ..数字...</lat>

所以如果你传递的值是一个字符串来获取数值你必须这样做

  double latitude = Double.Pars(lat.Value)
 double longitude = Double.Pars(lng.Value)
于 2016-02-19T16:43:38.187 回答
0

这是我在 .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;
    }
}
于 2021-01-25T09:39:04.437 回答