Domanda

Sembra che DrivingDirections sia stato rimosso dall'API Android 1.0

Qual è il modo adesso di visualizzare una mappa con due punti (uno potrebbe essere la posizione corrente, ma può anche essere qualsiasi altra posizione) e la direzione da uno all'altro in Android 1.6?

È stato utile?

Soluzione

Sospetto che la risposta sia iscriversi a una licenza multimilionaria di TeleNav o di qualcuno.

Il motivo per cui l'API è stata estratta è stato il fatto che Google stesso ha dei limiti su ciò che può fare con le indicazioni stradali (ad es., non può fare cose svolta in curva in tempo reale), poiché Google concede in licenza questi dati da TeleNav o da altre aziende. Google, a sua volta, non può permettere agli sviluppatori di fare quelle cose limitate e un'API aperta non può essere adeguatamente protetta per questo caso.

Pensavo di aver visto menzionare che Open Street Map ha indicazioni stradali, FWIW.

Altri suggerimenti

Se hai solo bisogno del punto collegato con una linea non hai bisogno del kml completo. Un modo molto più veloce per farlo è semplicemente usare il JSON restituito dall'API di Google Maps con 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();
}

Questo urlString può essere usato per ottenere un file JSON, che puoi facilmente estrarre le informazioni usando String's split ()

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 stringa restituita è una polilinea che può essere decodificata in un elenco di punti geografici utilizzando il metodo seguente.

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

L'ultimo passo è disegnare questi punti su una mapView, per questo abbiamo bisogno di un elemento overlay che gestirà un ArrayList di GeoPoints.

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

Se non sei sicuro di alcuni dei passaggi intermedi, come come ottenere l'overlay su MapView o come impostare una classe di router fammi sapere e posso inviarti il ??codice completo.

Forse un po 'troppo tardi, ma comunque utile per gli altri. Ho scritto alcune semplici lezioni per ottenere e visualizzare indicazioni stradali in MapView per Android:

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

Spero che sia d'aiuto!

Andrea.

La soluzione attuale di Google è utilizzare Servizi Web dell'API di Google Maps . Gratuito per uso limitato; dovrai pagare per un utilizzo commerciale (riuscito).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top