Tutorialnya sebelumnya :
1. Membuat rute angkutan umum di https://www.google.com/maps/d/
2. Menggambar graf sesuai rute yang dibuat pada tahap 1
3. Membuat koordinat rute angkutan umum dan SMK di http://graph.latcoding.com
4. Mengupdate graf yang sudah dibuat pada tahap 2
5. Menggunakan database Sqlite di Mozilla (untuk menyimpan grafnya)
Tahap 6 (Finishing) : Pembuatan aplikasi pencarian rute angkutan umum menggunakan algoritma dijkstra di android – aplikasi dijkstra.
Download aplikasinya
Tutorial kali ini akan menjelaskan ‘sedikit’ cara pembuatan aplikasi pencarian rute angkutan umum menggunakan algoritma dijkstra di android. Loh kenapa sedikit? ya karena lumayan banyak script yg dibuat gan. :hammer: Kalo mau tau lebih detail scriptnya, oprek2x sendiri gan. Udah dikasi komentar kok tiap scriptnya. Yang saya bahas disini lebih menerangkan alur sistemnya, OK?
Btw, buat yang belum baca tutorial sebelumnya, baca dulu tutorial di atas, nanti baru kesini lagi.
Oke, kita disini akan membuat aplikasinya menggunakan eclipse ya, jadi buat yang pake android studio harap menyesuaikan.
Cekidot cara pembuatannya ::
1. Karena aplikasi yg kita buat berbasis peta, dapetin dulu ‘API KEY GOOGLE ANDROID‘ buat munculin peta di android. Caranya? ada di sini
2. Setelah itu buka eclipse tentunya
3. Kita buat projectnya, isi kaya di bawah, trus next aja sampek finish
4. Setelah projectnya kebuat, sekarang buka AndroidManifest.xml, tambahkan tag ‘permission’ dan ‘meta-data’
* yang dicoret hijau ganti dengan API KEY punya anda.
............. <permission android:name="com.app.dijkstra.permission.MAPS_RECEIVE" android:protectionLevel="signature"></permission> <uses-permission android:name="com.app.dijkstra.permission.MAPS_RECEIVE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> ................. <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="API_KEY_ANDA" />
5. Lalu Import library ‘google-play-services_lib’ supaya icon silang merah pada gambar di atas hilang. Caranya klik kanan ‘App_dijkstra’ > Properties > android > add > ok > ok
6. Copy database schoolnav.sqlite yang sudah kita buat pada tutorial ke 5, ke dalam folder App_dijkstra/assets, lalu klik kanan ‘App_dijkstra’ > Refresh
7. Sekarang kita akan edit activity.xml, buka res > layout > activity.xml.
Paste-kan script dibawah ini ke activity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <fragment android:id="@+id/peta" android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.google.android.gms.maps.SupportMapFragment" /> </FrameLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="96dip" android:orientation="vertical" android:weightSum="2"> <Spinner android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:id="@+id/spinner_list_smk"></Spinner> </LinearLayout> </FrameLayout> </RelativeLayout>
8. Setelah itu import gambar ‘angkot’ ke folder drawable-mdpi
gambarnya bisa didownload dari sini
9. Download file .java dari sini, lalu import file tersebut seperti gambar dibawah
10. Ada beberapa file .java yang diperlukan dalam aplikasi ini
– SQLHelper.java
Buat koneksi ke database sqlite
– GraphToArray.java
Class untuk menkonversi tabel ‘graph’ dari database ke dalam bentuk array[][] multi dimensional. Array ini dipergunakan untuk perhitungan algoritma dijkstra nantinya.
– Get_koordinat_awal_akhir.java
Class untuk mendapatkan koordinat jalur angkutan umum terdekat dari posisi kita berada dan posisi SMK.
– Tambah_simpul.java
Menkonversi koordinat jalur angkutan umum terdekat menjadi sebuah simpul baru (simpul awal dan akhir)
– Count_Bobot_Tambah_Simpul.java
Menghitung total jarak jika ada simpul baru (simpul awal dan akhir)
– dijkstra.java
Ini yang paling penting, perhitungan algoritma dijkstra akan di proses pada class ini.
– MainActivity.java
Class utama di android
Untuk lebih jelasnya, alur sistem aplikasinya seperti ini :
Penjelasan flowcartnya sebagai berikut :
1. MainActivity.java
Pertama kali aplikasi akan mencari koordinat posisi kita berada dan koordinat tujuan yaitu SMK.
– Script untuk mencari koordinat posisi kita berada (via tap pada peta) yaitu :
@Override public void onMapClick(LatLng arg0) { // TODO Auto-generated method stub // your coordinate position double latUser = arg0.latitude; double lngUser = arg0.longitude; __global_yourCoordinate_exist = arg0; // destination coordinate position String endposition = __global_endposition; if(endposition != null){ // dipecah coordinate SMK String[] exp_endposition = endposition.split(","); double lat_endposition = Double.parseDouble(exp_endposition[0]); double lng_endposition = Double.parseDouble(exp_endposition[1]); // ======================================================================== // CORE SCRIPT // fungsi cari simpul awal dan tujuan, buat graph sampai algoritma dijkstra // ======================================================================== try { startingScript(latUser, lngUser, lat_endposition, lng_endposition); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ Toast.makeText(getApplicationContext(), "pilih SMK dulu", Toast.LENGTH_LONG).show(); } }
– Script untuk mendapatkan posisi koordinat tujuan (SMK) yaitu :
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub if(arg0.getItemAtPosition(arg2).toString() != "-- Pilih SMK --"){ String pilih_smk = arg0.getItemAtPosition(arg2).toString(); cursor = db.rawQuery("SELECT koordinat FROM sekolah where sekolah = '" + pilih_smk + "'", null); cursor.moveToFirst(); cursor.moveToPosition(0); // get coordinate SMK from field koordinat __global_endposition = cursor.getString(0).toString(); // user men-tap peta if(__global_yourCoordinate_exist != null){ // your coordinate double latUser = __global_yourCoordinate_exist.latitude; double lngUser = __global_yourCoordinate_exist.longitude; // destination coordinate SMK String[] exp_endCoordinate = __global_endposition.split(","); double lat_endposition = Double.parseDouble(exp_endCoordinate[0]); double lng_endposition = Double.parseDouble(exp_endCoordinate[1]); // ======================================================================== // CORE SCRIPT // fungsi cari simpul awal dan tujuan, buat graph sampai algoritma dijkstra // ======================================================================== try { startingScript(latUser, lngUser, lat_endposition, lng_endposition); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ Toast.makeText(getApplicationContext(), "Tap pada peta untuk menentukan posisi Anda", Toast.LENGTH_LONG).show(); } }// if -- pilih SMK -- } @Override public void onNothingSelected(AdapterView<> arg0) { // TODO Auto-generated method stub } });//setOnItemSelectedListener
2-3. Get_koordinat_awal_akhir.java
Setelah mendapatkan koordinat posisi kita dan koordinat SMK, selanjutnya adalah mencari koordinat jalur angkutan umum terdekat. Perhatikan gambar :
Pada gambar di atas, koordinat jalur angkutan umum terdekat dari posisi kita ada diantara simpul 0 dan 1 (kita sebut x), sedangkan koordinat jalur angkutan umum terdekat dari posisi SMK berada diantara simpul 4 dan 9 (kita sebut y). Lihat kembali ke flowchart pada simbol decision, apakah koordinat x dan y berada diantara dua simpul ? ternyata ‘YA’. Berarti kita harus menambahkan simpul baru seperti gambar dibawah :
Pada gambar di atas, terdapat 2 buah simpul baru yaitu simpul awal 10 dan simpul tujuan 11. Nah untuk membuat simpul 10 dan 11 itu menggunakan class Tambah_simpul.java ini.
5. MainActivity.java
Setelah didapatkan simpul awal dan tujuan, selanjutnya melakukan perhitungan algoritma dijkstra. Input utama dari algoritma dijkstra adalah simpul awal (10) dan tujuan/akhir (11) seperti gambar diatas.
public void startingScript(double latUser, double lngUser, double lat_endposition, double lng_endposition) throws JSONException{ ................. // ALGORITMA DIJKSTRA // ========================================== dijkstra algo = new dijkstra(); algo.jalurTerpendek(__global_graphArray, __global_simpul_awal, __global_simpul_akhir); ................. }
Return dari script di atas adalah jalur terpendek, yaitu 10->1->4->11
Setelah didapatkan jalur terpendek, kemudian digambarlah jalur menggunakan polyline menggunakan method :
public void drawJalur(String alg, String[] exp) throws JSONException{ ......... }
————— skip skip ——————
Balik lagi ke flowchart nomor 2-3. Jika posisi kita dan SMK tidak berada diantara 2 simpul(tp lebih ke satu simpul), maka tidak perlu untuk menambahkan simpul :
7. MainActivity.java
Setelah didapatkan simpul awal dan tujuan/akhir (0 dan 9). Maka dilakukan perhitungan dijkstra juga seperti langkah flowchart nomor 5.
public void startingScript(double latUser, double lngUser, double lat_endposition, double lng_endposition) throws JSONException{ ................. // ALGORITMA DIJKSTRA // ========================================== dijkstra algo = new dijkstra(); algo.jalurTerpendek(__global_graphArray, __global_simpul_awal, __global_simpul_akhir); ................. }
Return dari script di atas adalah jalur terpendek, yaitu 0->1->4->9
Setelah didapatkan jalur terpendek, kemudian digambarlah jalur menggunakan polyline menggunakan method :
public void drawJalur(String alg, String[] exp) throws JSONException{ ......... }
11. Running projectnya — selesai —
———————————————————-
Setelah aplikasi ini jadi, ada kelemahan jika algoritma dijkstra dijalankan di Android, yaitu :
1. Kalau simpulnya mencapai > 80, seperti ini
ni aplikasi bakalan lemot pastinya. Kenapa? Karena memori hape & processornya kaga bakalan kuat. Mending proses algoritma dijkstranya dibuat via ‘web service’, jadi yang ngehandle server komputer bukan hape. wkkaka. Btw graph diatas itu hasil skripsi saya. Dan pas demo ke penguji muter2 doang appnya lemot 30 detik baru kebuka… Haha. Tapi alhamdulillah lulus 🙂
Buat yang males baca teks, bisa lihat tutorial versi videonya :
VIDEO TUTORIAL
1) [part 1 – convert graph] https://www.youtube.com/watch?v=1LBbyvZkcJ0
2) [part 2 – insert coordinates into sqlite DB] https://www.youtube.com/watch?v=pCapk8Xxxyo
3) [part 3 – finishing~create app] https://www.youtube.com/watch?v=2soi0VcNvz8
gan ane boleh minta emailx gk???
ni gan emailnya x@ambar-hasbiyatmoko.com
Mantaf gan.. ijin minta ilmunya.. ada referensi cara membuat applikasi android algoritma dijkstra lagi ga??
makasih gan..
yg paling simpel http://www.kaskus.co.id/thread/540615d70f8b4673288b456c/algoritma-jalur-terpendek–google-maps-v2-android
Mas,, salam kenal,, tutorialnya sangat bagus sekali,, saya mau nanya,, kok saya ga bisa di sini ya [5. Lalu Import library ‘google-play-services_lib’ ].. mohon penerangannya gan,, di saya ketika klik add gada pilihan ‘google-play-services_lib’
install dulu ‘google-play-services_lib’ lewat Android SDK Manager. Terus cari bagian Extras > Google Play Service
Ok udah bang,, bang boleh minta no WA ga?
Saya ada kendala bang pas saya import kok banyak tanda merahnya ya.. Dan saya ikutin tutorial juga stuck di eclipsenya gan..
boleh liat screenshootnya?
mungkin tanda merahnya disebabkan krn nama package berbeda, jadi pada merah gitu.
ikutin aja tutorial versi videonya :
1) [part 1 – convert graph] https://www.youtube.com/watch?v=1LBbyvZkcJ0
2) [part 2 – insert coordinates into sqlite DB] https://www.youtube.com/watch?v=pCapk8Xxxyo
3) [part 3 – finishing~create app] https://www.youtube.com/watch?v=2soi0VcNvz8
saya kirim ke mana ya bang screen shootnya? saya sudah ikutin videonya bang..
ke x@ambar-hasbiyatmoko.com
gan,, saya sudah email.. mohon penerangannya gan,,
thanks gan
gan, ane mau nanya dong, ane mau buat aplikasi tentang angkot gitu, nah ane ngesave rute angkot itu pake ini gan google(d0t)com/maps/d/ ? nah kalo bolak balik itu bikin 2 atau 1 aja ya? thanks
apanya yg bolak balik? rutenya?
kalo rutenya bolak balik tapi jalurnya sama bikin 1 rute aja (nanti koordinat rutenya tinggal dibalik, dari A-B jadi B-A).
kalo rutenya bolak balik tapi jalurnya berbeda, ya bikin 2 (koordinatnya juga dibikin 2, misal jalur berangkat:A-B-C –> jalur pulang:C-D-A).
What’s the meaning of SMK?
SMK is High School ..
Mas ambar, itu cara gambar grafnya gimana ya?
nge-gambar onlinenya di http://graph.latcoding.com/
kalo gambar manualnya di photoshop mas.
svp aidez-moi pour appliquer cette application en android studio
i’m busy, next time i will create it
ijin referensi buat PI ya gan
silahkan mas
cette tutoriel ne ça marche pas pour moi, quand j’execute l’application, elle bloque et affiche le message ” Unfortunately name app has stopped “, tu peut m’aider s’il vous plaît ?
gan kalo nambahin harga rutenya kira kira ditaro dimana ya? mohon pencerahannya
tambahin 1 field lagi -> ‘harga_rute’ di tabel angkutan_umum mas.
Trus contoh isian fieldnya ky gini : ,2000,4000,5000,
cette tutoriel ne ça marche pas pour moi, quand j’execute l’application, elle bloque et affiche le message ” Unfortunately name app has stopped “, tu peut m’aider s’il vous plaît ?
capture your error log, and send to my email x@ambar-hasbiyatmoko.com. I will help you.
if you don’t know how to display the log, follow this link >> http://developer.android.com/tools/debugging/debugging-studio.html (Android studio) or http://stackoverflow.com/questions/16817566/restore-logcat-window-within-android-studio (Eclipse)
Anda dapat membantu saya untuk menghitung kemacetan lalu lintas di jalan lalu lintas perkotaan di aplikasi ini
Anda dapat membantu saya untuk menghitung kemacetan lalu lintas di jalan lalu lintas perkotaan di aplikasi ini
mas punya cara supaya lokasi kita terdeteksi sendiri lewat GPS nggak? jadi tidak perlu memilih lokasi awal lagi
ada nih : https://jsfiddle.net/ToreanJoel/4ythpy02/
mas, cara mengaplikasikan source link diatas ke eclipse bagaimana ya? saya kurang paham, terimakasih
wah sori salah link, yg ini yg bener http://stackoverflow.com/questions/1513485/how-do-i-get-the-current-gps-location-programmatically-in-android
thanks mas ambar
jika tujuan yg dicapai ada 3 bagaimana caranya mas? misalkan saya ingin ke tujuan 1,2 dan 3 kemudian tampil jarak 1, jarak 2, dan jarak 3 dan didapatlah jarak terpendek no 2,1,3.. maka saya akan ke tujuan 2 kemudian ke 1 baru ke 3.. nah untuk case diatas apa yang harus ditambahkan?
makasih sebelumnya
kalo 3 tujuan, ya tinggal 3 kali looping dijkstranya mas bro :
startingScript(latUser, lngUser, lat_tujuan1, lng_tujuan1);
startingScript(latUser, lngUser, lat_tujuan2, lng_tujuan2);
startingScript(latUser, lngUser, lat_tujuan3, lng_tujuan3);
jika di php dibagian mana yg di looping 3x mas? saya tes yg php dg mysql
kalo yg php, komennya di tutorial php mas.. jgn disini..
di comment di tutorial php tidak bisa komen mas, mkanya ane tanya disini..
bro mau Tanya dong maklum newbie hehe. ane mau buat tugas akhir rute bus dalam dan luar kota kalau rute buat yg bus luar kotanya apakah harus bikin nodenya banyak seperti itu misalnya dari 0-9? apakah ada cara yg lebih singkatnya? soalnya kan kalo rute yg dilalui bus untuk luar kota kan panjang2 tuh, kayanya kalo dibikin nodenya seperti itu agak banyak ya? mohon pencerahannya
ya memang begitu mas bro, smakin lebar areanya smakin banyak nodenya.
—
Kalo ngga mau yg ribet2 tinggal pake API google maps bro, nnti bs mncul rute2 busnya.
https://developers.google.com/maps/documentation/javascript/examples/directions-travel-modes
cara implementasi di eclipse nya gimana bro? maksudnya source code itu dimasukin di java apa xml? atau bikin class baru? maaf ya kalo banyak Tanya hehe.. makasih
yg api google maps ato yg aplikasi saya ni?
klo yg aplikasi saya taruh folder src/
kalo yg api google maps tinggal bkin class baru
mas, saya meng impementasikan source di atas, tp kenap ya klo simpul nya lebih dari sertus force close?
sudah teratasi dengan memberi pembesaran nilai array
Mas kalo mau di implementasikan ke android srudio bisa ga ya?
sudah saya coba import,banyak yang error nya.
mmg errornya sperti ap?
mas mau tanya, ketika ada kasus seperti di bawah:
nama angkot : A
simpul rute : ,0-1,1-2,2-3,
nama angkot : B
simpul rute : ,4-5,5-6,6-3,
graph pada table:
0-1
1-2(‘…….)
2-3(‘…….)
4-5(‘…….)
5-6(‘…….)
6-3(‘…….)
yang ditanyakan, kenapa saat di build ke apk dan di coba pada device.
lokasi awal di tap pada lokasi angkot b dan lokasi tujuan dekat angkot a,
namun rute tidak keluar dan tidak ada error juga, itu kenapa ya mas?
terimakasih
untuk script rute angkotnya mmg masih ada bugsnya mas.
Gan, cek email gan
untuk perbaikanya di bagian mana nya ya mas?
MainActivity.java, sekitar line 368 sampai 662 mas bro
punya sempel nya ga mas?
ngga punya mas bro, sy blm benerin itu bug
boleh minta emailnya mas?
setelah saya cek di line 368 sampai 662 ga ada kendala, namun pada algo djikstra.java mas selalu hang ketika simpul seperti ini, ,0-1,1-2,2-71,71-3,3-5,5-6,6-7,7-8,8-10,
terimakasih
mas klo database yg digunain mysql gmn ya ? makasih sebelumnya
ngga bisa mas, nnti error scriptny..
musti pake sqlite
ada gak referensi gt yang pake mysql ?
ngga ada mas, aplikasi ini khusus pke sqlite
the file is not available anymore, can you send me the file instead?
will check
still can’t download it
just restored, you can try again
bang kalo mau nampilin hasil perhitungan jarak terpendeknya di textview gimana bang? urgent
itu kan return dari algo.jalurTerpendek() udh jarak terpendek, tinggal cemplungin aja ke textview
ada emailnya g bang
bang saya punya 500 node terus pas saya jalanin pencarian rutenya aplikasi nya ngefreeze tapi dijkstranya tetep jalan n berhasil nampilin jaraknya, tapi aplikasinya ngefreeze pas item di spinnernya diklik
Iya memang kalo nodenya banyak bakal lemot, solusinya pindahin algoritmanya ke web service, atau dibuat thread masing-masing diandroidnya.