RoadManager的osmdroid错误 [英] RoadManager for osmdroid error

查看:598
本文介绍了RoadManager的osmdroid错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我下面的教程在这里 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆