Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C#

Google Directions API Polyline Points Decoder in C#

5.00/5 (4 votes)
9 Jan 2012CPOL 47.6K  
Google Directions API Polyline Points Decoder in C#
I have an algorithm for Google Directions API Polyline Points Decoder in C#. It may save you some development time.

Assuming that you have collected encoded point string from the Google Direction API Call.

C#
private List<Location> DecodePolylinePoints(string encodedPoints) 
            {
                if (encodedPoints == null || encodedPoints == "") return null;
                List<Location> poly = new List<Location>();
                char[] polylinechars = encodedPoints.ToCharArray();
                int index = 0;

                int currentLat = 0;
                int currentLng = 0;
                int next5bits;
                int sum;
                int shifter;
               
                try
                {
                    while (index < polylinechars.Length)
                    {
                        // calculate next latitude
                        sum = 0;
                        shifter = 0;
                        do
                        {
                            next5bits = (int)polylinechars[index++] - 63;
                            sum |= (next5bits & 31) << shifter;
                            shifter += 5;
                        } while (next5bits >= 32 && index < polylinechars.Length);

                        if (index >= polylinechars.Length)
                            break;

                        currentLat += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);

                        //calculate next longitude
                        sum = 0;
                        shifter = 0;
                        do
                        {
                            next5bits = (int)polylinechars[index++] - 63;
                            sum |= (next5bits & 31) << shifter;
                            shifter += 5;
                        } while (next5bits >= 32 && index < polylinechars.Length);

                        if (index >= polylinechars.Length && next5bits >= 32)
                            break;

                        currentLng += (sum & 1) == 1 ? ~(sum >> 1) : (sum >> 1);
                        Location p = new Location();
                        p.Latitude = Convert.ToDouble(currentLat) / 100000.0;
                        p.Longitude = Convert.ToDouble(currentLng) / 100000.0;
                        poly.Add(p);
                    } 
                }
                catch (Exception ex)
                {
                    // logo it
                }
                return poly;
           }


Here Location is simply a class with Latitude and Longitude attributes.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)