• Anda pernah melihat status teman anda di facebook “Check In @Plaza Semanggi”
• Anda pernah coba aplikasi yang menunjukkan posisi kita sekaligus tempat-tempat yang dekat dengan kita
• Semua itu bisa dibilang termasuk golongan Location Based Service (LBS)
Saya juga bertanya-tanya kok bisa yah aplikasi mereka memberikan informasi seperti itu ?
Untuk menjawab pertanyaan itu saya coba buatkan gambar konsep aplikasi LBS
Dari gambar diatas antara kita dengan lokasi-lokasi disekitar kita terdapat jarak, ada yang 200m atau 210m atau 100m dan lainnya. Jadi sudah jelaskan yang dijadikan parameter untuk aplikasi LBS adalah jarak dari posisi kita berada ke lokasi-lokasi di sekitar kita.
Tapi kenapa kok mereka bisa tahu yah nama lokasinya dengan benar, itu karena mereka mempunyai bank data yang menyimpan koordinat lokasi berserta namanya.
Jadi untuk membuat sebuah aplikasi LBS minimal harus mempunyai kemampuan untuk
- Dapat mengetahui koordinat posisi kita
- Punya bank data atau dapat mengakses bank data yang menyimpna data koordinat lokasi dan informasi mengenai lokasi tersebut
- Dapat Menghitung jarak antara posisi kita dengan sebuah lokasi.
- Dapat Menampilkannya menjadi informasi yang bisa dibaca user contohnya kedalam Map (Google Map)
Jadi secara singkat Algoritma Aplikasi LBS adalah
- Dapatkan koordinat posisi kita melalu GPS
- Tetapkan Lokasi-lokasi yang ingin kitampilkan difilter berdasarkan jarak
- Gambar Posisi kita dan Lokasi-lokasi terdekat dalam map
Berikut Langkah-langkahnya
- Buat Projectnya, ikuti inputan seperti dibawah ini.
2. setelah project tercreate maka secara otomatis android membentuk 3 file yaitu :
- main.xml
- string.xml
- TunjukLokasiBeraksi.java
4. Edit main.xml lalu isikan kode berikut
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 | <?xml version="1.0"encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent">    <com.google.android.maps.MapView        android:id="@+id/mapView"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:enabled="true"        android:clickable="true"        android:apiKey="Key Google Map"        /></RelativeLayout> | 
sedangkan untuk Layoutnya adalah Relative Layout
Untuk android:apiKey, isi dengan key Google Map yang telah kita buat dari tutorial sebelumnya
5. Untuk dapat melakukan menampilan Map Google Map dan Menangkap GPS dari satelit kita perlu menambahkan
| 
1 
2 
3 
4 | <uses-library> com.google.android.maps      <uses-permission> INTERNET, ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION | 
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 | <?xml version="1.0"encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="com.agus.map.lok"      android:versionCode="1"      android:versionName="1.0">    <uses-sdk android:minSdkVersion="7"/>    <application android:icon="@drawable/icon"android:label="@string/app_name">    <uses-library android:name="com.google.android.maps"/>        <activity android:name=".TunjukLokasiBeraksi"                  android:label="@string/app_name">            <intent-filter>                <action android:name="android.intent.action.MAIN"/>                <category android:name="android.intent.category.LAUNCHER"/>            </intent-filter>        </activity>    </application>    <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission></manifest> | 
lokasi bangunan, pada project ini adalah rumah makan padang
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 | packagecom.agus.map.lok;publicclassLokasi { publicdoublelat = 0; publicdoublelng = 0; publicintcategory = 0; publicString lokname = ""; publicLokasi(doubleplat, doubleplng, intpcategory, String sname) {  this.lat = plat;  this.lng = plng;  this.category = pcategory;  this.lokname = sname; }} | 
ini adalah untuk marker (icon penunjuk posisi kita pada Map dan
lokasi rumah makan padang disekitar kita)
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 | packagecom.agus.map.lok;importjava.util.ArrayList;importjava.util.List;importandroid.app.AlertDialog;importandroid.content.Context;importandroid.content.DialogInterface;importandroid.content.DialogInterface.OnClickListener;importandroid.graphics.Canvas;importandroid.graphics.drawable.Drawable;importcom.google.android.maps.ItemizedOverlay;importcom.google.android.maps.MapView;importcom.google.android.maps.OverlayItem;publicclassMyItemizedOverlay extendsItemizedOverlay { privateArrayList<OverlayItem> items = newArrayList<OverlayItem>(); privateDrawable marker; privateContext mContext; publicMyItemizedOverlay(Drawable defaultMarker) {  super(defaultMarker);  // items = new ArrayList();  marker = defaultMarker; } publicMyItemizedOverlay(Drawable defaultMarker, Context context) {  super(boundCenterBottom(defaultMarker));  mContext = context; } @Override protectedOverlayItem createItem(intindex) {  return(OverlayItem) items.get(index); } @Override publicintsize() {  returnitems.size(); } /*  * (non-Javadoc)  *  * @see  * com.google.android.maps.ItemizedOverlay#draw(android.graphics.Canvas,  * com.google.android.maps.MapView, boolean)  */ @Override publicvoiddraw(Canvas canvas, MapView mapView, booleanshadow) {  super.draw(canvas, mapView, shadow);  // boundCenterBottom(marker); } publicvoidaddItem(OverlayItem item) {  items.add(item);  populate(); } @Override protectedbooleanonTap(intindex) {  OverlayItem item = items.get(0);  AlertDialog.Builder dialog = newAlertDialog.Builder(mContext);  dialog.setTitle(item.getTitle());  dialog.setMessage(item.getSnippet());  dialog.setPositiveButton("Close", newOnClickListener() {   @Override   publicvoidonClick(DialogInterface arg0, intarg1) {    arg0.dismiss();   }  });  dialog.show();  returntrue; }} | 
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 
97 
98 
99 
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
118 
119 
120 
121 
122 
123 
124 
125 
126 
127 
128 
129 
130 
131 
132 
133 
134 
135 
136 
137 
138 
139 
140 
141 
142 
143 
144 
145 
146 
147 
148 
149 
150 
151 
152 
153 
154 
155 
156 
157 
158 
159 
160 
161 
162 
163 
164 
165 | packagecom.agus.map.lok;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;importandroid.content.Context;importandroid.graphics.drawable.Drawable;importandroid.location.Location;importandroid.location.LocationListener;importandroid.location.LocationManager;importandroid.os.Bundle;importcom.google.android.maps.GeoPoint;importcom.google.android.maps.MapActivity;importcom.google.android.maps.MapView;importcom.google.android.maps.Overlay;importcom.google.android.maps.OverlayItem;/** * Aplikasi ini  untuk menampilkan lokasi posisi koordinat GPS * kita saat ini Pada MAP dan bangunan disekitarnya * * @author Agus Haryanto */publicclassTunjukLokasiBeraksi extendsMapActivity { privateMapView mapView; privateLocationManager locManager; privateLocationListener locListener; privateArrayList<Lokasi> list_lokasi = newArrayList<Lokasi>(); /** Called when the activity is first created. */ @Override publicvoidonCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  initLokasi();  initMap();  initLocationManager(); } /**  * Initialize the map to the Data Location.  */ privatevoidinitLokasi() {  list_lokasi.add(newLokasi(-6.29826d, 106.82024d, 1,    "RM Padang Sari Mande"));  list_lokasi.add(newLokasi(-6.28326d, 106.82324d, 2,    "RM Padang Sederhana"));  list_lokasi    .add(newLokasi(-6.29326d, 106.83324d, 3, "RM Padang Garuda")); } /**  * Initialize the map to the LinearLayout.  */ privatevoidinitMap() {  mapView = (MapView) findViewById(R.id.mapView);  mapView.displayZoomControls(true);  mapView.getController().setZoom(15); } /**  * Initialize the location manager.  */ privatevoidinitLocationManager() {  locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  locListener = newLocationListener() {   // method ini akan dijalankan apabila koordinat GPS berubah   publicvoidonLocationChanged(Location newLocation) {    tampilkanPosisikeMap(newLocation);   }   publicvoidonProviderDisabled(String arg0) {   }   publicvoidonProviderEnabled(String arg0) {   }   publicvoidonStatusChanged(String arg0, intarg1, Bundle arg2) {   }  };  locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,    1000, locListener); } /**  * This method will be called when current position changed is submitted via  * the GPS.  *  * @param newLocation  */ protectedvoidtampilkanPosisikeMap(Location newLocation) {  List<Overlay> overlays = mapView.getOverlays();  // first remove old overlay  if(overlays.size() > 0) {   for(Iterator iterator = overlays.iterator(); iterator.hasNext();) {    iterator.next();    iterator.remove();   }  }  // transform the location to a geopoint  GeoPoint geopoint = newGeoPoint(    (int) (newLocation.getLatitude() * 1E6), (int) (newLocation      .getLongitude() * 1E6));  GeoPoint myposition = geopoint;  Location locationA = newLocation("point A");  Location locationB = newLocation("point B");  locationA.setLatitude(geopoint.getLatitudeE6() / 1E6);  locationA.setLongitude(geopoint.getLongitudeE6() / 1E6);  // initialize icon  Drawable icon = getResources().getDrawable(R.drawable.marker);  icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon    .getIntrinsicHeight());  // create my overlay and show it  MyItemizedOverlay overlay = newMyItemizedOverlay(icon, this);  OverlayItem item = newOverlayItem(geopoint, "My Location", "Lat:"    + locationA.getLatitude() + "\nLng:"+ locationA.getLongitude());  overlay.addItem(item);  mapView.getOverlays().add(overlay);  for(inti = 0; i < list_lokasi.size(); i++) {   geopoint = newGeoPoint((int) (list_lokasi.get(i).lat * 1E6),     (int) (list_lokasi.get(i).lng * 1E6));   locationB.setLatitude(geopoint.getLatitudeE6() / 1E6);   locationB.setLongitude(geopoint.getLongitudeE6() / 1E6);   doubledistance = locationA.distanceTo(locationB);   if(list_lokasi.get(i).category == 1) {    icon = getResources().getDrawable(R.drawable.shop);   } elseif(list_lokasi.get(i).category == 2) {    icon = getResources().getDrawable(R.drawable.building);   }   elseif(list_lokasi.get(i).category == 3) {    icon = getResources().getDrawable(R.drawable.store);   }   icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon     .getIntrinsicHeight());   overlay = newMyItemizedOverlay(icon, this);   item = newOverlayItem(geopoint, list_lokasi.get(i).lokname, "Lat:"     + list_lokasi.get(i).lat + "\nLng:"     + list_lokasi.get(i).lng + "\n Jarak:"+ distance+"m");   overlay.addItem(item);   mapView.getOverlays().add(overlay);  }  // move to location  mapView.getController().animateTo(myposition);  // redraw map  mapView.postInvalidate(); } @Override protectedbooleanisRouteDisplayed() {  returnfalse; }} | 
Disini datanya bukan data benaran hanya contoh saja agar kita bisa membuktikan kerja Aplikasi ini
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 | privatevoidinitLokasi() {  list_lokasi.add(newLokasi(-6.29826d, 106.82024d, 1,    "RM Padang Sari Mande"));  list_lokasi.add(newLokasi(-6.28326d, 106.82324d, 2,    "RM Padang Sederhana"));  list_lokasi    .add(newLokasi(-6.29326d, 106.83324d, 3, "RM Padang Garuda")); } | 
Kalau ditablekan akan seperti ini
| Latitude | Longitude | Kategori | Nama | 
| -6.29826 | 106.82024 | 1 | RM Padang Sari Mande | 
| -6.28326 | 106.82324 | 2 | RM Padang Sederhana | 
| -6.29326 | 106.83324 | 3 | RM Padang Garuda | 
Perhatikan code ini
| 
1 
2 
3 
4 
5 
6 
7 | if(list_lokasi.get(i).category == 1) { icon = getResources().getDrawable(R.drawable.shop);} elseif(list_lokasi.get(i).category == 2) { icon = getResources().getDrawable(R.drawable.building);}elseif(list_lokasi.get(i).category == 3) { icon = getResources().getDrawable(R.drawable.store);} | 
Nah disini bangunan rumah makan padang akan tergambar dimap berdasarkan kategorinya
| Kategori | Gambar | 
| 1 | |
| 2 | |
| 3 | 
Nah ternyata android googlemap sudah menyediakan fungsi tersebut yaitu dengan menggunakan distanceTo
9. sekarang mari kita jalankan programnya. Bagi yang menggunakan emulator jangan lupa mainkan
Latitude dan longitudenya dari Emulator Control (DDMS) set Latitude = -6.298418 Longitude=106.82639
maka akan tampil seperti ini
Yang gambar balon merah adalah lokasi kita sedangkan yang lainnya adalah gambar bangunan disekitar kita
coba kita klik/sentuh salah satu bangunan yang paling jauh.
Akan muncul informasi Nama, latitude, longitude dan jarak bangunan tersebut dari posisi kita.
Disini dapat dilihat bahwa nama bangunan itu adalah RM Padang Sederhana dengan jarak 1708,8 m
dari posisi kita.
Nah cobalah klik bangunan lainnya untuk mendapatkan informasinya.
Pada saat ini lokasi bangunan yang ada disekitar kita belum kita filter jaraknya.
Salah satu yang disyaratkan dalam aplikasi LBS adalah filtering jarak. Sekarang mari kita coba buat filtering atau pembatasan lokasi yang muncul adalah lokasi yang jaraknya kirang dari 1000m.
Untuk itu tambahkan
If (distance <1000){
Dibawah code double distance = locationA.distanceTo(locationB);
Dan tambah kan {
diatas code mapView.getController().animateTo(myposition);
Kemudian mari kita run kembali aplikasinya. Maka sekarang yang terlihat hanya 2 bangunan saja.
Wah, tidak menyangkayah kita bisa membuat aplikasi LBS. Alhamdulillah
Sekarang kita sudah punya satu senjata lagi untuk buat aplikasi yang keren.
Pada aplikasi LBS selain aplikasi, data memegang peranan yang sangat penting, karma kalau tidak ada data adalah hal yang mustahil kita dapat membuat aplikasi LBS. buat para mahasiswa kesempatan nih selain sebagai pengembang kita juga dapat menjadi provider data. Cara yang sederhana adalah dari kumpulkan data bangunan lingkungan sekitar campus dulu.
Semoga Bermanfaat
Agus Haryanto
Sumber : http://agusharyanto.net/wordpress/?p=496&cpage=1
http://developer.android.com
http://blogs.itemis.de/frey/2009/04/07/location-based-services-on-android-part-2/


Post a Comment