RoadManager的osmdroid错误 [英] RoadManager for osmdroid error
问题描述
我下面的教程在这里 https://开头code。 google.com/p/osmbonuspack/wiki/Tutorial_1 但我已经遇到了一个错误,它并不能正确显示正确的路线。它只是显示了一条直线从A点到B点。
我想实现的是显示从这些点的正确途径。我猜测错误的是,它不承认任何节点要经过
有一个类似的问题也一直在问,我假设我有同样的问题,如果我没有解释我的问题很好。
类似的问题都可以在这里找到:<一href="http://stackoverflow.com/questions/14691901/osmdroid-routing-problems-when-following-a-tutorial">OSMDroid路由问题,下面的教程时
下面是我的code。使用RoadManager的一部分
这里是code的一部分。
尝试{
//获得当前longlat
gpsLocator.getLocation();
cur_loc_lat = gpsLocator.getLatitude();
cur_loc_long = gpsLocator.getLongitude();
}赶上(例外五){
// TODO:处理异常
}
// ---创建另外一个覆盖多标记
anotherOverlayItemArray =新的ArrayList&LT; OverlayItem&GT;();
anotherOverlayItemArray.add(新OverlayItem(
UST,UST,新的GeoPoint(testlat,testlong)));
// ---创建另外一个覆盖多标记
anotherOverlayItemArray.add(新OverlayItem(
locDefine [0],UST,新的GeoPoint(sel_latitude,sel_longitude)));
ItemizedIconOverlay&LT; OverlayItem&GT; anotherItemizedIconOverlay
=新ItemizedIconOverlay&LT; OverlayItem&GT;(
TomWalks.this,anotherOverlayItemArray,myOnItemGestureListener);
。myOpenMapView.getOverlays()加(anotherItemizedIconOverlay);
// ---
//添加比例尺
ScaleBarOverlay myScaleBarOverlay =新ScaleBarOverlay(TomWalks.this);
。myOpenMapView.getOverlays()加(myScaleBarOverlay);
尝试 {
通过道路管理者// 1路由
RoadManager roadManager =新MapQuestRoadManager();
roadManager.addRequestOption(routeType =行人);
/ *
roadManager.addRequestOption(单位=米);
roadManager.addRequestOption(narrativeType =文字);
roadManager.addRequestOption(shapeFormat =原始);
roadManager.addRequestOption(方向= 0);
* /
//然后,检索您的起点和终点之间的道路:
ArrayList的&LT;的GeoPoint&GT;航点=新的ArrayList&LT;的GeoPoint&GT;();
waypoints.add(新的GeoPoint(testlat,testlong));
waypoints.add(新的GeoPoint(sel_latitude,sel_longitude)); //终点
路路= roadManager.getRoad(航点);
//然后,建立与路径形状的叠加:
PathOverlay roadOverlay = RoadManager.buildRoadOverlay(公路,myOpenMapView.getContext());
roadOverlay.setColor(Color.GREEN);
//添加路由叠加到地图
。myOpenMapView.getOverlays()加(roadOverlay);
myOpenMapView.invalidate(); // refesh地图
最后的ArrayList&LT; ExtendedOverlayItem&GT; roadItems =
新的ArrayList&LT; ExtendedOverlayItem&GT;();
ItemizedOverlayWithBubble&LT; ExtendedOverlayItem&GT; roadNodes =
新ItemizedOverlayWithBubble&LT; ExtendedOverlayItem&GT;(TomWalks.this,roadItems,myOpenMapView);
。myOpenMapView.getOverlays()加(roadNodes);
myOpenMapView.invalidate(); // refesh地图
INT nodesize = road.mNodes.size();
双长度= road.mLength;
绘制对象标记= getResources()getDrawable(R.drawable.marker_node)。
Toast.makeText(TomWalks.this,距离+长度+节点:+ nodesize,Toast.LENGTH_SHORT).show();
的for(int i = 0; I&LT; road.mNodes.size();我++)
{
RoadNode节点= road.mNodes.get(ⅰ);
ExtendedOverlayItem nodeMarker =新ExtendedOverlayItem(步+ I,node.mLocation,TomWalks.this);
nodeMarker.setMarkerHotspot(OverlayItem.HotspotPlace.CENTER);
nodeMarker.setMarker(标记);
roadNodes.addItem(nodeMarker);
nodeMarker.setDescription(node.mInstructions);
nodeMarker.setSubDescription(road.getLengthDurationText(node.mLength,node.mDuration));
可绘制图标= getResources()getDrawable(R.drawable.marker_node)。
nodeMarker.setImage(图标);
} //结束
。myOpenMapView.getOverlays()加(roadNodes);
myOpenMapView.invalidate(); // refesh地图
}赶上(例外五){
// TODO:处理异常
Toast.makeText(TomWalks.this,e.getMessage(),Toast.LENGTH_SHORT).show();
}
myMapController.setCenter(新的GeoPoint(sel_latitude,sel_longitude));
}赶上(例外五){
// TODO:处理异常
}
}
}
}//===================================================================================================
我觉得这是更好地使用 AsyncTasks
在这种情况下:
/ **
*异步任务来获得一个单独的线程的道路。
* /
私有类UpdateRoadTask扩展的AsyncTask&LT;对象,太虚,道路与GT; {
保护路doInBackground(对象... PARAMS){
@燮pressWarnings(未登记)
ArrayList的&LT;的GeoPoint&GT;航点=(的ArrayList&其中;的GeoPoint&GT)PARAMS [0];
RoadManager roadManager =新OSRMRoadManager();
返回roadManager.getRoad(航点);
}
@覆盖
保护无效onPostExecute(路结果){
道路=结果;
//显示距离的道路和持续时间
Toast.makeText(getActivity(),距离=+ road.mLength,Toast.LENGTH_LONG).show();
Toast.makeText(getActivity(),绵延=+ road.mDuration,Toast.LENGTH_LONG).show();
如果(road.mStatus!= Road.STATUS_OK)
Toast.makeText(getActivity(),错误时加载的道路 - 状态=+ road.mStatus,Toast.LENGTH_SHORT).show();
折线roadOverlay = RoadManager.buildRoadOverlay(公路,getActivity());
map.getOverlays()加(roadOverlay)。
map.invalidate();
// updateUIWithRoad(结果);
}
}
然后把它叫做新UpdateRoadTask()执行(航点);
I am following a tutorial here https://code.google.com/p/osmbonuspack/wiki/Tutorial_1 but I have encountered an error that it doesn't show the correct route correctly. It just shows a straight line from Point A to Point B.
What I want to achieve is to show the correct route from these points. I'm guessing the error is that it doesn't recognize any nodes to go through.
A similar question has been also asked and I am assuming I have the same problem if I haven't explained my question well.
Similar question can be found here: OSMDroid Routing problems when following a tutorial
Here is a part of my code using RoadManager
Here is a part of the code.
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
}
}
}
}//===================================================================================================
I think it is better to use AsyncTasks
in this case:
/**
* 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);
}
}
then call it new UpdateRoadTask().execute(waypoints);
这篇关于RoadManager的osmdroid错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!