Пример #1
0
        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);
        }