Last Updated on 8 years by Mas Herdi
Melanjutkan tutorial saya tentang Location Services API pada Android. Jika sebelumnya kita telah belajar mendapatkan lokasi pengguna di Android, dan melakukan reverse geocoding (mengubah koordinat lokasi menjadi nama jalan atau nama tempat). Kali ini kita akan belajar melakukan proses GeoCoding di Android, yaitu mengubah nama tempat/alamat, menjadi koordinat lokasi (latitude dan longitude).
Belajar Geocoding di Android mengubah alamat menjadi latitude longitude
Karena ini lanjutan dari tutorial sebelumnya, maka saya sarankan untuk mengikuti Pre-Requisites di bawah ini :
Pre-Requisites
- Membuat Project Hello World di Android
- Tutorial Places API di Android
- Tutorial Fused Location API di Android
- Tutorial Reverse Geocoding di Android
Source code dari tutorial-tutorial tersebut bisa didownload di GitHub saya.
Jika kalian sudah mengikuti tutorial2 di atas atau download source code nya, maka buka project tersebut dan buka file activity_main.xml. Di sana kita akan tambahkan sebuah EditText untuk menginputkan nama tempat/alamat yang akan kita ubah menjadi coordinat.
Membuat Intent Service
Kemudian pada class GeocoderIntentService.java, kita akan lakukan perubahan pada method onHandleIntent(). Dan kita akan menambahkan method baru bernama geoCoding()
GeocoderIntentService.java
// ... rest of code @Override protected void onHandleIntent(Intent intent) { mReceiver = intent.getParcelableExtra(Constants.RECEIVER); // Cek apakah ada receiver untuk menerima hasil if (mReceiver == null) { Log.wtf(TAG, "Tidak ada receiver, sehingga hasil tidak bisa dikirim"); return; } String alamat = intent.getStringExtra(Constants.ADDRESS_DATA_EXTRA); if(!TextUtils.isEmpty(alamat)){ geoCoding(alamat); }else{ reverseGeocoding(intent); } } private void geoCoding(String alamat){ String errorMessage = ""; Geocoder geocoder = new Geocoder(this, Locale.getDefault()); List<Address> addresses = null; try { addresses = geocoder.getFromLocationName(alamat, 1); } catch (IOException ioException) { // Menangkap apabila ada I/O atau jaringan error errorMessage = "Location Service is not available"; ioException.printStackTrace(); Log.e(TAG, errorMessage, ioException); } // Apabila tidak ada alamat yang bisa ditemukan if (addresses == null || addresses.size() == 0) { if (errorMessage.isEmpty()) { errorMessage = "Koordinat tidak ditemukan"; Log.e(TAG, errorMessage); } deliverResultToReceiver(Constants.FAILURE_RESULT, errorMessage); } else { // Mendapatkan hasil dari geocoding alamat, dan ambil lat long nya Address address = addresses.get(0); ArrayList<String> addressFragments = new ArrayList<>(); addressFragments.add(address.getFeatureName()); addressFragments.add(String.valueOf(address.getLatitude())); addressFragments.add(String.valueOf(address.getLongitude())); Log.i(TAG, "alamat ditemukan"); deliverResultToReceiver(Constants.SUCCESS_RESULT, TextUtils.join(System.getProperty("line.separator"), addressFragments)); } }
Pada onHandleIntent() kita tambahkan pengecekan kondisi apakah ada String alamat/nama tempat yang dikirim atau tidak. Jika ada maka otomatis dijalankan proses geocoding((), namun jika tidak ada, maka yang akan dijalankan ada proses reverse geocoding menggunakan koordinat lokasi yang telah didapat sebelumnya.
Kemudian proses geocoding mengubah alamat menjadi koordinatnya sendiri cukup simpel, seperti bisa dilihat di atas.
Setelah itu, jangan lupa juga kita tambahkan satu buah constant untuk data alamat pada Constants.java.
/** * Created by Hafizh Herdi on 2/12/2017. */ public final class Constants { //... rest of code public static final String ADDRESS_DATA_EXTRA = PACKAGE_NAME + ".ADDRESS_DATA_EXTRA"; }
Modifikasi pemanggilan IntentService
Setelah itu, kita bisa buka kembali MainActivity.java. Di situ kita ubah method startIntentService() untuk menambahkan pengecekan apakah ada nama alamat/nama tempat yang diinputkan atau tidak. Jika ada maka String tersebut dikirim ke Geocoder Intent Service sebagai extras.
protected void startIntentService(String alamat) { // Membuat intent yang mengarah ke IntentService untuk proses reverse geocoding Intent intent = new Intent(this, GeocoderIntentService.class); // Mengirim ResultReceiver sebagai extra ke intent service. intent.putExtra(Constants.RECEIVER, geocoderReceiver); // Mengirim location data sebagai extra juga ke intent service. intent.putExtra(Constants.LOCATION_DATA_EXTRA, mLastLocation); // Cek apakah ada alamat yang diinputkan, jika ada kirim ke intent service if(!TextUtils.isEmpty(alamat)){ intent.putExtra(Constants.ADDRESS_DATA_EXTRA, alamat); } // Start the service. If the service isn't already running, it is instantiated and started // (creating a process for it if needed); if it is running then it remains running. The // service kills itself automatically once all intents are processed. // tl;dr = menyalakan intent service :) startService(intent); }
Selanjutnya, saat tombol geocoding di tekan, maka otomatis dia akan mengecek edittext alamat terlebih dahulu, apakah ada alamat yang diinputkan atau tidak.
etAlamat = (EditText) findViewById(R.id.et_alamat); btGeocoding = (Button) findViewById(R.id.bt_geoCoding); btGeocoding.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.show(); if(mGoogleApiClient.isConnected()){ startIntentService(etAlamat.getText().toString()); } } });
Demo
Oke thats all, saatnya kita coba jalankan aplikasinya.

Android Geocoding Sample
Pada gambar di atas, kita coba masukkan nama tempat seperti Lembang atau Lafayette Paris. Dan kemudian aplikasi akan meng-Geocode nama tempat/alamat tersebut menjadi koordinat seperti di atas.
Jika edit text kosong / tidak kita isi, maka yang dilakukan adalah proses reverse geocoding / ubah koordinat lokasi kita menjadi alamat.
That’s all. Source code bisa didownload di Github. Jangan lupa untuk star project nya dan juga follow GitHub saya. 🙂 Silahkan tanya di bagian komentar apabila ada yang kurang jelas.
Ada apk yg sudah langsung bisa di pake gak mas.. soalnya kita gak mahir dgn tutoria yg mas tulis
Compile dari GitHub aja langsung mas brooo https://github.com/twoh/twoh-places-location-api-sample