J2ME / Android / BlackBerry - indicazioni stradali, percorso tra due località


90

Su Android 1.0 c'era uno spazio dei nomi com.google.googlenav per le indicazioni stradali :
Route - Indicazioni stradali Google migliorate
Ma nel nuovo SDK è stato rimosso per qualche motivo ...
Android: DrivingDirections rimosso dall'API 1.0 - come farlo in 1.5 / 1.6? Su BlackBerry mancano anche le API per queste cose:
come trovare il percorso tra due posti in Blackberry?

csie-tw fornisce una soluzione alternativa (interrogare gmaps per il file kml e analizzarlo):
Android - Driving Direction (Route Path)
Anche Andrea ha creato un corso di aiuto DrivingDirections per Android.
Ho scritto un piccolo aiuto per questa funzionalità, in j2me, quindi vorrei condividere i miei campioni su Android e BlackBerry.

AGGIORNAMENTO
Come è stato affermato nei commenti, non sono ufficialmente consentiti i Termini di servizio delle API di Google Maps :

Termini di servizio delle API di Google Maps / Google Earth
Ultimo aggiornamento: 27 maggio 2009
...
10. Limitazioni della licenza. Ad eccezione di quanto espressamente consentito dai Termini, o salvo previa autorizzazione scritta da parte dell'utente da parte di Google (o, a seconda dei casi, dal fornitore di contenuti particolari), le licenze di Google di cui sopra sono soggette al rispetto di tutte le limitazioni di seguito. Ad eccezione di quanto esplicitamente consentito nella Sezione 7 o nella Documentazione delle API di Maps, non devi (né puoi consentire a nessun altro di):
...
10.9 utilizzare il Servizio o il Contenuto con prodotti, sistemi o applicazioni per o in connessione con:
a) navigazione in tempo reale o guida a destinazione, inclusa, a titolo esemplificativo ma non esaustivo, guida a destinazione passo passo sincronizzata con la posizione di un dispositivo abilitato al sensore dell'utente;

e potrebbe essere disabilitato per alcune app (in qualche modo, almeno su Android) ... Da Geocode scraping nella conversazione .NET :

Ciò non è consentito dai termini di utilizzo dell'API. Non dovresti raschiare Google Maps per generare codici geografici. Bloccheremo i servizi che eseguono query automatizzate dei nostri server.

Bret Taylor
Product Manager, Google Maps

Sarei grato per eventuali alternative e / o suggerimenti!
Grazie!


2
Immagino che raschiare le indicazioni stradali di Google Maps in questo modo possa non essere conforme ai Termini di utilizzo di Google.
Christopher Orr

Sto ottenendo tutti i punti in mRoad ma non sono mappati su MAP .. Il percorso visualizzato sulla MAP è solo da Jaipur a Delhi!
Vishal Khakhkhar

1
@Vishal: Scusa, ma non posso aiutarti! Si prega di inviare una domanda separata!
Maksym Gontar

Risposte:


115

J2ME Map Route Provider

maps.google.com dispone di un servizio di navigazione che può fornirti informazioni sul percorso in formato KML .

Per ottenere il file kml dobbiamo formare l'URL con le posizioni di inizio e di destinazione:

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

Successivamente dovrai analizzare xml (implementato con SAXParser) e riempire le strutture dati:

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 connessione di rete è implementata in modi diversi su Android e Blackberry, quindi dovrai prima formare l'URL:

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

quindi creare una connessione con questo URL e ottenere InputStream.
Quindi passare questo InputStream e ottenere la struttura dati analizzata:

 public static Road getRoute(InputStream is) 

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

Vedi il codice completo su J2MEMapRouteBlackBerryEx su Google Code

Android

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

Vedi il codice completo su J2MEMapRouteAndroidEx su Google Code



8
Questo codice non funzionerà più poiché Google si è fermato per fornire la risposta in formato KML. Ecco il link per la soluzione nella risposta alla domanda di Stack Overflow Perché il recupero di Google Directions per Android utilizzando i dati KML non funziona più?
kendrelaxman

1
Ecco la documentazione completa: developers.google.com/maps/documentation/directions
Alexey

La soluzione sopra non funziona più con l'API 2. Sono riuscito a tracciare un percorso tra due punti utilizzando l'API Android v2 di Google map. Ho pubblicato la sua soluzione a quel link. Risposta: Disegna il percorso tra due punti utilizzando l'API Android di Google Maps v2
Zeeshan Mirza
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.