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

90

En Android 1.0 había un espacio de nombres com.google.googlenav para direcciones de manejo:
Ruta - Direcciones de manejo de Google mejoradas
Pero en el SDK más nuevo se eliminó por alguna razón ...
Android: DrivingDirections eliminado desde API 1.0 - cómo hacerlo en 1.5 / 1.6? En BlackBerry también faltan API para este tipo de 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 de ruta)
También Andrea hizo clases de ayuda de DrivingDirections para Android.
Escribí un pequeño ayudante para esta funcionalidad, en j2me, así que me gustaría compartir mis muestras en Android y BlackBerry.

ACTUALIZACIÓN
Como se indicó en los comentarios, no está permitido oficialmente los Términos 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, oa menos que haya recibido una autorización previa por escrito de Google (o, según corresponda, del proveedor de Contenido en 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 Maps, no debe (ni puede permitir que nadie más):
...
10.9 use el Servicio o Contenido con ningún producto, sistema o aplicación para o en conexión con:
(a) navegación en tiempo real o guía de ruta, que incluye, entre otros, guía de ruta paso a paso que está sincronizada con la posición del dispositivo habilitado por sensores de un usuario;

y puede estar deshabilitado para ciertas aplicaciones (de alguna manera, al menos en Android) ... De Geocode scraping en una 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 automatizadas de nuestros servidores.

Bret Taylor
Product Manager, Google Maps

¡Agradecería cualquier alternativa y / o sugerencia!
¡Gracias!

Maksym Gontar
fuente
2
Me imagino que raspar las direcciones de conducción de Google Maps como este puede ser una infracción de los Términos de uso de Google.
Christopher Orr
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
1
@Vishal: Lo siento, ¡pero no puedo ayudar con eso! ¡Publique una pregunta separada!
Maksym Gontar

Respuestas:

115

Proveedor de ruta del 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á crear 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 J2MEMapRouteBlackBerryEx en Google Code

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 J2MEMapRouteAndroidEx en Google Code

Maksym Gontar
fuente
8
Este código ya no funcionará porque Google se ha detenido para dar la respuesta en formato KML. Aquí está el enlace para la solución en la respuesta a la pregunta de Stack Overflow ¿ Por qué ya no funciona la recuperación de Google Directions para Android usando datos KML?
kendrelaxman
1
Aquí está la documentación completa: developers.google.com/maps/documentation/directions
Alexey
La solución anterior ya no funciona con API 2. Me las arreglé para dibujar una ruta entre dos puntos usando la API de Android v2 del mapa de Google. Publiqué su solución en ese enlace. Respuesta: Dibuje una ruta entre dos puntos usando la API de Android de Google Maps v2
Zeeshan Mirza