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!
źródło
Odpowiedzi:
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
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
źródło