91 votes

J2ME/Android/BlackBerry - itinéraires routiers, itinéraire entre deux lieux

Sur Android 1.0, il existait un espace de noms com.google.googlenav pour les indications routières :
Itinéraire - Amélioration de l'itinéraire Google
Mais dans le SDK plus récent, elle a été supprimée pour une raison quelconque...
Android : DrivingDirections supprimé depuis l'API 1.0 - comment le faire dans 1.5/1.6 ? Sur BlackBerry, il n'y a pas non plus d'API pour ce genre de choses :
Comment trouver l'itinéraire entre deux endroits dans Blackberry ?

csie-tw propose une solution de contournement (demander à gmaps de rechercher un fichier kml et de l'analyser) :
Android - Instructions de conduite (Route Path)
En outre Andrea a fait un Classes d'aide DrivingDirections pour Android.
J'ai écrit une petite aide pour cette fonctionnalité, en j2me, et j'aimerais donc partager mes exemples sur Android et BlackBerry.

MISE À JOUR
Comme indiqué dans les commentaires, ce n'est pas officiellement autorisé. Conditions d'utilisation des API de Google Maps :

Conditions d'utilisation de Google Maps/Google Earth APIs
Dernière mise à jour : 27 mai 2009
...
10. Restrictions de licence. Sauf autorisation expresse des Conditions, ou sauf autorisation écrite préalable de Google (ou, le cas échéant, du fournisseur d'un Contenu particulier), les licences accordées par Google ci-dessus sont soumises au respect de l'ensemble des restrictions ci-dessous. Sauf autorisation explicite dans la section 7 ou dans la documentation Maps APIs, vous ne devez pas (et vous ne pouvez pas autoriser quelqu'un d'autre à) :
...
10.9 utiliser le service ou le contenu avec des produits, des systèmes ou des applications pour ou en relation avec :
(a) la navigation en temps réel ou le guidage routier, y compris, mais sans s'y limiter, le guidage routier virage par virage synchronisé avec la position de l'appareil doté de capteurs de l'utilisateur ;

et peut être désactivé pour certaines applications (d'une manière ou d'une autre, du moins sur Android)... A partir de Le grattage de géocode dans la conversation .NET :

Ceci n'est pas autorisé par les conditions d'utilisation de l'API. Vous ne devez pas récupérer les données de Google Maps pour générer des géocodes. Nous bloquerons les services qui font des requêtes automatisées sur nos serveurs.

Bret Taylor
Chef de produit, Google Maps

Nous vous serions reconnaissants pour toute alternative et/ou suggestion !
Merci de votre attention !

2 votes

J'imagine que le fait de récupérer les itinéraires de Google Maps de cette manière pourrait être contraire aux conditions d'utilisation de Google.

0 votes

Je reçois tous les points dans mRoad mais ils ne sont pas affichés sur MAP Le chemin affiché sur la carte va de Jaipur à Delhi uniquement !

1 votes

@Vishal : Désolé, mais je ne peux pas vous aider ! Veuillez poser une question distincte !

115voto

Max Gontar Points 20410

J2ME Map Route Provider (fournisseur d'itinéraires cartographiques)

maps.google.com dispose d'un service de navigation qui peut vous fournir des informations sur l'itinéraire à suivre. KML format.

Pour obtenir un fichier kml, nous devons formuler l'url avec les emplacements de départ et de destination :

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();
}

Ensuite, vous devrez analyser le xml (implémenté avec SAXParser) et remplir les structures de données :

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[] {};
}

La connexion au réseau est implémentée de manière différente sur Android et Blackberry, vous devrez donc d'abord former l'url :

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

puis créer une connexion avec cette url et obtenir InputStream.
Passez ensuite cet InputStream et obtenez la structure de données analysée :

 public static Road getRoute(InputStream is) 

Code source complet 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;
    }
}

Voir le code complet sur J2MEMapRouteBlackBerryEx sur 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;
    }
}

Voir le code complet sur J2MEMapRouteAndroidEx sur Google Code

2 votes

8 votes

Ce code ne fonctionnera plus car Google a cessé de fournir la réponse au format KML. Voici le lien pour la solution dans la réponse à la question de Stack Overflow Pourquoi la récupération des itinéraires Google pour Android à l'aide de données KML ne fonctionne-t-elle plus ?

1 votes

Voici la documentation complète : developers.google.com/maps/documentation/directions

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X