J2ME / Android / BlackBerry - Wegbeschreibungen, Route zwischen zwei Standorten

90

Unter Android 1.0 gab es einen com.google.googlenav-Namespace für Wegbeschreibungen:
Route - Verbesserte Google-Wegbeschreibungen
Aber im neueren SDK wurde er aus irgendeinem Grund entfernt ...
Android: DrivingDirections seit API 1.0 entfernt - Vorgehensweise in 1.5 / 1,6? Auf BlackBerry fehlen auch APIs für solche Dinge:
Wie finde ich die Route zwischen zwei Orten in Blackberry?

csie-tw bietet eine Problemumgehung (gmaps für kml-Datei abfragen und analysieren):
Android - Fahrtrichtung ( Routenpfad )
Auch Andrea hat eine DrivingDirections-Hilfsklasse für Android erstellt.
Ich habe in j2me einen kleinen Helfer für diese Funktionalität geschrieben, daher möchte ich meine Beispiele auf Android und BlackBerry teilen.

UPDATE
Wie in den Kommentaren angegeben, sind die Nutzungsbedingungen für Google Maps APIs offiziell nicht zulässig :

Nutzungsbedingungen für Google Maps / Google Earth-APIs
Letzte Aktualisierung: 27. Mai 2009
...
10. Lizenzbeschränkungen. Sofern dies nicht ausdrücklich in den Nutzungsbedingungen gestattet ist oder Sie keine vorherige schriftliche Genehmigung von Google (oder gegebenenfalls vom Anbieter bestimmter Inhalte) erhalten haben, unterliegen die oben genannten Lizenzen von Google der Einhaltung aller nachstehenden Einschränkungen. Sofern dies nicht ausdrücklich in Abschnitt 7 oder in der Dokumentation zu den Karten-APIs gestattet ist, dürfen Sie: (oder dürfen Sie dies auch keinem anderen gestatten):
...
10.9 den Dienst oder Inhalt mit Produkten, Systemen oder Anwendungen für oder in Verbindung mit:
(a) Echtzeitnavigation oder Routenführung, einschließlich, aber nicht beschränkt auf Turn-by-Turn-Routenführung, die mit der Position des sensorgestützten Geräts eines Benutzers synchronisiert ist;

und kann für bestimmte Apps deaktiviert sein (zumindest auf Android) ... Vom Geocode-Scraping in .NET-Konversation :

Dies ist in den Nutzungsbedingungen der API nicht zulässig. Sie sollten Google Maps nicht kratzen, um Geocodes zu generieren. Wir werden Dienste blockieren, die automatisierte Abfragen unserer Server durchführen.

Bret Taylor
Produktmanager, Google Maps

Wäre dankbar für Alternativen und / oder Vorschläge!
Vielen Dank!

Maksym Gontar
quelle
2
Ich stelle mir vor, dass das Scrapen von Google Maps-Wegbeschreibungen wie diesen möglicherweise gegen die Nutzungsbedingungen von Google verstößt.
Christopher Orr
Ich bekomme alle Punkte in mRoad, aber sie werden nicht auf MAP abgebildet. Der auf der MAP angezeigte Pfad führt nur von Jaipur nach Delhi!
Vishal Khakhkhar
1
@ Vishal: Sorry, aber ich kann nicht helfen! Bitte separate Frage stellen!
Maksym Gontar

Antworten:

115

J2ME Map Route Provider

maps.google.com verfügt über einen Navigationsdienst, mit dem Sie Routeninformationen im KML- Format bereitstellen können .

Um eine kml-Datei zu erhalten, müssen wir eine URL mit Start- und Zielpositionen erstellen:

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

Als nächstes müssen Sie XML (implementiert mit SAXParser) analysieren und Datenstrukturen füllen:

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[] {};
}

Die Netzwerkverbindung wird auf Android und Blackberry auf unterschiedliche Weise implementiert, daher müssen Sie zuerst die URL bilden:

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

Stellen Sie dann eine Verbindung mit dieser URL her und rufen Sie InputStream ab.
Übergeben Sie dann diesen InputStream und erhalten Sie die analysierte Datenstruktur:

 public static Road getRoute(InputStream is) 

Vollständiger Quellcode RoadProvider.java

Brombeere

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

Den vollständigen Code finden Sie in J2MEMapRouteBlackBerryEx in Google Code

Android

Android G1 Screenshot

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

Den vollständigen Code finden Sie in J2MEMapRouteAndroidEx in Google Code

Maksym Gontar
quelle
8
Dieser Code funktioniert nicht mehr, da Google angehalten hat, um die Antwort im KML-Format zu geben. Hier ist der Link für die Lösung in der Antwort auf die Frage zum Stapelüberlauf. Warum funktioniert das Abrufen von Google Directions für Android mithilfe von KML-Daten nicht mehr?
Kendrelaxman
1
Hier ist die vollständige Dokumentation: developer.google.com/maps/documentation/directions
Alexey
Die obige Lösung funktioniert nicht mehr mit API 2. Ich habe es geschafft, mit der Google Map Android API v2 einen Pfad zwischen zwei Punkten zu zeichnen. Ich habe die Lösung unter diesem Link veröffentlicht. Antwort: Zeichnen Sie einen Pfad zwischen zwei Punkten mit Google Maps Android API v2
Zeeshan Mirza