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


Pada Android 1.0 ada namespace com.google.googlenav untuk petunjuk arah mengemudi:
Rute - Peningkatan Arah Mengemudi Google
Namun dalam SDK yang lebih baru, ia 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 semacam itu:
bagaimana cara menemukan rute antara dua tempat di Blackberry?

csie-tw memberikan solusi (query gmaps untuk file kml dan mem-parsenya):
Android - Arah Mengemudi (Jalur Rute)
Juga Andrea membuat sebuah Kelas mengemudi DrivingDirections untuk Android.
Saya menulis sedikit pembantu untuk fungsi ini, di j2me, jadi saya ingin berbagi contoh saya di Android dan BlackBerry.

MEMPERBARUI
Seperti yang dinyatakan dalam komentar, itu tidak diizinkan secara resmi Persyaratan Layanan Google Maps API :

Persyaratan Layanan Google Maps / Google Earth API
  Terakhir diperbarui: 27 Mei 2009
  ...
  10. Batasan Lisensi. Kecuali secara tegas diizinkan berdasarkan 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 diizinkan secara eksplisit di Bagian 7 atau Dokumentasi API Maps, Anda tidak boleh (Anda juga tidak boleh mengizinkan orang lain):
  ...
  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 ke posisi perangkat yang mengaktifkan sensor pengguna;

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

Ini tidak diizinkan oleh ketentuan penggunaan API. Anda tidak harus mengorek   Google Maps untuk menghasilkan geocode. Kami akan memblokir layanan yang dilakukan   permintaan otomatis dari server kami.

Bret Taylor
  Manajer Produk, Google Maps

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


89
2018-01-07 21:05


asal


Jawaban:


Penyedia Rute Peta J2ME

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

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 pada Android dan Blackberry, jadi Anda harus terlebih dahulu membentuk url:

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

kemudian buat koneksi dengan url ini dan dapatkan InputStream.
Lalu, masukkan InputStream ini dan dapatkan struktur data yang diuraikan:

 public static Road getRoute(InputStream is) 

Kode sumber lengkap RoadProvider.java 

BlackBerry

  Tautan mati - tangkapan layar BlackBerry Storm 

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

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

Lihat kode lengkap di J2MEMapRouteAndroidEx di Google Code


116
2018-01-07 21:08