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

90

Sur Android 1.0, il y avait un espace de noms com.google.googlenav pour les itinéraires routiers :
Route - Amélioration des itinéraires routiers Google
Mais dans le nouveau SDK, il a été supprimé pour une raison quelconque ...
Android: DrivingDirections supprimé depuis l'API 1.0 - comment le faire en 1.5 / 1,6? Sur BlackBerry, il manque également des API pour de telles choses:
comment trouver l'itinéraire entre deux endroits dans Blackberry?

CSIE-tw donne une solution de contournement (gmaps de requête pour le fichier kml et l' analyser):
Android - Direction Driving (Route Chemin)
Aussi Andrea a fait une DrivingDirections classes auxiliaires pour Android.
J'ai écrit une petite aide pour cette fonctionnalité, dans j2me, donc je voudrais partager mes échantillons sur Android et BlackBerry.

MISE
À JOUR Comme indiqué dans les commentaires, les conditions d'utilisation des API Google Maps ne sont pas officiellement autorisées :

Conditions d'utilisation de Google Maps / API Google Earth
Dernière mise à jour: 27 mai 2009
...
10. Restrictions de licence. Sauf dans les cas expressément autorisés par les Conditions, ou à moins que vous n'ayez reçu l'autorisation écrite préalable de Google (ou, le cas échéant, du fournisseur d'un Contenu particulier), les licences de Google ci-dessus sont soumises à votre adhésion à toutes les restrictions ci-dessous. Sauf dans les cas expressément autorisés dans la section 7 ou dans la documentation des API Maps, vous ne devez pas (ni ne pouvez autoriser quiconque à):
...
10.9 utiliser le service ou le contenu avec des produits, systèmes ou applications pour ou en relation avec:
(a) la navigation ou le guidage d'itinéraire en temps réel, y compris, mais sans s'y limiter, le guidage d'itinéraire virage par virage qui est synchronisé avec la position du dispositif à capteur d'un utilisateur;

et peut être désactivé pour certaines applications (en quelque sorte, au moins sur Android) ... À partir du scraping Geocode dans une conversation .NET :

Cela 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

Serait reconnaissant pour toutes les alternatives et / ou suggestions!
Merci!

Maksym Gontar
la source
2
J'imagine que le fait de parcourir des itinéraires routiers sur Google Maps comme celui-ci peut être contraire aux conditions d'utilisation de Google.
Christopher Orr
Je reçois tous les points dans mRoad mais ils ne sont pas cartographiés sur MAP .. Le chemin affiché sur la MAP va de Jaipur à Delhi uniquement!
Vishal Khakhkhar
1
@Vishal: Désolé, mais je ne peux pas aider avec ça! Veuillez poster une question distincte!
Maksym Gontar

Réponses:

115

Fournisseur d'itinéraire de carte J2ME

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

Pour obtenir le fichier kml, nous devons créer une 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 créer une URL:

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

puis créez une connexion avec cette URL et obtenez InputStream.
Passez ensuite ce InputStream et obtenez la 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

Capture d'écran Android G1

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

Maksym Gontar
la source
8
Ce code ne fonctionnera plus car Google s'est arrêté pour donner la réponse au format KML. Voici le lien pour la solution dans la réponse à la question Stack Overflow Pourquoi la récupération de Google Directions pour Android à l'aide de données KML ne fonctionne plus?
kendrelaxman
1
Voici la documentation complète: développeurs.google.com
maps
La solution ci-dessus ne fonctionne plus avec l'API 2. J'ai réussi à tracer un chemin entre deux points à l'aide de l'API Google map android v2. J'ai posté sa solution sur ce lien. Réponse: Tracez le chemin entre deux points à l'aide de l'API Google Maps Android v2
Zeeshan Mirza