Android osmdroid错误的RoadManager

Android osmdroid错误的RoadManager,android,routing,openstreetmap,osmdroid,Android,Routing,Openstreetmap,Osmdroid,我在这里遵循一个教程,但我遇到了一个错误,它没有正确显示正确的路线。它只是显示了一条从a点到B点的直线 我想要实现的是从这些点显示正确的路线。我猜错误在于它无法识别任何要通过的节点 也有人问过类似的问题,如果我没有很好地解释我的问题,我假设我也有同样的问题 类似的问题可以在这里找到: 下面是我使用RoadManager的部分代码 这是代码的一部分 try { //get current longlat gpsLocator.get

我在这里遵循一个教程,但我遇到了一个错误,它没有正确显示正确的路线。它只是显示了一条从a点到B点的直线

我想要实现的是从这些点显示正确的路线。我猜错误在于它无法识别任何要通过的节点

也有人问过类似的问题,如果我没有很好地解释我的问题,我假设我也有同样的问题

类似的问题可以在这里找到:

下面是我使用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
        }           
    }

}

}//===================================================================================================
试试看{
//获取当前的longlat
gpsLocator.getLocation();
cur_loc_lat=gpsLocator.getLatitude();
cur_loc_long=gpsLocator.getLongitude();
}捕获(例外e){
//TODO:处理异常
}
//---为多标记创建另一个覆盖
anotherOverlayItemArray=new ArrayList();
另一个OverlayItemArray.add(新的OverlayItem)(
“UST”、“UST”、新地质点(testlat、testlong));
//---为多标记创建另一个覆盖
另一个OverlayItemArray.add(新的OverlayItem)(
locDefine[0],“UST”,新的地质点(sel_纬度,sel_经度));
第二项是第二项
=新的ItemIzedEdiconOverlay(
TomWalks.this,另一个OverlayItemArray,MyniteMgestureListener);
myOpenMapView.getOverlays().add(另一个术语mizedEdiconOverlay);
//---
//添加比例尺
ScaleBarOverlay myScaleBarOverlay=新的ScaleBarOverlay(TomWalks.this);
myOpenMapView.getOverlays().add(myScaleBarOverlay);
试一试{
//1通过道路管理器选择路线
RoadManager RoadManager=新的MapQuestRoadManager();
roadManager.addRequestOption(“routeType=peander”);
/*
roadManager.addRequestOption(“单位=m”);
roadManager.addRequestOption(“叙述类型=文本”);
addRequestOption(“shapeFormat=raw”);
roadManager.addRequestOption(“方向=0”);
*/
//然后,检索起点和终点之间的道路:
ArrayList航路点=新的ArrayList();
添加(新的地质点(testlat、testlong));
添加(新地理点(sel_纬度、sel_经度));//终点
Road Road=roadManager.getRoad(航路点);
//然后,使用管线形状构建覆盖:
PathOverlay roadOverlay=RoadManager.buildRoadOverlay(road,myOpenMapView.getContext());
道路覆盖。设置颜色(颜色。绿色);
//将路线覆盖添加到地图中
myOpenMapView.getOverlays().add(道路覆盖);
myOpenMapView.invalidate();//refesh映射
最终ArrayList道路项目=
新的ArrayList();
ItemizedOverlayWithBubble道路节点=
新项目通过气泡显示(TomWalks.this、roadItems、myOpenMapView);
myOpenMapView.getOverlays().add(道路节点);
myOpenMapView.invalidate();//refesh映射
int nodesize=road.mNodes.size();
双倍长度=road.m长度;
Drawable marker=getResources().getDrawable(R.Drawable.marker_节点);
Toast.makeText(TomWalks.this,“距离:+length+”节点:+nodesize,Toast.length_SHORT).show();

对于(inti=0;i,让我们尝试为这个非常常见的问题提供一个完整的答案

基本上,当你得到一条“直线”时,这意味着道路管理者犯了一个错误

因此,首先,在代码中,您应该检查getRoad的结果,如下所示:

if (road.mStatus != Road.STATUS_OK){
  //handle error... warn the user, etc. 
}
现在,这个错误是从哪里来的? =>您必须在logcat中搜索。您应该找到已发送的完整url,可能还有有关错误的stacktrace

我强烈建议您在浏览器中复制/粘贴此完整url,并检查结果

以下是通过降低概率得出的典型错误:

1) 您没有仔细阅读开始时的“重要注意事项”,您正试图在主线程中进行网络调用,SDK>=3.0。 =>阅读此“重要注意事项”

2) 您请求了一条不可能的路线(真的不可能,或者因为奇怪的位置,或者因为设置了不受支持的选项)。 =>通过在web浏览器中复制/粘贴完整的url,并查看答案,可以轻松检查

3) 您的设备没有网络连接

4) 路由服务更改了其API(发生了多次…)。 =>可通过在浏览器中复制/粘贴完整url进行检查。 在这种情况下,在OSMBonusPack项目中提出一个问题,以便我们尽快考虑它

5) 路由服务已关闭。 =>通过在浏览器中复制/粘贴完整url来轻松检查。

新线程(new Runnable())
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.
{ 公开募捐 { RoadManager RoadManager=新的OSRMRoadManager(); ArrayList航路点=新的ArrayList(); 地质点起始点=新的地质点(震源横向、震源纵向); 航路点。添加(起始点); 地质点端点=新的地质点(目的地纬度、目的地经度); 航路点。添加(终点); 尝试 { road=roadManager.getRoad(航路点); } 捕获(例外e) { e、 printStackTrace(); } runOnUiThread(新的Runnable() { 公开募捐 { 如果(road.mStatus!=road.STATUS_OK) { //处理错误…警告用户等。 }
/**
     * 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);
                                                    }
    }