Decoding Polylines from Google Maps Direction API with Java

I’ve been integrating the new Google Maps Directions api into an Android app and couldn’t find a Java decoder for the Encoded Polyline Algorithm Format. After a little bit of grunt work here’s a working method that will convert an encoded result such as this:

 }wjiGtdpcNrAlBJZ

into a nice GeoPoint array list:

private List<GeoPoint> decodePoly(String encoded) {

	List<GeoPoint> poly = new ArrayList<GeoPoint>();
	int index = 0, len = encoded.length();
	int lat = 0, lng = 0;

	while (index < len) {
		int b, shift = 0, result = 0;
		do {
			b = encoded.charAt(index++) - 63;
			result |= (b & 0x1f) << shift;
			shift += 5;
		} while (b >= 0x20);
		int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
		lat += dlat;

		shift = 0;
		result = 0;
		do {
			b = encoded.charAt(index++) - 63;
			result |= (b & 0x1f) << shift;
			shift += 5;
		} while (b >= 0x20);
		int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
		lng += dlng;

		GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6),
			 (int) (((double) lng / 1E5) * 1E6));
		poly.add(p);
	}

	return poly;
}

If you need an encoder (or other decoders) check out Mark McClure’s page here.