2014-01-19 12 views
6

Ich bin ein Tutorial hier https://code.google.com/p/osmbonuspack/wiki/Tutorial_1 folgen, aber ich habe einen Fehler festgestellt, dass es nicht die richtige Route korrekt anzeigt. Es zeigt nur eine gerade Linie von Punkt A zu Punkt B.RoadManager für Osmdroid Fehler

Was ich erreichen möchte, ist die korrekte Route von diesen Punkten zu zeigen. Ich vermute der Fehler ist, dass es keine Knoten erkennt, durch zu gehen.

Eine ähnliche Frage wurde ebenfalls gestellt und ich gehe davon aus, dass ich das gleiche Problem habe, wenn ich meine Frage nicht gut erklärt habe.

ähnliche Frage ist hier zu finden: OSMDroid Routing problems when following a tutorial

Hier ist ein Teil meines Code Roadmanager

Hier ist ein Teil des Codes ist.

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

Wo Ihr Code ist? – SamB

+0

meine Frage @SamB bearbeitet, Code hinzugefügt. – user3211403

+0

@ user3211403 haben Sie das Problem gelöst? Ich habe ein gleiches Problem. – kittu88

Antwort

4

Lassen Sie uns versuchen, eine vollständige Antwort auf diese recht häufige Frage zu geben.

Grundsätzlich, wenn Sie die "gerade Linie" erhalten, bedeutet dies, dass der RoadManager einen Fehler bekommen hat.

Also, zunächst einmal in Ihrem Code, sollten Sie das Ergebnis getRoad überprüfen, auf diese Weise:

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

Nun, wo dieser Fehler herkommt? => Sie müssen im Logcat suchen. Sie sollten die vollständige URL, die gesendet wurde, und wahrscheinlich einen Stacktrace über den Fehler finden.

Ich empfehle dringend, dass Sie diese vollständige URL in einem Browser kopieren und einfügen, und überprüfen Sie das Ergebnis.

Hier sind die typischen Fehler, durch eine Verringerung der Wahrscheinlichkeit:

1) Sie den Ball hält‘am Anfang der Tutorial_0 sorgfältig den‚Wichtigen Hinweis‘lesen, und Sie versuchen, einen Netzwerkanruf im Hauptthread zu tun , mit einem SDK> = 3.0. => Lesen Sie diesen "Wichtiger Hinweis".

2) Sie haben nach einer Route gefragt, die nicht möglich ist (wirklich nicht möglich, oder wegen seltsamer Positionen oder wegen der Einstellung nicht unterstützter Optionen). => Dies ist einfach zu überprüfen, indem Sie die gesamte URL in einen Webbrowser kopieren und einfügen und die Antwort betrachten.

3) Ihr Gerät verfügt über keine Netzwerkverbindung.

4) Der Routing-Dienst hat seine API geändert (dies ist mehr als einmal passiert ...). => Kann durch Kopieren/Einfügen der vollständigen URL in einem Browser überprüft werden. In diesem Fall lösen Sie ein Problem im OSMBonusPack-Projekt aus, damit wir es so schnell wie möglich berücksichtigen können.

5) Der Routing-Dienst ist ausgefallen. => Einfach zu überprüfen durch Kopieren/Einfügen der vollständigen URL in einem Browser.

+0

3) Ihr Gerät hat keine Netzwerkverbindung. hi @MKer können wir den Router offline zeichnen? – max

+0

Alle OSMBonusPack RoadManager sind Online-Dienste. Für Offline-Routing können Sie GraphHopper für Android betrachten. – 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

Ich denke, es ist besser AsyncTasks in diesem Fall zu verwenden:

/** 
    * 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); 
                } 
    } 

es dann rufen new UpdateRoadTask().execute(waypoints);

Verwandte Themen