public double calculateDistance(string Fstreet, string Ftown, string Fcity, string Tstreet, string Ttown, string Tcity) { string baseString = "https://maps.googleapis.com/maps/api/distancematrix/json?origins="; string geoString = baseString + Fstreet + "," + Ftown + "," + Fcity + "&destinations=" + Tstreet + "," + Ttown + "," + Tcity + "&mode=walking&language=eng-ENG&key=" + API_KEY; string distance = ""; WebResponse response = null; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(geoString); request.Method = "GET"; response = request.GetResponse(); if (response != null) { string str = null; using (Stream stream = response.GetResponseStream()) { using (StreamReader streamReader = new StreamReader(stream)) { str = streamReader.ReadToEnd(); } } MatrixResponse responseMatrix = JsonConvert.DeserializeObject <MatrixResponse>(str); if (responseMatrix.status == "OK") { int count = responseMatrix.rows.Length; for (int i = 0; i < count; i++) { distance = responseMatrix.rows[i].elements[i].distance.text.ToString(); } } string newString = distance.Replace("km", " "); return(Convert.ToDouble(newString)); } else { return(-1.00); } } catch { throw new Exception("JSON response failed."); } finally { if (response != null) { response.Close(); response = null; } } }
/// <summary> /// /// </summary> /// <param name="latLngs"></param> /// <returns></returns> public List <List <Tuple <double, double> > > GetDistanceTimeMatrix(List <Tuple <string, string> > latLngs) { var distTimes = new List <List <Tuple <double, double> > >(); MatrixResponse matrix = null; var url = "https://graphhopper.com/api/1/matrix?type=json&vehicle=car&debug=true&out_array=times&out_array=distances&key="; url += _apiKey; url = latLngs.Aggregate(url, (current, latLng) => current + ("&point=" + latLng.Item1) + "," + latLng.Item2); if (WebRequest.Create(url) is HttpWebRequest request) { request.Proxy = null; // Performance hack! using (var response = request.GetResponse() as HttpWebResponse) { if (response != null && response.StatusCode != HttpStatusCode.OK) { throw new Exception($"Server error (HTTP {response.StatusCode}: {response.StatusDescription})."); } if (response != null) { var stream = response.GetResponseStream(); var memStream = new MemoryStream(); if (stream != null) { stream.CopyTo(memStream); memStream.Seek(0, SeekOrigin.Begin); var jsonSerializer = new DataContractJsonSerializer(typeof(MatrixResponse)); var objResponse = jsonSerializer.ReadObject(memStream); matrix = objResponse as MatrixResponse; CreateLastResponse(memStream); memStream.Close(); stream.Close(); } } } } // time and distance arrays have all the same length if (matrix == null) { return(distTimes); } for (var i = 0; i < matrix.Distances.Count(); i++) { var row = new List <Tuple <double, double> >(); for (var k = 0; k < matrix.Distances[i].Count(); k++) { var dist = matrix.Distances[i][k]; var time = matrix.Times[i][k]; var distTime = new Tuple <double, double>(Convert.ToDouble(dist ?? 0), Convert.ToDouble(time ?? 0)); row.Add(distTime); } distTimes.Add(row); } return(distTimes); }