2013-04-29 90 views
36

我在C#中有一个类库。从那里我必须拨打谷歌服务&获取纬度&经度。如何从C#代码调用Google地理编码服务

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

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

+0

你有没有试过到目前为止的事情 – 2013-04-29 08:44:37

+0

看看'HttpWebRequest'类 – 2013-04-29 08:51:26

+0

@SonerGönül我正试图在本教程中这样做http://friism.com/c-and-google-geocoding-web-service-v3 – 2013-04-29 08:57:14

回答

89

你可以做这样的事情:

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。看看Google Geocoding API

+0

什么是locationElement? – 2013-04-29 09:32:50

+0

我留下了一条线,编辑它。 – 2013-04-29 09:37:02

+1

确保添加'使用System.Xml.Linq;'(和对应的引用,如果缺少 - System.Xml.Linq.dll)。 – 2015-03-12 18:15:45

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

我没有测试这一点,但也许它为你工作:)

编辑2:该代码项目的例子似乎并没有工作:(在那里提到的url总是返回相同的,无论输入什么地址点...
但是,你应该尝试使用JSON或XML结果,因为这是我想说的最佳做法。

28

我没有评论的声望,但只是想说,Chris Johnsons的代码就像一个魅力。对于任何愚蠢的我,该组件是:

using System.Net; 
using System.Xml.Linq; 
+8

不知道程序集并不愚蠢,很多人都明白有人发布这个 – 2016-05-27 01:55:32

5

您也可以使用它往往与Asp.Net的Web API或Asp.Net 5.0使用HttpClient的类。

你也有一个免费的http状态码,asyn/await编程模型和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); 

} 
1

这可能不是很多,但我只是想在@克里斯约翰逊代码一个改进,如果你只是想获得的纬度和经度值双形式克里斯 - 约翰逊的VAR纬度和VAR LNG具有价值用这种格式< lat> ... number ...</LAT>

所以,如果你传递值是一个字符串得到的数值,你必须对这个答案做这样

double latitude = Double.Pars(lat.Value) 
double longitude = Double.Pars(lng.Value) 
2

这可能有点为时已晚,但对于那些仍然得到这里寻找一种简单的方式来使用谷歌地理编码API,我写了这个简单的nugget called Guigle API,它可以这样使用:

GoogleGeocodingAPI.GoogleAPIKey = "YOUR API KEY"; 
AddressResponse result = await GoogleGeocodingAPI.SearchAddressAsync("100 Market St, Southbank"); 

OR

var result = await GoogleGeocodingAPI.GetCityFromCoordinatesAsync(11.1111, 22.2222); 
var city = result.Item1; 
var country = result.Item3; 
  • 我喜欢的一件事是,您可以从API响应中获得完整的对象,因此您可以轻松访问所有内容,并且可以使用Linq和其他集合帮助器轻松地从中获取数据。例如,对于地址,您将这些类型多:

    public class AddressResponse 
    { 
        public List<Address> Results { get; set; } 
        public string Status { get; set; } 
    }
    public class Address 
    { 
        public List<AddressComponent> AddressComponents { get; set; } 
        public string FormattedAddress { get; set; } 
        public Geometry Geometry { get; set; } 
        public string PlaceId { get; set; } 
        public List<string> Types { get; set; } 
    }

所以,你可以这样做:

(...) 
var state = addressComponentes.FirstOrDefault(r => r.Types.Contains(AddressType.administrative_area_level_1.ToString()))?.ShortName; 
  • 它也可用于谷歌Places API的查询。
  • 所有的方法都有一个重载的选项,如果你打算打多个电话,你可以通过你自己的HttpClient,这样你就可以自己打开/关闭它。
  • 对不起,它还没有完全实施/测试,但对于这些基本的搜索它完全工作。

该方法易于使用,并有详细的解释总结。

您可以用的NuGet命令安装安装,包装Easyforce.GuigleAPI

如果你只是想在源代码中的项目可以用GitHub。随时为您的贡献PR =)

1

这是一个古老的问题。但是今天我有同样的问题,以及与此想出了一个解决方案:https://github.com/chadly/Geocoding.net

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

相关问题