如何获取从位置A(起点)到位置B(目的地点)的路线的所有纬度和经度

时间:2016-01-06 11:17:54

标签: android google-maps routes google-play-services

我尝试过创建路线,但我不知道如何从之前的起点到目的地取得所有纬度和经度。在这里,当我在地图中搜索从开始到目的地的路线时,我选择了我选择的路线,并且我希望从开始到目的地获得所有纬度和经度。我必须将此数据提供给其他java方法进行一些计算。如果有任何解决方法,请告诉我。既然,我是地图的初学者,我没有太多的想法。我用Google搜索并尝试了Stack溢出,但没有找到任何相似或支持的解决方案。

提前致谢, 灰

2 个答案:

答案 0 :(得分:3)

首先,我们将获得我们必须绘制路线的源点和目的地点。然后我们将这些属性传递给下面的函数。

 public String makeURL (double sourcelat, double sourcelog, double destlat, double destlog ){
    StringBuilder urlString = new StringBuilder();
    urlString.append("http://maps.googleapis.com/maps/api/directions/json");
    urlString.append("?origin=");// from
    urlString.append(Double.toString(sourcelat));
    urlString.append(",");
    urlString
            .append(Double.toString( sourcelog));
    urlString.append("&destination=");// to
    urlString
            .append(Double.toString( destlat));
    urlString.append(",");
    urlString.append(Double.toString( destlog));
    urlString.append("&sensor=false&mode=driving&alternatives=true");
    urlString.append("&key=YOUR_API_KEY");
    return urlString.toString(); }

此函数将生成我们将发送的url以获取Direction API响应。然后我们将解析该响应。解析器类是

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
public String getJSONFromUrl(String url) {

    // Making HTTP request
    try {
        // defaultHttpClient
        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) {
        e.printStackTrace();
    } catch (IOException e) {
        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");
        }

        json = sb.toString();
        is.close();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }
    return json;

}}

此解析器将返回我们的字符串。我们会这样称呼它。

JSONParser jParser = new JSONParser();String json = jParser.getJSONFromUrl(url);

现在我们将此字符串发送到drawpath函数。 drawpath函数

public void drawPath(String  result) {

try {
        //Tranform the string into a json object
       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");
       List<LatLng> list = decodePoly(encodedString);
       Polyline line = mMap.addPolyline(new PolylineOptions()
                                .addAll(list)
                                .width(12)
                                .color(Color.parseColor("#05b1fb"))//Google maps blue color
                                .geodesic(true)
                );
       /*
       for(int z = 0; z<list.size()-1;z++){
            LatLng src= list.get(z);
            LatLng dest= list.get(z+1);
            Polyline line = mMap.addPolyline(new PolylineOptions()
            .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude,   dest.longitude))
            .width(2)
            .color(Color.BLUE).geodesic(true));
        }
       */
} 
catch (JSONException e) {

}} 

上面的代码将在mMap上绘制路径。 decodePoly的代码是

private List<LatLng> decodePoly(String encoded) {

List<LatLng> poly = new ArrayList<LatLng>();
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;

    LatLng p = new LatLng( (((double) lat / 1E5)),
             (((double) lng / 1E5) ));
    poly.add(p);
}

return poly;}

由于方向调用可能需要一些时间,因此我们将在异步任务中执行所有操作。我的异步任务是

private class connectAsyncTask extends AsyncTask<Void, Void, String>{
private ProgressDialog progressDialog;
String url;
connectAsyncTask(String urlPass){
    url = urlPass;
}
@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();
    progressDialog = new ProgressDialog(MainActivity.this);
    progressDialog.setMessage("Fetching route, Please wait...");
    progressDialog.setIndeterminate(true);
    progressDialog.show();
}
@Override
protected String doInBackground(Void... params) {
    JSONParser jParser = new JSONParser();
    String json = jParser.getJSONFromUrl(url);
    return json;
}
@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);   
    progressDialog.hide();        
    if(result!=null){
        drawPath(result);
    }
}}

尝试使用此代码对我有用

答案 1 :(得分:0)

使用此API获取方向将您的起始lat,long和destination lat long放入api 字符串网址=&#34; https://maps.googleapis.com/maps/api/directions/&#34;                 +输出+&#34;?&#34; +参数;