RoadManager for osmdroid error

前端 未结 3 936
孤城傲影
孤城傲影 2020-12-06 07:41

I am following a tutorial here https://code.google.com/p/osmbonuspack/wiki/Tutorial_1 but I have encountered an error that it doesn\'t show the correct route correctly. It j

相关标签:
3条回答
  • 2020-12-06 07:58

    I think it is better to use AsyncTasks in this case:

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

    then call it new UpdateRoadTask().execute(waypoints);

    0 讨论(0)
  • 2020-12-06 08:00

    Let's try to provide a complete answer to this quite frequent question.

    Basically, when you get the "straight line", it means that the RoadManager got an error.

    So, first of all, in your code, you should check the result of getRoad, this way:

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

    Now, where this error is coming from? => You must search in the logcat. You should find the full url that has been sent, and probably a stacktrace about the error.

    I strongly recommend that you copy/paste this full url in a browser , and check the result.

    Here are the typical errors, by decreasing probability:

    1) You didnt' read carefully the "Important note" at the beginning of the Tutorial_0, and you are trying to do a Network call in the main thread, with an SDK >= 3.0. => Read this "Important note".

    2) You asked for a route that is not possible (really not possible, or because of weird positions, or because of setting unsupported options). => This is easy to check by copy/pasting the full url in a web browser, and looking at the answer.

    3) Your device has no network connectivity.

    4) The routing service changed its API (this happened, more than once...). => Could be checked by copy/pasting the full url in a browser. In this case, raise an Issue in OSMBonusPack project, so that we can take it into account ASAP.

    5) The routing service is down. => Easy to check by copy/pasting the full url in a browser.

    0 讨论(0)
  • 2020-12-06 08:05
    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.
    
    0 讨论(0)
提交回复
热议问题