2014-01-19 6 views
6

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

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

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

Похожий вопрос можно найти здесь: 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. 
} 

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

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

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

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

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

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

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

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

+0

3) Устройство не имеет сетевого подключения. Привет @MKer мы можем провести маршрутизацию в автономном режиме? – max

+0

Все OSMBonusPack RoadManager - это онлайн-сервисы. Для автономной маршрутизации вы можете посмотреть GraphHopper для 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);