J2ME / Android / BlackBerry - wskazówki dojazdu, trasa między dwoma lokalizacjami

90

W Androidzie 1.0 istniała przestrzeń nazw com.google.googlenav dla wskazówek dojazdu:
Trasa - Ulepszone wskazówki dojazdu Google
Ale w nowszym SDK został z jakiegoś powodu usunięty ...
Android: DrivingDirections usunięty od API 1.0 - jak to zrobić w 1.5 / 1,6? Na BlackBerry brakuje też API dla takich rzeczy:
jak znaleźć trasę między dwoma miejscami w Blackberry?

csie-tw daje obejście tego problemu (odpytuje gmapy o plik kml i analizuje go):
Android - Kierunek jazdy (ścieżka trasy)
Również Andrea stworzyła klasy pomocnicze DrivingDirections dla Androida.
Napisałem małego pomocnika do tej funkcjonalności, w j2me, więc chciałbym udostępnić moje próbki na Androida i BlackBerry.

AKTUALIZACJA
Jak stwierdzono w komentarzach, oficjalnie nie jest dozwolone Warunki korzystania z interfejsów API Map Google :

Warunki korzystania z usług interfejsów API Map Google / Google Earth
Ostatnia aktualizacja: 27 maja 2009 r
...
10. Ograniczenia licencji. Z wyjątkiem przypadków wyraźnie dozwolonych w Warunkach lub jeśli użytkownik nie otrzymał wcześniejszej pisemnej zgody od Google (lub, w stosownych przypadkach, od dostawcy określonej Treści), powyższe licencje Google podlegają obowiązkowi przestrzegania wszystkich poniższych ograniczeń. Z wyjątkiem przypadków wyraźnie dozwolonych w Sekcji 7 lub Dokumentacji interfejsów API Map, Użytkownikowi nie wolno (ani nie wolno nikomu zezwalać na to):
...
10.9 korzystać z Usługi lub Treści z jakimikolwiek produktami, systemami lub aplikacjami do lub w związku z:
a) nawigacja w czasie rzeczywistym lub prowadzenie po trasie, w tym między innymi szczegółowe wskazówki dotyczące trasy, które są zsynchronizowane z pozycją urządzenia z czujnikami użytkownika;

i może być wyłączone dla niektórych aplikacji (w jakiś sposób, przynajmniej na Androidzie) ... Od skrobania geokodu w rozmowie .NET :

Nie jest to dozwolone w warunkach użytkowania interfejsu API. Nie powinieneś zeskrobać Map Google w celu generowania geokodów. Zablokujemy usługi, które wykonują zautomatyzowane zapytania naszych serwerów.

Bret Taylor
Product Manager, Google Maps

Byłbym wdzięczny za wszelkie alternatywy i / lub sugestie!
Dzięki!

Maksym Gontar
źródło
2
Wyobrażam sobie, że skrobanie wskazówek dojazdu do Map Google w ten sposób może naruszać Warunki korzystania z Google.
Christopher Orr,
Otrzymuję wszystkie punkty w mRoad, ale nie są one mapowane na MAPIE .. Ścieżka wyświetlana na mapie to tylko z Jaipur do Delhi!
Vishal Khakhkhar,
1
@Vishal: Przepraszam, ale nie mogę w tym pomóc! Napisz osobne pytanie!
Maksym Gontar

Odpowiedzi:

115

Dostawca trasy mapy J2ME

maps.google.com udostępnia usługę nawigacyjną, która dostarcza informacje o trasie w formacie KML .

Aby pobrać plik kml, musimy utworzyć adres URL z lokalizacją początkową i docelową:

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

Następnie będziesz musiał przeanalizować xml (zaimplementowany w SAXParser) i wypełnić struktury danych:

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

Połączenie sieciowe jest realizowane na różne sposoby na Androidzie i Blackberry, więc najpierw będziesz musiał utworzyć adres URL:

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

następnie utwórz połączenie z tym adresem URL i pobierz InputStream.
Następnie przekaż ten InputStream i uzyskaj przeanalizowaną strukturę danych:

 public static Road getRoute(InputStream is) 

Pełny kod źródłowy RoadProvider.java

Jeżyna

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

Zobacz pełny kod na J2MEMapRouteBlackBerryEx w Google Code

Android

Zrzut ekranu z Androida 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;
    }
}

Zobacz pełny kod na J2MEMapRouteAndroidEx w Google Code

Maksym Gontar
źródło
8
Ten kod nie będzie już działać, ponieważ Google przestało udzielać odpowiedzi w formacie KML. Oto link do rozwiązania w odpowiedzi na pytanie o przepełnienie stosu. Dlaczego pobieranie wskazówek Google dla systemu Android przy użyciu danych KML już nie działa?
kendrelaxman
1
Oto pełna dokumentacja: developers.google.com/maps/documentation/directions
Alexey
Powyższe rozwiązanie nie działa już z API 2. Udało mi się narysować ścieżkę między dwoma punktami za pomocą Google map android API v2. Opublikowałem jego rozwiązanie pod tym linkiem. Odpowiedź: Narysuj ścieżkę między dwoma punktami za pomocą Google Maps Android API v2
Zeeshan Mirza