我试图使用Google directions API来显示我的地图视图中的路线,但是我无法从
JSON响应中获取数据.我可以得到“水平”和“点”字符串,但无法解决如何将它们解码到地图上的点.
任何帮助将不胜感激.
解决方法
我有一个类可以为你解码,添加下面的类,然后调用你的代码,如下所示:
int[] decodedZoomLevels = PolylineDecoder.decodeZoomLevels(levels); GeoPoint[] gPts = PolylineDecoder.decodePoints(points,decodedZoomLevels.length);
点数和级别是您从JSON响应中提取的数据.然后,您可以浏览一系列地理点,在它们之间绘制一条线,以显示您的路线.
希望这可以帮助!肯尼
编辑:似乎google directions API不再返回缩放级别字符串作为JSON响应的一部分,不用担心,但是我们所使用的都是检查点数,所以我们可以简单地将它们放入列表如下:
public static List <GeoPoint> decodePoints(String encoded_points){ int index = 0; int lat = 0; int lng = 0; List <GeoPoint> out = new ArrayList<GeoPoint>(); try { int shift; int result; while (index < encoded_points.length()) { shift = 0; result = 0; while (true) { int b = encoded_points.charAt(index++) - '?'; result |= ((b & 31) << shift); shift += 5; if (b < 32) break; } lat += ((result & 1) != 0 ? ~(result >> 1) : result >> 1); shift = 0; result = 0; while (true) { int b = encoded_points.charAt(index++) - '?'; result |= ((b & 31) << shift); shift += 5; if (b < 32) break; } lng += ((result & 1) != 0 ? ~(result >> 1) : result >> 1); /* Add the new Lat/Lng to the Array. */ out.add(new GeoPoint((lat*10),(lng*10))); } return out; }catch(Exception e) { e.printStackTrace(); } return out; }
编辑:旧版
public class PolylineDecoder { /** * Transform a encoded PolyLine to a Array of GeoPoints. * Java implementation of the original Google JS code. * @see Original encoding part: <a href="http://code.google.com/apis/maps/documentation/polylinealgorithm.html">http://code.google.com/apis/maps/documentation/polylinealgorithm.html</a> * @return Array of all GeoPoints decoded from the PolyLine-String. * @param encoded_points String containing the encoded PolyLine. * @param countExpected Number of points that are encoded in the PolyLine. Easiest way is to use the length of the ZoomLevels-String. * @throws DecodingException */ public static GeoPoint[] decodePoints(String encoded_points,int countExpected){ int index = 0; int lat = 0; int lng = 0; int cnt = 0; GeoPoint[] out = new GeoPoint[countExpected]; try { int shift; int result; while (index < encoded_points.length()) { shift = 0; result = 0; while (true) { int b = encoded_points.charAt(index++) - '?'; result |= ((b & 31) << shift); shift += 5; if (b < 32) break; } lat += ((result & 1) != 0 ? ~(result >> 1) : result >> 1); shift = 0; result = 0; while (true) { int b = encoded_points.charAt(index++) - '?'; result |= ((b & 31) << shift); shift += 5; if (b < 32) break; } lng += ((result & 1) != 0 ? ~(result >> 1) : result >> 1); /* Add the new Lat/Lng to the Array. */ out[cnt++] = new GeoPoint((lat*10),(lng*10)); } return out; }catch(Exception e) { e.printStackTrace(); } return out; } public static int[] decodeZoomLevels(String encodedZoomLevels){ int[] out = new int[encodedZoomLevels.length()]; int index = 0; for(char c : encodedZoomLevels.tocharArray()) out[index++] = c - '?'; return out; } }