web-dev-qa-db-fra.com

J2ME / Android / BlackBerry - itinéraire, itinéraire entre deux endroits

Sur Android 1.0, il existait un espace de noms com.google.googlenav pour les itinéraires:
Itinéraire - Instructions routières améliorées de Google
Mais dans le plus récent SDK, il a été supprimé pour une raison quelconque ...
Android: DrivingDirections supprimé depuis API 1.0 - comment le faire dans 1.5/1.6? Sur BlackBerry, il manque également des API pour ce type de matériel:
comment trouver la route entre deux endroits de Blackberry?

csie-tw donne une solution de contournement (recherchez des cartes gmaps pour le fichier kml et analysez-le):
Android - Conduite (itinéraire)
Aussi Andrea a créé un classes d'assistance DrivingDirections pour Android.
J'ai écrit un petit assistant pour cette fonctionnalité, en j2me, donc je voudrais partager mes échantillons sur Android et BlackBerry.

[~ # ~] met à jour [~ # ~]
Comme indiqué dans les commentaires, il n'est pas officiellement autorisé Conditions d'utilisation du service API de Google Maps :

Conditions d'utilisation des API Google Maps/Google Earth
Dernière mise à jour: le 27 mai 2009
...
dix. Restrictions de licence. Sauf autorisation expresse des présentes Conditions ou si vous n'avez pas reçu l'autorisation écrite préalable de Google (ou, le cas échéant, du fournisseur de Contenu particulier), les licences de Google ci-dessus sont soumises à votre adhésion à toutes les restrictions ci-dessous. Sauf autorisation expresse dans la Section 7 ou dans la documentation de Maps APIs, vous ne devez (et ne pouvez autoriser personne d'autre):
...
10.9 utiliser le Service ou le Contenu avec des produits, systèmes ou applications pour ou en relation avec:
(a) navigation en temps réel ou guidage d'itinéraire, y compris, sans toutefois s'y limiter, le guidage d'itinéraire pas à pas qui est synchronisé avec la position du dispositif activé par le capteur de l'utilisateur;

et peut être désactivé pour certaines applications (au moins sur Android) ... De grattage de géocodes dans une conversation .NET :

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

Bret Taylor
Chef de produit, Google Maps

Je serais reconnaissant pour toute alternative et/ou suggestion!
Merci!

90
Maksym Gontar

J2ME Map Route Provider

maps.google.com dispose d'un service de navigation qui peut vous fournir des informations sur les itinéraires au format KML .

Pour obtenir le fichier kml, nous devons créer 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 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 réseau est implémentée de différentes manières sur Android et Blackberry, vous devrez donc d’abord former l’URL:

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

créez ensuite une connexion avec cette URL et obtenez InputStream.
Ensuite, passez ce InputStream et obtenez une structure de données analysée:

 public static Road getRoute(InputStream is) 

Code source complet RoadProvider.Java

La mûre

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

116
Maksym Gontar