【发布时间】:2011-12-18 00:44:52
【问题描述】:
我正在使用 ASP.NET MVC 3 和 Google Maps v3。我想在一个动作中进行地理编码。那就是将一个有效的地址传递给谷歌并取回纬度和经度。我见过的所有关于地理编码的在线示例都处理了客户端地理编码。您将如何在使用 C# 的操作中执行此操作?
【问题讨论】:
标签: c# asp.net-mvc-3 google-maps-api-3
我正在使用 ASP.NET MVC 3 和 Google Maps v3。我想在一个动作中进行地理编码。那就是将一个有效的地址传递给谷歌并取回纬度和经度。我见过的所有关于地理编码的在线示例都处理了客户端地理编码。您将如何在使用 C# 的操作中执行此操作?
【问题讨论】:
标签: c# asp.net-mvc-3 google-maps-api-3
我不确定我是否理解正确,但我就是这样做的(如果你有兴趣)
void GoogleGeoCode(string address)
{
string url = "http://maps.googleapis.com/maps/api/geocode/json?sensor=true&address=";
dynamic googleResults = new Uri(url + address).GetDynamicJsonObject();
foreach (var result in googleResults.results)
{
Console.WriteLine("[" + result.geometry.location.lat + "," + result.geometry.location.lng + "] " + result.formatted_address);
}
}
【讨论】:
JSON Output Formats) 的文档
L.B 的解决方案对我有用。但是我遇到了一些运行时绑定问题,必须先转换结果才能使用它们
public static Dictionary<string, decimal> GoogleGeoCode(string address)
{
var latLong = new Dictionary<string, decimal>();
const string url = "http://maps.googleapis.com/maps/api/geocode/json?sensor=true&address=";
dynamic googleResults = new Uri(url + address).GetDynamicJsonObject();
foreach (var result in googleResults.results)
{
//Have to do a specific cast or we'll get a C# runtime binding exception
var lat = (decimal)result.geometry.location.lat;
var lng = (decimal) result.geometry.location.lng;
latLong.Add("Lat", lat);
latLong.Add("Lng", lng);
}
return latLong;
}
【讨论】:
由于新的 Google API 要求使用有效的 API 密钥,我遇到了问题。为了让事情正常进行,我修改了代码以将密钥附加到地址并将 url 更改为 https:
public Dictionary<string, decimal> GoogleGeoCode(string address)
{
var latLong = new Dictionary<string, decimal>();
string addressReqeust = address + "&key=your api key here";
const string url = "https://maps.googleapis.com/maps/api/geocode/json?sensor=true&address=";
dynamic googleResults = new Uri(url + addressReqeust).GetDynamicJsonObject();
foreach (var result in googleResults.results)
{
//Have to do a specific cast or we'll get a C# runtime binding exception
var lat = (decimal)result.geometry.location.lat;
var lng = (decimal)result.geometry.location.lng;
try
{
latLong.Add("Lat", lat);
latLong.Add("Lng", lng);
}
catch (Exception ex)
{
}
}
return latLong;
}
【讨论】: