2017-09-28 50 views
0

我試圖在Android上的Google地圖上相隔一定距離(比如超過100英里)的兩個位置之間繪製平滑多段線。我一直在關注這個guide以及guide這個關於利用Directions and Snap to Roads API的方面,但是由於從Snap到Roads API的100個座標的限制,看起來幾乎不可能從一個位置到另一個位置,遵循道路平滑的輪廓。之間的多段線未捕捉到道路

我已經成功地提取該方向的所有座標使用返回overview_points繪製折線,並使用解碼方法從PolyUtil API已經破譯這一點,但在地圖上繪製的折線沒有捕捉到的道路絕大多數時間。相反,我嘗試使用Snap to Roads API,並設置了100個座標的限制(允許的最大GPS點數),這些座標似乎都非常準確地對準從目的地A到B的道路(僅覆蓋兩個位置之間的一定距離如果相距甚遠)。

基本上是有什麼我完全丟失,或者是它的到來了一些決議,傳播100使用從路線從overview_points檢索到的GPS點座標對齊的分配道路API的情況下, API,即每隔XXX米繪製一個座標。

下面是我通過一個凌空請求減去捕捉到道路的要求執行的代碼,後來是實現起來相當直接的批量:

StringRequest stringRequest = new StringRequest(Request.Method.GET, 
"https://maps.googleapis.com/maps/api/directions/json? 
origin=START_LOCATION_HERE&destination=END_LOCATION_HERE&key=API_KEY_HERE", 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 

        JSONObject directions; 
        try { 
         directions = new JSONObject(response); 

         JSONArray routes = directions.getJSONArray("routes"); 

         mCoordinates = new ArrayList<>(); 
         for (int i = 0; i < routes.length(); i++) { 
          JSONObject routesObject = routes.getJSONObject(i); 

          JSONObject overviewPolyline = routesObject.getJSONObject("overview_polyline"); 
          String points = overviewPolyline.getString("points"); 

          List<LatLng> coordinates = new ArrayList<>(); 
          coordinates.addAll(PolyUtil.decode(points)); 

          PolylineOptions routeCoordinates = new PolylineOptions(); 
          for (LatLng latLng : coordinates) { 
           routeCoordinates.add(new LatLng(latLng.latitude, latLng.longitude)); 
          } 
          routeCoordinates.width(5); 
          routeCoordinates.color(Color.BLUE); 

          Polyline route = mGoogleMap.addPolyline(routeCoordinates); 
          for (LatLng latLng : coordinates) { 
           mGoogleMap.addMarker(new MarkerOptions().position(new LatLng(latLng.latitude, latLng.longitude))); 
          } 

         } 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 

       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      // TODO handle error 
     } 

    }); 
+0

你爲什麼要這麼做? '字符串formattedResponse = points.replaceAll(「'\\'」,「''');' –

+0

嗨丹尼爾,根據此鏈接https://developers.google.com/maps/documentation/utilities/polylinealgorithm:'請注意,反斜槓被解釋爲字符串文字中的轉義字符。此實用程序的任何輸出都應該將反斜槓字符轉換爲字符串內的雙反斜槓。我嘗試了幾種組合,這是讓它起作用的唯一方法之一,除非我完全誤解了這一點。 –

+0

對不起,我的錯誤,我現在已經刪除了這條線,它似乎沒有它的工作。但是,這個問題仍然存在於不符合道路輪廓的座標上。 –

回答

0

好的,如果有人遇到這個問題或類似問題,我已經設法解決問題S和它似乎正確打印後面的道路的平滑輪廓的地圖上的折線的方式是使用每個單獨的折線>編碼串內的每個步驟對象。它也似乎我誤讀了documentation明確指出在每個步驟折線編碼的字符串對象提供了每個步驟的近似平滑路徑,我想其他人可能也錯過了。

基本上,overview_polyline編碼字符串將只提供路線的概述,因此不提供位置之間的平滑路徑。對於由大部分直線組成的路線(英國不太明顯)來說,它可能是完美的,因此每條折線編碼字符串都是需要的。我剛剛測試過,它完美地工作,完全不需要Snap to Roads API。

我改變代碼來解決在我的使用情況下,問題如下:

StringRequest stringRequest = new StringRequest(Request.Method.GET, "https://maps.googleapis.com/maps/api/directions/json?origin=START_LOCATION&destination=END_LOCATION&key=API_KEY", 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 

        JSONObject directions; 
        try { 
         directions = new JSONObject(response); 

         JSONArray routes = directions.getJSONArray("routes"); 

         mCoordinates = new ArrayList<>(); 
         for (int a = 0; a < routes.length(); a++) { 
          JSONObject routesObject = routes.getJSONObject(a); 

          JSONArray legsArray = routesObject.getJSONArray("legs"); 
          for (int b = 0; b < legsArray.length(); b++) { 
           JSONObject legsObject = legsArray.getJSONObject(b); 
           JSONArray steps = legsObject.getJSONArray("steps"); 
           for (int c = 0; c < steps.length(); c++) { 
            JSONObject stepsObject = steps.getJSONObject(c); 
            JSONObject polyLineObject = stepsObject.getJSONObject("polyline"); 
            mCoordinates.addAll(PolyUtil.decode(polyLineObject.getString("points"))); 
           } 
          } 

          PolylineOptions routeCoordinates = new PolylineOptions(); 
          for (LatLng latLng : mCoordinates) { 
           routeCoordinates.add(new LatLng(latLng.latitude, latLng.longitude)); 
          } 
          routeCoordinates.width(5); 
          routeCoordinates.color(Color.BLUE); 

          Polyline route = mGoogleMap.addPolyline(routeCoordinates); 

         } 

        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 

       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      // TODO handle error 
     } 

    }); 
0

從方向API的編碼點已經「搶購」到道路上,所以不需要使用任何額外的API。

使用該代碼來解析/在路徑解碼點:

List<LatLng> pointsList = null; 
JSONArray routeArray = obj.getJSONArray("routes"); 
JSONObject routes = routeArray.getJSONObject(0); 
JSONObject overviewPolylines = routes.getJSONObject("overview_polyline"); 
String encodedString = overviewPolylines.getString("points"); 
pointsList = PolyUtil.decode(encodedString); 

然後拉伸該折線:

PolylineOptions options = new PolylineOptions().width(5).color(Color.MAGENTA).geodesic(true); 
for (int i = 0; i < pointsList.size(); i++) { 
    LatLng point = pointsList.get(i); 
    options.add(point); 
} 
line = mMap.addPolyline(options); 

這是結果:

enter image description here

+0

嗨丹尼爾,再次感謝您的意見,但我剛剛嘗試過您建議的代碼,並且問題依然存在。我會附上一張照片到我原來的帖子,給你一個例子,用你的代碼來說明我一直面臨的同樣的問題。 –

+0

我似乎無法附上上面的圖片,雖然這裏是一個鏈接來說明我仍然面臨的問題:https://imgur.com/a/IM0bk。它似乎是當你從遠處縮小多段線時,它們似乎沒問題。這只是我見過的其他例子,即使是靠近,他們也緊緊依附於道路。 –

+0

@RichardAnsell你可以給我你開始使用的經緯度和經度嗎?我可以試試看看我是否得到相同的結果。 –