0

我想显示两个位置之间的转弯方向。我试过了

 uri = "http://maps.google.com/maps?saddr="
                + "lat1" + ","
                +  "lon1" + "&daddr="
                + "lat2" + "," + "long2";
        Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
                Uri.parse(uri));

它给出了路线。但我不想打开浏览器并显示。相反,有一种方法可以获取路线,以便它可以显示在我自己的布局中。对于文本视图中的 ex。

4

2 回答 2

2

这些代码是我在毕业项目中编写的,因此没有进行优化。

  1. MapService 类:我解析来自谷歌地图的数据响应。

    public class MapService {
    public static final String TAG = "[MapService]";
    public static final String GET_DIRECTION_URL = "http://maps.google.com/maps/api/directions/json?" + "origin=%f,%f" + "&destination=%f,%f" + "&sensor=true&language=en&units=metric";
    
    public static DirectionResult getDirectionResult(double latitude1, double longtitude1, double latitude2, double longtitude2) {
        String url = String.format(GET_DIRECTION_URL, latitude1, longtitude1, latitude2, longtitude2);
        Log.d("URL", url);
        // parse direction
        DirectionParser directionParser = new DirectionParser() {
            @Override
            public void onSuccess(JSONObject json) throws JSONException {
                // process response status
                String status = json.getString("status");
                if (!status.equals("OK")) {
                    String error = null;
    
                    if (status.equals("NOT_FOUND") || status.equals("ZERO_RESULTS")) {
                        error = Global.application.getString(R.string.errCantGetDirection);
                    } else {
                        error = Global.application.getString(R.string.errGetDirection);
                    }
    
                    result.instructions = new String[] { error };
                    result.hasError = true;
                    return;
                }
    
                /*
                 * routes[] legs[] steps[] html_instructions
                 */
                JSONArray arrRoutes = json.getJSONArray("routes");
    
                // no routes found
                if (arrRoutes.length() == 0) {
                    result.instructions = new String[] { Global.application.getString(R.string.errCantGetDirection) };
                    result.hasError = true;
                    return;
                }
    
                JSONArray arrLegs = arrRoutes.getJSONObject(0).getJSONArray("legs");
                JSONObject firstLeg = arrLegs.getJSONObject(0);
                JSONArray arrSteps = firstLeg.getJSONArray("steps");
                int len = arrSteps.length();
                result.instructions = new String[len];
                result.points = new LinkedList<GeoPoint>();
                JSONObject leg = null;
    
                // get instructions
                for (int i = 0; i < len; ++i) {
                    leg = arrSteps.getJSONObject(i);
                    // location = leg.getJSONObject("start_location");
                    String encoded = leg.getJSONObject("polyline").getString("points");
                    result.points.addAll(decodePoly(encoded));
    
                    result.instructions[i] = Html.fromHtml(leg.getString("html_instructions")).toString();
                    Log.d("html_instructions", "" + Html.fromHtml(leg.getString("html_instructions")));
                    // result.points[i] = new GeoPoint(
                    // (int) (location.getDouble("lat") * 1E6),
                    // (int) (location.getDouble("lng") * 1E6));
                }
    
                // location = leg.getJSONObject("end_location");
                // result.points[len] = new GeoPoint(
                // (int) (location.getDouble("lat") * 1E6),
                // (int) (location.getDouble("lng") * 1E6));
    
                // distance and duration info
                JSONObject distance = firstLeg.getJSONObject("distance");
                if (distance != null) {
                    result.distance = distance.getString("text");
                }
                JSONObject duration = firstLeg.getJSONObject("duration");
                if (duration != null) {
                    result.duration = duration.getString("text");
                }
            }
    
            @Override
            public void onFailure(String message) {
                String error = "Error";
    
                result.instructions = new String[] { error };
                result.hasError = true;
            }
        };
    
        // return direction result
        RestClient.getData(url, directionParser);
        return directionParser.result;
    }
    
    private static 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;
    }
    
        }
    
  2. 方向解析器和方向结果

    public class DirectionParser extends JSONParser {
    public DirectionResult result = new DirectionResult();
    
    protected int jsonType = JSONParser.GOOGLE_DIRECTION_JSON;
    
    public DirectionParser() {
        jsonType = JSONParser.GOOGLE_DIRECTION_JSON;
    }
    
    @Override
    public void onFailure(String message) {
    }
    
    @Override
    public void onSuccess(JSONObject json) throws JSONException {
    }
    }
    
    public class DirectionResult {
     public String[] instructions;
     public List<GeoPoint> points;
     public String duration;
     public String distance;
     public boolean hasError = false;
    }
    
  3. 你想要的是DirectionResult的指令。您可以使用字符串数组简单地创建一个数组适配器

     instructions = directionResult.instructions;// DirectionResult you got from MapService.
        ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(DirectionListActivity.this, android.R.layout.simple_list_item_1, instructions);
                     listDirection.setAdapter(adapter1);
    

更新:我发现另一个解析器Google-Maps-Directions-API-Java-Parser

于 2012-11-01T06:56:49.907 回答
0

查看 GreatMaps。他们有检索路线的逻辑。它基于 C#,只需使用它们的逻辑并用 Java 编写等价物。

http://greatmaps.codeplex.com/

于 2012-10-18T13:11:30.380 回答