J2ME/Android/BlackBerry - driving directions, route between two locations

前端 未结 1 1407
时光说笑
时光说笑 2020-11-22 03:19

On Android 1.0 there was a com.google.googlenav namespace for driving directions:
Route - Improved Google Driving Directions
But in newer SDK it was removed by some

相关标签:
1条回答
  • 2020-11-22 03:33

    J2ME Map Route Provider

    maps.google.com has a navigation service which can provide you route information in KML format.

    To get kml file we need to form url with start and destination locations:

    public static String getUrl(double fromLat, double fromLon,
                                double toLat, double toLon) {// connect to map web service
        StringBuffer urlString = new StringBuffer();
        urlString.append("http://maps.google.com/maps?f=d&hl=en");
        urlString.append("&saddr=");// from
        urlString.append(Double.toString(fromLat));
        urlString.append(",");
        urlString.append(Double.toString(fromLon));
        urlString.append("&daddr=");// to
        urlString.append(Double.toString(toLat));
        urlString.append(",");
        urlString.append(Double.toString(toLon));
        urlString.append("&ie=UTF8&0&om=0&output=kml");
        return urlString.toString();
    }
    

    Next you will need to parse xml (implemented with SAXParser) and fill data structures:

    public class Point {
        String mName;
        String mDescription;
        String mIconUrl;
        double mLatitude;
        double mLongitude;
    }
    
    public class Road {
        public String mName;
        public String mDescription;
        public int mColor;
        public int mWidth;
        public double[][] mRoute = new double[][] {};
        public Point[] mPoints = new Point[] {};
    }
    

    Network connection is implemented in different ways on Android and Blackberry, so you will have to first form url:

     public static String getUrl(double fromLat, double fromLon,
         double toLat, double toLon)
    

    then create connection with this url and get InputStream.
    Then pass this InputStream and get parsed data structure:

     public static Road getRoute(InputStream is) 
    

    Full source code RoadProvider.java

    BlackBerry

    class MapPathScreen extends MainScreen {
        MapControl map;
        Road mRoad = new Road();
        public MapPathScreen() {
            double fromLat = 49.85, fromLon = 24.016667;
            double toLat = 50.45, toLon = 30.523333;
            String url = RoadProvider.getUrl(fromLat, fromLon, toLat, toLon);
            InputStream is = getConnection(url);
            mRoad = RoadProvider.getRoute(is);
            map = new MapControl();
            add(new LabelField(mRoad.mName));
            add(new LabelField(mRoad.mDescription));
            add(map);
        }
        protected void onUiEngineAttached(boolean attached) {
            super.onUiEngineAttached(attached);
            if (attached) {
                map.drawPath(mRoad);
            }
        }
        private InputStream getConnection(String url) {
            HttpConnection urlConnection = null;
            InputStream is = null;
            try {
                urlConnection = (HttpConnection) Connector.open(url);
                urlConnection.setRequestMethod("GET");
                is = urlConnection.openInputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return is;
        }
    }
    

    See full code on J2MEMapRouteBlackBerryEx on Google Code

    Android

    Android G1 screenshot

    public class MapRouteActivity extends MapActivity {
        LinearLayout linearLayout;
        MapView mapView;
        private Road mRoad;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            mapView = (MapView) findViewById(R.id.mapview);
            mapView.setBuiltInZoomControls(true);
            new Thread() {
                @Override
                public void run() {
                    double fromLat = 49.85, fromLon = 24.016667;
                    double toLat = 50.45, toLon = 30.523333;
                    String url = RoadProvider
                            .getUrl(fromLat, fromLon, toLat, toLon);
                    InputStream is = getConnection(url);
                    mRoad = RoadProvider.getRoute(is);
                    mHandler.sendEmptyMessage(0);
                }
            }.start();
        }
    
        Handler mHandler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                TextView textView = (TextView) findViewById(R.id.description);
                textView.setText(mRoad.mName + " " + mRoad.mDescription);
                MapOverlay mapOverlay = new MapOverlay(mRoad, mapView);
                List<Overlay> listOfOverlays = mapView.getOverlays();
                listOfOverlays.clear();
                listOfOverlays.add(mapOverlay);
                mapView.invalidate();
            };
        };
    
        private InputStream getConnection(String url) {
            InputStream is = null;
            try {
                URLConnection conn = new URL(url).openConnection();
                is = conn.getInputStream();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return is;
        }
        @Override
        protected boolean isRouteDisplayed() {
            return false;
        }
    }
    

    See full code on J2MEMapRouteAndroidEx on Google Code

    0 讨论(0)
提交回复
热议问题