RoadManager对osmdroid的错误

7
我正在参照这个教程https://code.google.com/p/osmbonuspack/wiki/Tutorial_1,但是我遇到了一个错误,它不能正确显示正确的路径,而只是显示从点A到点B的一条直线。
我想要实现的是从这些点显示正确的路径。我猜测错误是它没有识别任何要经过的节点。
类似的问题也曾被问及,如果我没有解释清楚我的问题,我就假定我有同样的问题。
类似的问题可以在这里找到: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
        }           
    }

}

}//===================================================================================================

编辑了我的问题@SamB,添加了代码。 - user3211403
@user3211403,你解决了这个问题吗?我也遇到了同样的问题。 - kittu88
4个回答

5

让我们尝试对这个非常频繁的问题提供一个完整的答案。

基本上,当你得到“直线”时,这意味着RoadManager出现了错误。

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

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

现在,这个错误是从哪里来的? => 你必须在logcat中搜索。你应该找到已发送的完整url,以及可能与错误有关的堆栈跟踪。
我强烈建议你复制/粘贴这个完整的url到浏览器中,并检查结果。
以下是典型的错误,按概率递减:
1)您没有仔细阅读Tutorial_0开头的“重要提示”,并且正在尝试在主线程中使用SDK>=3.0进行网络调用。 => 阅读此“重要提示”。
2)您请求了一个不可能的路线(真的不可能,或者因为奇怪的位置,或者因为设置了不支持的选项)。 => 这很容易通过将完整的url复制/粘贴到Web浏览器中,并查看答案来检查。
3)您的设备没有网络连接。

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

5) 路由服务停机。 => 通过在浏览器中复制/粘贴完整的URL轻松检查。


  1. 您的设备没有网络连接。嗨@MKer,我们可以离线绘制路线吗?
- max
所有的OSMBonusPack RoadManagers都是在线服务。对于离线路由,您可以查看Android上的GraphHopper。 - MKer
@MKer我遇到了以下错误:值类型为java.lang.String的<html>无法转换为JSONObject - 你知道可能出了什么问题吗?我在异步任务中运行请求,并将链接从logcat粘贴到浏览器中。在我看来,它似乎很好。此外,结果并不总是一条直线。有时它有效,但对我来说似乎是随机的。 - Felix Hegg

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);

3
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.

1
我发现一个奇怪的错误,具体如下: 首先,我提到以下代码行,用于获取“BIKE”车辆的方向。
((OSRMRoadManager) roadManager).setMean(OSRMRoadManager.MEAN_BY_BIKE);

现在,当第一次调用时,它会按照以下URL进行: https://routing.openstreetmap.de/routed-car/route/v1/driving/68.8889678000,23.2151582000;73.1808008000,22.3110728000?alternatives=false&overview=full&steps=true

现在,当第二次调用(相同的MEAN_BY_BIKE)时,它将按照以下URL进行: https://routing.openstreetmap.de/routed-bike/route/v1/driving/68.8889678000,23.2151582000;73.1808008000,22.3110728000?alternatives=false&overview=full&steps=true

问题在于没有响应针对“routed-bike”,当第二次调用时,它会自动调用本身。
因此,我将代码更改为以下内容作为解决方案:
((OSRMRoadManager) roadManager).setMean(OSRMRoadManager.MEAN_BY_CAR);

您可以检查您的LogCat以获取相同的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接