J2ME / Android / BlackBerry - petunjuk arah mengemudi, rute antara dua lokasi

90

Di Android 1.0 ada ruang nama com.google.googlenav untuk petunjuk arah mengemudi:
Rute - Arah Mengemudi Google yang Ditingkatkan
Tetapi di SDK yang lebih baru, itu dihapus karena beberapa alasan ...
Android: DrivingDirections dihapus sejak API 1.0 - bagaimana melakukannya di 1.5 / 1.6? Di BlackBerry juga ada kekurangan API untuk hal-hal seperti:
bagaimana cara menemukan rute antara dua tempat di Blackberry?

csie-tw memberikan solusi (query gmaps untuk file kml dan parse):
Android - Driving Direction (Route Path)
Juga Andrea membuat kelas pembantu DrivingDirections untuk Android.
Saya menulis sedikit bantuan untuk fungsi ini, di j2me, jadi saya ingin membagikan sampel saya di Android dan BlackBerry.

PERBARUI
Seperti yang dinyatakan dalam komentar, ini tidak diizinkan secara resmi. Persyaratan Layanan Google Maps API :

Persyaratan Layanan Google Maps / Google Earth API
Terakhir diperbarui: 27 Mei 2009
...
10. Pembatasan Lisensi. Kecuali jika diizinkan secara tersurat menurut Persyaratan, atau kecuali Anda telah menerima otorisasi tertulis sebelumnya dari Google (atau, sebagaimana berlaku, dari penyedia Konten tertentu), lisensi Google di atas tunduk pada kepatuhan Anda terhadap semua pembatasan di bawah ini. Kecuali jika diizinkan secara eksplisit dalam Bagian 7 atau Maps APIs Documentation, Anda tidak boleh (Anda juga tidak boleh mengizinkan orang lain untuk):
...
10.9 menggunakan Layanan atau Konten dengan produk, sistem, atau aplikasi apa pun untuk atau sehubungan dengan:
(a) panduan navigasi atau rute waktu nyata, termasuk namun tidak terbatas pada panduan rute belokan demi belokan yang disinkronkan dengan posisi perangkat pengguna yang mengaktifkan sensor;

dan mungkin dinonaktifkan untuk aplikasi tertentu (entah bagaimana, setidaknya di Android) ... Dari pengikisan Geocode dalam percakapan .NET :

Ini tidak diperbolehkan oleh persyaratan penggunaan API. Anda tidak boleh menggores Google Maps untuk menghasilkan geocode. Kami akan memblokir layanan yang melakukan kueri otomatis dari server kami.


Manajer Produk Bret Taylor , Google Maps

Akan berterima kasih atas alternatif dan / atau saran!
Terima kasih!

Maksym Gontar
sumber
2
Saya membayangkan bahwa mengorek petunjuk arah mengemudi Google Maps seperti ini mungkin melanggar Ketentuan Penggunaan Google.
Christopher Orr
Saya mendapatkan semua poin di mRoad tetapi mereka tidak memetakan di MAP .. Jalur yang ditampilkan di MAP hanya dari Jaipur ke Delhi!
Vishal Khakhkhar
1
@Vishal: Maaf, tapi saya tidak bisa membantu dengan itu! Silakan posting pertanyaan terpisah!
Maksym Gontar

Jawaban:

115

Penyedia Rute Peta J2ME

maps.google.com memiliki layanan navigasi yang dapat memberi Anda informasi rute dalam format KML .

Untuk mendapatkan file kml kita perlu membentuk url dengan lokasi awal dan tujuan:

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

Selanjutnya Anda perlu mengurai xml (diimplementasikan dengan SAXParser) dan mengisi struktur data:

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

Koneksi jaringan diimplementasikan dengan cara yang berbeda di Android dan Blackberry, jadi Anda harus terlebih dahulu membentuk url:

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

lalu buat koneksi dengan url ini dan dapatkan InputStream.
Kemudian teruskan InputStream ini dan dapatkan struktur data yang diurai:

 public static Road getRoute(InputStream is) 

Kode sumber lengkap RoadProvider.java

BlackBerry

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

Lihat kode lengkap di J2MEMapRouteBlackBerryEx di Google Code

Android

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

Lihat kode lengkap di J2MEMapRouteAndroidEx di Google Code

Maksym Gontar
sumber
8
Kode ini tidak akan berfungsi lagi karena google telah berhenti untuk memberikan tanggapan dalam format KML. Berikut ini tautan untuk solusi dalam jawaban atas pertanyaan Stack Overflow Mengapa mengambil Google Directions untuk Android menggunakan data KML tidak berfungsi lagi?
kendrelaxman
1
Berikut dokumentasi lengkapnya: developers.google.com/maps/documentation/directions
Alexey
Solusi di atas tidak lagi bekerja dengan API 2. Saya berhasil menggambar jalur antara dua titik menggunakan Google map android API v2. Saya memposting solusinya di tautan itu. Jawaban: Gambar jalur antara dua titik menggunakan Google Maps Android API v2
Zeeshan Mirza