我试图使用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;
- }
- }