RoadManager for osmdroid 错误
Posted
技术标签:
【中文标题】RoadManager for osmdroid 错误【英文标题】:RoadManager for osmdroid error 【发布时间】:2014-02-08 09:30:50 【问题描述】:我正在关注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 你解决了这个问题吗?我也有同样的问题。 【参考方案1】:让我们尝试为这个非常常见的问题提供一个完整的答案。
基本上,当你得到“直线”时,这意味着 RoadManager 出错了。
所以,首先,在你的代码中,你应该检查getRoad的结果,这样:
if (road.mStatus != Road.STATUS_OK)
//handle error... warn the user, etc.
现在,这个错误来自哪里? => 你必须在 logcat 中搜索。您应该找到已发送的完整 url,可能还有关于错误的堆栈跟踪。
我强烈建议您在浏览器中复制/粘贴此完整网址,然后检查结果。
以下是典型的错误,按概率递减:
1) 您没有仔细阅读Tutorial_0 开头的“重要说明”,并且您正在尝试在主线程中使用 SDK >= 3.0 进行网络调用。 => 阅读此“重要提示”。
2) 您要求的路线是不可能的(真的不可能,或者因为奇怪的位置,或者因为设置了不受支持的选项)。 => 这很容易通过在网络浏览器中复制/粘贴完整的 url 并查看答案来检查。
3) 您的设备没有网络连接。
4) 路由服务更改了它的 API(这种情况发生了不止一次……)。 => 可以通过在浏览器中复制/粘贴完整的 url 来检查。 在这种情况下,请在 OSMBonusPack 项目中提出问题,以便我们尽快将其考虑在内。
5) 路由服务已关闭。 => 通过在浏览器中复制/粘贴完整的 url 很容易检查。
【讨论】:
3) 您的设备没有网络连接。嗨@MKer,我们可以离线绘制溃败吗? 所有 OSMBonusPack RoadManager 都是在线服务。离线路由可以看 GraphHopper for android。 @MKer 我收到以下错误: java.lang.String 类型的值 无法转换为 JSONObject - 你知道可能出了什么问题吗?我正在异步任务中运行请求,并且已将来自 logcat 的链接粘贴到浏览器中。这对我来说似乎很好。此外,结果并不总是一条直线。有时它有效,但对我来说似乎是随机的。【参考方案2】:我认为在这种情况下最好使用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.
【讨论】:
【参考方案4】:我发现一个奇怪的错误如下: 首先,我提到以下代码行,用于为车辆“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
现在在第二次调用same 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 是否相同。
【讨论】:
以上是关于RoadManager for osmdroid 错误的主要内容,如果未能解决你的问题,请参考以下文章