今天我需要创建一些功能来计算zipcodes之间的距离,这对我来说并不容易。幸运的是,我找到了一个好方法,我相信它对其他人有帮助。
答案 0 :(得分:2)
目标是根据商店与顾客之间的距离设定运费。
我确实尝试了一些方法,最好也是最简单的方法。
首先,我需要根据google的json响应创建一个viewModel。
请求返回的json结构具有以下格式:
{
"destination_addresses" : [ "Centro, Juiz de Fora - MG, 36013-210, Brasil" ],
"origin_addresses" : [ "Passos, Juiz de Fora - MG, 36026-460, Brasil" ],
"rows" : [
{
"elements" : [
{
"distance" :
{
"text" : "3,1 km",
"value" : 3149
},
"duration" :
{
"text" : "11 minutos",
"value" : 645
},
"status" : "OK"
}
]
}
],
"status" : "OK"
}
viewModel的属性应该等同于json返回属性。
通过这种方式,我的viewModel看起来像这样:
//Class for "distance" and "duration" which has the "text" and "value" properties.
public class CepElementNode
{
public string text { get; set; }
public string value { get; set; }
}
//Class for "distance", "duration" and "status" nodes of "elements" node
public class CepDataElement
{
public CepElementNode distance { get; set; }
public CepElementNode duration { get; set; }
public string status { get; set; }
}
//Class for "elements" node
public class CepDataRow
{
public List<CepDataElement> elements { get; set; }
}
//Class which wrap the json response
public class RequestCepViewModel
{
public List<string> destination_addresses { get; set; }
public List<string> origin_addresses { get; set; }
public List<CepDataRow> rows { get; set; }
public string status { get; set; }
}
请注意,作为“destination_addresses”,“origin_addresses”和“rows”的数组元素应该是C#中的List。这样我们就可以在RequestCepViewModel实例中反序列化json响应。
最后,在我的Action中我有这段代码:
var url = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=36026460&destinations=36013210&mode=driving&language=en-EN&sensor=false";
WebRequest webRequest = WebRequest.Create(url);
WebResponse response = webRequest.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
var jsonResponseString = reader.ReadToEnd();
var viewModel = new JavaScriptSerializer().Deserialize<RequestCepViewModel>(jsonResponseString);
希望它有所帮助。
此致