J2ME/Android/BlackBerry: indicaciones de conducción, ruta entre dos ubicaciones

6 minutos de lectura

J2MEAndroidBlackBerry indicaciones de conduccion ruta entre dos ubicaciones
Maksim Gontar

En Android 1.0 había un espacio de nombres com.google.googlenav para las indicaciones de manejo:
Ruta – Direcciones de conducción de Google mejoradas

Pero en el SDK más nuevo se eliminó por algún motivo…
Android: DrivingDirections eliminado desde API 1.0: ¿cómo hacerlo en 1.5/1.6? En BlackBerry también faltan API para tales cosas:
¿Cómo encontrar la ruta entre dos lugares en Blackberry?

csie-tw ofrece una solución alternativa (consultar gmaps para el archivo kml y analizarlo):
Android: dirección de conducción (ruta)

También Andrea hizo un Clases auxiliares de DrivingDirections para Android.
Escribí un pequeño ayudante para esta funcionalidad, en j2me, así que me gustaría compartir mis ejemplos en Android y BlackBerry.

ACTUALIZAR

Como se indicó en los comentarios, no está permitido oficialmente. Condiciones de servicio de las API de Google Maps :

Condiciones de servicio de las API de Google Maps/Google Earth
Última actualización: 27 de mayo de 2009

10. Restricciones de licencia. Salvo que se permita expresamente en los Términos, o a menos que haya recibido una autorización previa por escrito de Google (o, según corresponda, del proveedor de Contenido particular), las licencias de Google anteriores están sujetas a su cumplimiento de todas las restricciones a continuación. Salvo que se permita explícitamente en la Sección 7 o en la Documentación de las API de Google Maps, usted no debe (ni puede permitir que nadie más lo haga):

10.9 usar el Servicio o el Contenido con cualquier producto, sistema o aplicación para o en relación con:
(a) navegación en tiempo real o guía de ruta, incluida, entre otras, guía de ruta paso a paso que se sincroniza con la posición del dispositivo con sensor del usuario;

y puede estar deshabilitado para ciertas aplicaciones (de alguna manera, al menos en Android)… Desde Raspado de geocodificación en conversación .NET:

Esto no está permitido por los términos de uso de la API. No debe raspar Google Maps para generar códigos geográficos. Bloquearemos los servicios que realizan consultas automáticas de nuestros servidores.

bret taylor
Gerente de Producto, Google Maps

¡Estaría agradecido por cualquier alternativa y / o sugerencia!
¡Gracias!

  • Me imagino que raspar las direcciones de conducción de Google Maps como esta puede infringir los Términos de uso de Google.

    – Christopher Orr

    9 de enero de 2010 a las 11:37

  • Estoy obteniendo todos los puntos en mRoad pero no están mapeados en MAP. ¡La ruta que se muestra en el MAP es solo de Jaipur a Delhi!

    – Vishal Khakhkhar

    21 de febrero de 2011 a las 7:24

  • @Vishal: ¡Lo siento, pero no puedo ayudar con eso! ¡Por favor publique una pregunta por separado!

    – Maksim Gontar

    22 de febrero de 2011 a las 8:43

J2MEAndroidBlackBerry indicaciones de conduccion ruta entre dos ubicaciones
Maksim Gontar

Proveedor de ruta de mapa J2ME

maps.google.com tiene un servicio de navegación que puede proporcionarle información de ruta en KML formato.

Para obtener el archivo kml, necesitamos formar una URL con las ubicaciones de inicio y destino:

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

A continuación, deberá analizar xml (implementado con SAXParser) y completar las estructuras de datos:

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 conexión de red se implementa de diferentes maneras en Android y Blackberry, por lo que primero deberá formar la URL:

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

luego cree una conexión con esta url y obtenga InputStream.
Luego pase este InputStream y obtenga la estructura de datos analizada:

 public static Road getRoute(InputStream is) 

código fuente completo RoadProvider.java

Mora

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

Ver código completo en J2MEMapaRutaBlackBerryEx en el código de Google

Androide

Captura de pantalla de 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;
    }
}

Ver código completo en J2MEMapaRutaAndroidEx en el código de Google

  • code.google.com/intl/uk-UA/android/add-ons/google-apis/…

    – Maksim Gontar

    2 de abril de 2010 a las 10:34


  • Este código ya no funcionará porque Google dejó de dar la respuesta en formato KML. Aquí está el enlace para la solución en la respuesta a la pregunta de desbordamiento de pila ¿Por qué ya no funciona la recuperación de Direcciones de Google para Android usando datos KML?

    – kendrelaxman

    9 de agosto de 2012 a las 9:29


  • Aquí está la documentación completa: developers.google.com/maps/documentation/directions

    – Alexei

    12 de septiembre de 2012 a las 6:44

  • La solución anterior ya no funciona con API 2. Logré dibujar una ruta entre dos puntos usando Google Map android API v2. Publiqué su solución en ese enlace. Respuesta: Dibuje la ruta entre dos puntos usando Google Maps Android API v2

    – Zeeshan Mirza

    12 de marzo de 2013 a las 7:09

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad