Question

Il semble que DrivingDirections ait été supprimé depuis Android API 1.0

.

Quel est le chemin à suivre pour afficher une carte avec deux points (l'un d'entre eux peut être l'emplacement actuel, mais peut également être un autre emplacement) et la direction de l'un à l'autre dans Android 1.6?

Était-ce utile?

La solution

Je suppose que la solution consiste à souscrire une licence de TeleNav ou de quelqu'un de plusieurs millions de dollars.

La raison pour laquelle l'API a été retirée est que Google lui-même a des limites sur ce qu'il peut faire avec les indications routières (par exemple, il ne peut pas effectuer des tâches détaillées en temps réel), car Google attribue ces données à TeleNav ou à d'autres sociétés. À son tour, Google ne peut pas laisser les développeurs faire ces choses limitées, et une API ouverte ne peut pas être protégée de manière adéquate dans ce cas.

Je pensais avoir déjà mentionné que Open Street Map indiquait un itinéraire, FWIW.

Autres conseils

Si vous avez juste besoin du point connecté à une ligne, vous n’avez pas besoin du kml complet. Une méthode beaucoup plus rapide consiste simplement à utiliser le code JSON renvoyé par l'API Google Maps avec output = dragdir

.
private String getUrl(String start, String end) {
    //If params GeoPoint convert to lat,long string here
    StringBuffer urlString = new StringBuffer();
    urlString.append("http://maps.google.com/maps?f=d&hl=en");
    urlString.append("&saddr=");// from
    urlString.append(start);
    urlString.append("&daddr=");// to
    urlString.append(end);
    urlString.append("&ie=UTF8&0&om=0&output=dragdir"); //DRAGDIR RETURNS JSON
    Log.i("URLString", urlString.toString());
    return urlString.toString();
}

Cette chaîne urlString peut être utilisée pour obtenir un fichier JSON, que vous pouvez facilement extraire des informations à l'aide de la méthode split () de String

.
private String getConnection(String url) {
    URL inUrl = new URL(url);
    URLConnection yc = inUrl.openConnection();
    BufferedReader in = new BufferedReader( new InputStreamReader(yc.getInputStream()));
    String inputLine;
    String encoded = "";
    while ((inputLine = in.readLine()) != null)
        encoded = encoded.concat(inputLine);
    in.close();
    String polyline = encoded.split("points:")[1].split(",")[0];
    polyline = polyline.replace("\"", "");
    polyline = polyline.replace("\\\\", "\\");
    return polyline;
}

La chaîne renvoyée est une polyligne pouvant être décodée dans une liste de géopoints à l'aide de la méthode ci-dessous.

private static ArrayList<GeoPoint> decodePolyline(String encoded) {
    ArrayList<GeoPoint> geopoints = new ArrayList<GeoPoint>();
    int index = 0, len = encoded.length();
    int lat = 0, lng = 0;
    while (index < len) {
        int b, shift = 0, result = 0;
        do {
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lat += dlat;
        shift = 0;
        result = 0;
        do {
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lng += dlng;
        GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6));
        geopoints.add(p);
    }
 return geopoints;
}

La dernière étape consiste à dessiner ces points sur un mapView. Pour cela, nous avons besoin d’un élément de superposition qui gérera une liste de points géographiques.

public class PathOverlay extends Overlay {

    private ArrayList<GeoPoint> pointList;

    public PathOverlay(ArrayList<GeoPoint> pointList) {
            this.pointList = pointList;     
    }

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        Point current = new Point();
        Path path = new Path();
        Projection projection = mapView.getProjection();
        Iterator<GeoPoint> iterator = pointList.iterator();
        if (iterator.hasNext()) {
            projection.toPixels(iterator.next(), current);
            path.moveTo((float) current.x, (float) current.y);
        } else return;
        while(iterator.hasNext()) {
            projection.toPixels(iterator.next(), current);
            path.lineTo((float) current.x, (float) current.y);
        }

        Paint pathPaint = new Paint();
        pathPaint.setAntiAlias(true);
        pathPaint.setStrokeWidth(3.0f);
        pathPaint.setColor(Color.GREEN);
        pathPaint.setStyle(Style.STROKE);
        canvas.drawPath(path, pathPaint);
    }
}

Si vous n'êtes pas sûr de certaines étapes intermédiaires, telles que la mise en place de la superposition sur MapView ou la configuration d'une classe de routeur, faites-le moi savoir et je peux vous envoyer le code complet.

C’est peut-être un peu trop tard, mais cela reste utile pour les autres. J'ai écrit quelques classes simples pour obtenir et afficher des itinéraires dans MapView pour Android:

http://home.ameliemedia.com/android-app-aroundme/ # conseils

J'espère que ça aide!

Andrea.

La solution actuelle de Google consiste à utiliser les services Web de l'API Google Maps . . Gratuit pour un usage limité; vous devrez payer pour une utilisation commerciale (réussie).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top