2014-01-19 32 views
6

我在這裏按照教程https://code.google.com/p/osmbonuspack/wiki/Tutorial_1但我遇到了一個錯誤,它沒有正確顯示正確的路線。它僅顯示從點A到點B的直線。用於osmdroid錯誤的RoadManager

我想實現的是從這些點顯示正確的路線。我猜測錯誤是它不能識別任何節點。

也提出了類似的問題,如果我沒有很好地解釋我的問題,我假設我有同樣的問題。

類似的問題都可以在這裏找到:OSMDroid Routing problems when following a tutorial

下面是使用RoadManager

我的代碼的一部分下面是代碼的一部分。

try { 

       //get current longlat 
       gpsLocator.getLocation(); 
       cur_loc_lat =gpsLocator.getLatitude(); 
       cur_loc_long =gpsLocator.getLongitude(); 

      } catch (Exception e) { 
       // TODO: handle exception 
      } 

      //--- Create Another Overlay for multi marker 
      anotherOverlayItemArray = new ArrayList<OverlayItem>(); 
      anotherOverlayItemArray.add(new OverlayItem(
        "UST", "UST", new GeoPoint(testlat, testlong))); 

      //--- Create Another Overlay for multi marker 
      anotherOverlayItemArray.add(new OverlayItem(
        locDefine[0], "UST", new GeoPoint(sel_latitude, sel_longitude))); 


      ItemizedIconOverlay<OverlayItem> anotherItemizedIconOverlay 
      = new ItemizedIconOverlay<OverlayItem>(
       TomWalks.this, anotherOverlayItemArray, myOnItemGestureListener); 

      myOpenMapView.getOverlays().add(anotherItemizedIconOverlay); 
      //--- 

      //Add Scale Bar 
      ScaleBarOverlay myScaleBarOverlay = new ScaleBarOverlay(TomWalks.this); 
      myOpenMapView.getOverlays().add(myScaleBarOverlay); 


      try { 


       //1 Routing via road manager 
       RoadManager roadManager = new MapQuestRoadManager(); 
       roadManager.addRequestOption("routeType=pedestrian"); 
       /* 
       roadManager.addRequestOption("units=m"); 
       roadManager.addRequestOption("narrativeType=text"); 
       roadManager.addRequestOption("shapeFormat=raw"); 
       roadManager.addRequestOption("direction=0"); 
       */ 
       //Then, retrieve the road between your start and end point: 
       ArrayList<GeoPoint> waypoints = new ArrayList<GeoPoint>(); 
       waypoints.add(new GeoPoint(testlat, testlong)); 
       waypoints.add(new GeoPoint(sel_latitude,sel_longitude)); //end point 

       Road road = roadManager.getRoad(waypoints); 


       // then, build an overlay with the route shape: 
       PathOverlay roadOverlay = RoadManager.buildRoadOverlay(road, myOpenMapView.getContext()); 
       roadOverlay.setColor(Color.GREEN); 


       //Add Route Overlays into map 
       myOpenMapView.getOverlays().add(roadOverlay); 
       myOpenMapView.invalidate();//refesh map 


       final ArrayList<ExtendedOverlayItem> roadItems = 
          new ArrayList<ExtendedOverlayItem>(); 
       ItemizedOverlayWithBubble<ExtendedOverlayItem> roadNodes = 
          new ItemizedOverlayWithBubble<ExtendedOverlayItem>(TomWalks.this, roadItems, myOpenMapView); 



       myOpenMapView.getOverlays().add(roadNodes); 
       myOpenMapView.invalidate();//refesh map 



       int nodesize=road.mNodes.size(); 
       double length = road.mLength; 


       Drawable marker = getResources().getDrawable(R.drawable.marker_node); 

       Toast.makeText(TomWalks.this, " Distance : " + length + " Nodes : "+nodesize ,Toast.LENGTH_SHORT).show(); 

        for (int i=0; i<road.mNodes.size(); i++) 
        { 
          RoadNode node = road.mNodes.get(i); 
          ExtendedOverlayItem nodeMarker = new ExtendedOverlayItem("Step "+i, "", node.mLocation, TomWalks.this); 
          nodeMarker.setMarkerHotspot(OverlayItem.HotspotPlace.CENTER); 
          nodeMarker.setMarker(marker); 
          roadNodes.addItem(nodeMarker); 

          nodeMarker.setDescription(node.mInstructions); 
          nodeMarker.setSubDescription(road.getLengthDurationText(node.mLength, node.mDuration)); 
          Drawable icon = getResources().getDrawable(R.drawable.marker_node); 
          nodeMarker.setImage(icon); 

        }//end for 

        myOpenMapView.getOverlays().add(roadNodes); 
        myOpenMapView.invalidate();//refesh map 


      } catch (Exception e) { 
       // TODO: handle exception 


       Toast.makeText(TomWalks.this,e.getMessage(),Toast.LENGTH_SHORT).show(); 


      } 

      myMapController.setCenter(new GeoPoint(sel_latitude, sel_longitude)); 


     } catch (Exception e) { 
      // TODO: handle exception 
     }   
    } 

} 

}//=================================================================================================== 
+0

哪裏是你的代碼? – SamB

+0

編輯我的問題@SamB,增加了代碼。 – user3211403

+0

@ user3211403你解決了這個問題嗎?我有同樣的問題。 – kittu88

回答

4

讓我們試着爲這個相當常見的問題提供一個完整的答案。

基本上,當你得到「直線」時,就意味着RoadManager出錯了。

所以,首先,在你的代碼,你應該檢查getRoad,這樣的結果:

if (road.mStatus != Road.STATUS_OK){ 
    //handle error... warn the user, etc. 
} 

現在,在這個錯誤是哪裏來的? =>您必須在logcat中搜索。您應該找到已發送完整的網址,並且可能會找到有關該錯誤的堆棧跟蹤。

我強烈建議您在瀏覽器中複製/粘貼這個完整的url,然後檢查結果。

這裏是典型的錯誤,通過降低概率:

1)你沒有」仔細閱讀‘重要提示’的Tutorial_0的開始,而你正在嘗試做網絡電話在主線程,SDK> = 3.0。 =>請閱讀「重要提示」。

2)你問的這是不可能的路線(實際上不可能,或者是因爲怪異的位置,設置不支持的選項,或者因爲)。 =>這是很容易通過複製檢查/粘貼在Web瀏覽器的完整URL,並尋找答案。

3)您的設備沒有網絡連接。

4)路由服務改變了它的API(發生這種情況,不止一次...)。 =>可以通過在瀏覽器中複製/粘貼完整的URL來檢查。 在這種情況下,在OSMBonusPack項目中引發一個問題,以便我們可以儘快考慮它。

5)路由服務已關閉。 =>容易被複制檢查/粘貼完整的URL在瀏覽器中。

+0

3)您的設備沒有網絡連接。嗨@MKer我們可以離線繪製路線嗎? – max

+0

所有OSMBonusPack RoadManagers都是在線服務。對於離線路由,您可以查看GraphHopper for Android。 – MKer

2
new Thread(new Runnable() 
{ 
    public void run() 
    { 
     RoadManager roadManager = new OSRMRoadManager(); 
     ArrayList<GeoPoint> waypoints = new ArrayList<GeoPoint>(); 
     GeoPoint startPoint = new GeoPoint(source_lat, source_longi);    
     waypoints.add(startPoint); 
     GeoPoint endPoint = new GeoPoint(desti_lat,desti_longi); 
     waypoints.add(endPoint);      
     try 
     { 
      road = roadManager.getRoad(waypoints); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     runOnUiThread(new Runnable() 
     { 
      public void run() 
      { 
       if (road.mStatus != Road.STATUS_OK) 
       { 
         //handle error... warn the user, etc. 
       } 

       Polyline roadOverlay = RoadManager.buildRoadOverlay(road, Color.RED, 8, context); 
       map.getOverlays().add(roadOverlay);     
      } 
     }); 
    } 
}).start(); 

And i am use two jar files 1)slf4j-android-1.5.8.jar and 2)osmdroid-android-4.2.jar and osmbonuspack library. 
4

我想還是在這種情況下使用AsyncTasks

/** 
    * Async task to get the road in a separate thread. 
    */ 
    private class UpdateRoadTask extends AsyncTask<Object, Void, Road> { 

     protected Road doInBackground(Object... params) { 
      @SuppressWarnings("unchecked") 
      ArrayList<GeoPoint> waypoints = (ArrayList<GeoPoint>)params[0]; 
      RoadManager roadManager = new OSRMRoadManager(); 


      return roadManager.getRoad(waypoints); 
                 } 
     @Override 
     protected void onPostExecute(Road result) { 
      road = result; 
      // showing distance and duration of the road 
      Toast.makeText(getActivity(), "distance="+road.mLength, Toast.LENGTH_LONG).show(); 
      Toast.makeText(getActivity(), "durée="+road.mDuration, Toast.LENGTH_LONG).show(); 

      if(road.mStatus != Road.STATUS_OK) 
      Toast.makeText(getActivity(), "Error when loading the road - status="+road.mStatus, Toast.LENGTH_SHORT).show(); 
      Polyline roadOverlay = RoadManager.buildRoadOverlay(road,getActivity()); 

      map.getOverlays().add(roadOverlay); 
      map.invalidate(); 
      //updateUIWithRoad(result); 
                } 
    } 

然後調用它new UpdateRoadTask().execute(waypoints);