在两个位置之间绘制路线Google Maps API Android V2

时间:2013-02-14 15:10:03

标签: google-maps google-maps-android-api-2 latitude-longitude

我正在使用Android上的Google Maps API V2。 尝试在两个位置之间获取路径并使用JSON解析进行此操作。

我正在寻找一条路线。并且路线开始应该如何。但后来有一点它走错了路。

我的终点目的地错了。而在其他一些地方,我的应用程序就会被终止。

这就是我所做的

这是我的makeURL方法

public String makeUrl(){
    StringBuilder urlString = new StringBuilder();
    urlString.append("http://maps.googleapis.com/maps/api/directions/json");
    urlString.append("?origin="); //start positie
    urlString.append(Double.toString(source.latitude));
    urlString.append(",");
    urlString.append(Double.toString(source.longitude));
    urlString.append("&destination="); //eind positie
    urlString.append(Double.toString(dest.latitude));
    urlString.append(",");
    urlString.append(Double.toString(dest.longitude));
    urlString.append("&sensor=false&mode=driving");

    return urlString.toString();
}

我的JSON解析器

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

public JSONParser() {
    // TODO Auto-generated constructor stub
}

public String getJSONFromURL(String url){

    try {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();

        is = httpEntity.getContent();
    } catch(UnsupportedEncodingException e){
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;

        while((line = reader.readLine()) != null){
            sb.append(line + "\n");
            //Log.e("test: ", sb.toString());
        }

        json = sb.toString();
        is.close();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        Log.e("buffer error", "Error converting result " + e.toString());
    }

    return json;
}

我使用此方法绘制路径

public void drawPath(String result){
    try{
        final JSONObject json = new JSONObject(result);
        JSONArray routeArray = json.getJSONArray("routes");
        JSONObject routes = routeArray.getJSONObject(0);

        JSONObject overviewPolylines = routes.getJSONObject("overview_polyline");
        String encodedString = overviewPolylines.getString("points");
        Log.d("test: ", encodedString);
        List<LatLng> list = decodePoly(encodedString);

        LatLng last = null;
        for (int i = 0; i < list.size()-1; i++) {
            LatLng src = list.get(i);
            LatLng dest = list.get(i+1);
            last = dest;
            Log.d("Last latLng:", last.latitude + ", " + last.longitude );
            Polyline line = googleMap.addPolyline(new PolylineOptions().add( 
                    new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude))
                    .width(2)
                    .color(Color.BLUE));
        }

        Log.d("Last latLng:", last.latitude + ", " + last.longitude );
    }catch (JSONException e){
        e.printStackTrace();
    }
}

我用

解码我的JSON
private List<LatLng> decodePoly(String encoded){

    List<LatLng> poly = new ArrayList<LatLng>();
    int index = 0;
    int length = encoded.length();
    int latitude = 0;
    int longitude = 0;

    while(index < length){
        int b;
        int shift = 0;
        int result = 0;

        do {
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);

        int destLat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        latitude += destLat;

        shift = 0;
        result = 0;
        do {
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b > 0x20);

        int destLong = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        longitude += destLong;

        poly.add(new LatLng((latitude / 1E5),(longitude / 1E5) ));
    }
    return poly;
}

然后用AsyncTask编码

提前致谢。

3 个答案:

答案 0 :(得分:2)

很抱歉等了很长时间..我刚刚修好了,但我还没有把我的解决方案放在这里。

这基本上是一个错字......

在我的Json解码器中,我使用2 Do while语句

while (b >= 0x20);

在第二次Do While声明中,我忘记了“=”。 因此它无法正确渲染......

感谢

答案 1 :(得分:1)

我相信您正在LatLng创建overview_polyline个对象。根据Google文档“,这包含一个对象,其中包含一组编码点,这些点表示生成路线的近似(平滑)路径。”

我非常确定您可以根据LatLnglegs[]数据制作更详细的steps[]对象路线,因为官方文档指出步骤是方向路线的最原子单位,包含描述旅程中特定单一指令的单一步骤

看看:

https://developers.google.com/maps/documentation/directions/#Routes

答案 2 :(得分:0)

Tmichel, 迈克尔有正确的波浪,因为在你的路线上的腿和台阶上划出了街道线。 腿和步骤,信息坐标周围的信息提醒用户。

折线是街道上正确而准确的点。 对不起,我的英文不好