Pregunta

Parece que DrivingDirections se han eliminado desde Android API 1.0

¿Cuál es la forma ahora de mostrar un mapa con dos puntos (uno de ellos puede ser la ubicación actual, pero también puede ser cualquier otra ubicación) y la dirección de uno a otro en Android 1.6?

¿Fue útil?

Solución

Sospecho que la respuesta es registrarse para obtener una licencia multimillonaria de TeleNav o alguien.

La razón por la que se retiró la API fue porque la propia Google tiene limitaciones en cuanto a lo que puede hacer con las indicaciones de manejo (por ejemplo, no puede hacer cosas paso a paso en tiempo real), ya que Google licencia estos datos de TeleNav u otras firmas. Google, a su vez, no puede permitir que los desarrolladores hagan esas cosas restringidas, y una API abierta no puede ser protegida adecuadamente para este caso.

Pienso que vi que Open Street Map tiene indicaciones para llegar en automóvil, FWIW.

Otros consejos

Si solo necesita el punto conectado con una línea, no necesita el kml completo. Una forma mucho más rápida de hacerlo es simplemente usar el JSON devuelto por la API de 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();
}

Esta urlString se puede usar para obtener un archivo JSON, del cual puedes extraer fácilmente la información usando la división 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 cadena devuelta es una polilínea que se puede decodificar en una lista de Geopoints usando el método a continuación.

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

El último paso es dibujar estos puntos en un mapView, para eso necesitamos un elemento de superposición que manejará un ArrayList de 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);
    }
}

Si no está seguro acerca de algunos de los pasos intermedios, por ejemplo, cómo obtener la superposición en el MapView o cómo configurar una clase de enrutador, hágamelo saber y puedo enviarle el código completo.

Tal vez un poco tarde, pero sigue siendo útil para otros. He escrito algunas clases sencillas para obtener y mostrar indicaciones de manejo en MapView para Android:

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

Espero que ayude!

Andrea.

La solución actual de Google es utilizar Servicios web del API de Google Maps . Gratis para uso limitado; Tendrá que pagar por el uso comercial (exitoso).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top