RoadManager для ошибки osmdroid

Я следую учебнику здесь https://code.google.com/p/osmbonuspack/wiki/Tutorial_1, но я столкнулся с ошибкой, что он неправильно отображает правильный маршрут. Он просто показывает прямую линию от точки А до точки Б.

То, что я хочу достичь, – показать правильный маршрут из этих точек. Я предполагаю, что ошибка в том, что она не распознает какие-либо узлы.

Аналогичный вопрос также был задан, и я предполагаю, что у меня такая же проблема, если я не очень хорошо объяснил свой вопрос.

Аналогичный вопрос можно найти здесь: проблемы с настройкой OSMDroid при выполнении руководства

Вот часть моего кода с помощью 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 } } } }//=================================================================================================== 

    Я думаю, что лучше использовать 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);

    Попробуем дать полный ответ на этот довольно частый вопрос.

    В принципе, когда вы получаете «прямую линию», это означает, что RoadManager получил ошибку.

    Итак, в первую очередь, в вашем коде, вы должны проверить результат getRoad, таким образом:

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

    Теперь, откуда эта ошибка? => Вы должны искать в logcat. Вы должны найти полный URL-адрес, который был отправлен, и, вероятно, stacktrace об ошибке.

    Я настоятельно рекомендую вам скопировать / вставить этот полный URL-адрес в браузере и проверить результат.

    Вот типичные ошибки, уменьшая вероятность:

    1) Вы не внимательно прочитали «Важное примечание» в начале Tutorial_0 , и вы пытаетесь выполнить сетевой вызов в основном потоке с помощью SDK> = 3.0. => Прочитайте это «Важное примечание».

    2) Вы попросили маршрут, который невозможен (действительно невозможно, или из-за странных позиций, или из-за установки неподдерживаемых опций). => Это легко проверить, скопировав / вставив полный URL-адрес в веб-браузер и посмотрев ответ.

    3) Устройство не имеет сетевого подключения.

    4) Служба маршрутизации изменила свой API (это произошло не один раз …). => Может быть проверено путем копирования / вставки полного URL-адреса в браузере. В этом случае поднимите проблему в проекте OSMBonusPack, чтобы мы могли принять ее во внимание как можно скорее.

    5) Служба маршрутизации отключена. => Простота проверки путем копирования / вставки полного URL-адреса в браузере.

     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.