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