Tutorial Geocoding : Mengubah Alamat Menjadi Koordinat (Lat, Lng) di Android

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

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

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.





Download aplikasi kami di Google Play Store


Leave a Reply