Bagaimana cara menemukan lintang dan bujur dari alamat?


Jawaban:


139
public GeoPoint getLocationFromAddress(String strAddress){

Geocoder coder = new Geocoder(this);
List<Address> address;
GeoPoint p1 = null;

try {
    address = coder.getFromLocationName(strAddress,5);
    if (address==null) {
       return null;
    }
    Address location=address.get(0);
    location.getLatitude();
    location.getLongitude();

    p1 = new GeoPoint((double) (location.getLatitude() * 1E6),
                      (double) (location.getLongitude() * 1E6));

    return p1;
    }
}

strAddressadalah string yang berisi alamat. The addressvariabel memegang alamat dikonversi.


1
Ini melempar "layanan java.io.IOException tidak tersedia"
Kandha

3
Anda memerlukan izin yang tepat untuk dapat mengakses layanan. # <using-permission android: name = "android.permission.ACCESS_COARSE_LOCATION" /> <using-permission android: name = "android.permission.INTERNET" />
Flo

versi android api mana yang sedang Anda bangun aplikasi yang Anda butuhkan agar google api tersedia, saya telah membangunnya dengan google api 8. periksa apakah folder google api ada di proyek Anda. dan dalam file manifes Anda menambahkan menggunakan perpustakaan com.google.android.maps
ud_an

1
saya sudah memberikan izin itu dan menyertakan perpustakaan ... saya bisa mendapatkan tampilan peta ... itu melempar bahwa IOException di geocoder ...
Kandha

6
Lihat jawaban oleh @NayAneshGupte di bawah ini, saya rasa tidak ada GeoPointkelas di perpustakaan baru. Sebagai gantinya gunakan LatLng. stackoverflow.com/a/27834110/2968401
pengguna2968401

80

Solusi Ud_an dengan API yang diperbarui

Catatan : Kelas LatLng adalah bagian dari Layanan Google Play.

Wajib :

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

<uses-permission android:name="android.permission.INTERNET"/>

Pembaruan: Jika Anda memiliki SDK target 23 dan yang lebih baru, pastikan Anda mengurus izin waktu proses untuk lokasi.

public LatLng getLocationFromAddress(Context context,String strAddress) {

    Geocoder coder = new Geocoder(context);
    List<Address> address;
    LatLng p1 = null;

    try {
        // May throw an IOException
        address = coder.getFromLocationName(strAddress, 5);
        if (address == null) {
            return null;
        }

        Address location = address.get(0);
        p1 = new LatLng(location.getLatitude(), location.getLongitude() );

    } catch (IOException ex) {

        ex.printStackTrace();
    }

    return p1;
}

2
Terima kasih, itu berhasil untuk saya, solusi di atas tidak berfungsi.
Rizwan Sohaib

1
Saat membuat instance Geocoder Anda harus meneruskan konteks Geocoder coder = new Geocoder (this); atau Geocoder baru (getApplicationContext) bukan getActivity () seperti yang dinyatakan dalam jawaban.
The_Martian

1
@Quantumdroid kode di atas ditulis dalam fragmen. Jika tidak, Anda benar sekali. Itu konteksnya.
Nayanesh Gupte

2
Solusi cantik dan bersih. Tidak ada jawaban yang menyebutkan bahwa Geocoder menggunakan akses sinkron, oleh karena itu sangat disarankan untuk meletakkannya di layanan latar belakang untuk menghindari pemblokiran UI.
The_Martian

1
Solusi Hebat. IOException akan dipanggil ketika alamat / kode pos tidak valid dimasukkan. Anda dapat menghindari kesalahan itu dengan sederhana if(address.size() <1){//show a Toast}else{//put rest of code here}
grantespo

51

Jika Anda ingin menempatkan alamat Anda di peta google maka cara mudah menggunakan berikut ini

Intent searchAddress = new  Intent(Intent.ACTION_VIEW,Uri.parse("geo:0,0?q="+address));
startActivity(searchAddress);

ATAU

jika Anda perlu mendapatkan lat panjang dari alamat Anda, gunakan Google Place Api berikut

buat metode yang mengembalikan JSONObject dengan respons Panggilan HTTP seperti berikut

public static JSONObject getLocationInfo(String address) {
        StringBuilder stringBuilder = new StringBuilder();
        try {

        address = address.replaceAll(" ","%20");    

        HttpPost httppost = new HttpPost("http://maps.google.com/maps/api/geocode/json?address=" + address + "&sensor=false");
        HttpClient client = new DefaultHttpClient();
        HttpResponse response;
        stringBuilder = new StringBuilder();


            response = client.execute(httppost);
            HttpEntity entity = response.getEntity();
            InputStream stream = entity.getContent();
            int b;
            while ((b = stream.read()) != -1) {
                stringBuilder.append((char) b);
            }
        } catch (ClientProtocolException e) {
        } catch (IOException e) {
        }

        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject = new JSONObject(stringBuilder.toString());
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return jsonObject;
    }

sekarang teruskan JSONObject itu ke metode getLatLong () seperti berikut

public static boolean getLatLong(JSONObject jsonObject) {

        try {

            longitute = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
                .getJSONObject("geometry").getJSONObject("location")
                .getDouble("lng");

            latitude = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
                .getJSONObject("geometry").getJSONObject("location")
                .getDouble("lat");

        } catch (JSONException e) {
            return false;

        }

        return true;
    }

Saya harap ini membantu Anda dan orang lain .. !! Terima kasih..!!


1
sayangnya solusi ini tidak berfungsi dengan koneksi seluler dari beberapa operator seluler: permintaan selalu mengembalikan OVER_QUERY_LIMIT . Operator seluler tersebut menggunakan overloading NAT, menetapkan IP yang sama ke banyak perangkat ...
Umberto

@UmbySlipKnot Bisakah Anda menjelaskan lebih lanjut tentang OVER_QUERY_LIMIT? Apa itu? Terima kasih.
FariborZ

7

Kode berikut akan berfungsi untuk google apiv2:

public void convertAddress() {
    if (address != null && !address.isEmpty()) {
        try {
            List<Address> addressList = geoCoder.getFromLocationName(address, 1);
            if (addressList != null && addressList.size() > 0) {
                double lat = addressList.get(0).getLatitude();
                double lng = addressList.get(0).getLongitude();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } // end catch
    } // end if
} // end convertAddress

Dimana alamatnya adalah String (123 Testing Rd City State zip) yang ingin Anda ubah ke LatLng.


3

Ini adalah bagaimana Anda dapat menemukan lintang dan bujur di mana kita telah mengklik peta.

public boolean onTouchEvent(MotionEvent event, MapView mapView) 
{   
    //---when user lifts his finger---
    if (event.getAction() == 1) 
    {                
        GeoPoint p = mapView.getProjection().fromPixels(
            (int) event.getX(),
            (int) event.getY());

        Toast.makeText(getBaseContext(), 
             p.getLatitudeE6() / 1E6 + "," + 
             p.getLongitudeE6() /1E6 , 
             Toast.LENGTH_SHORT).show();
    }                            
    return false;
} 

itu bekerja dengan baik.

Untuk mendapatkan alamat lokasi kita bisa menggunakan kelas geocoder.


1

Jawaban dari masalah Kandha di atas:

Itu melempar "layanan java.io.IOException tidak tersedia" saya sudah memberikan izin itu dan menyertakan perpustakaan ... saya bisa mendapatkan tampilan peta ... itu melempar IOException itu di geocoder ...

Saya baru saja menambahkan tangkapan IOException setelah percobaan dan itu memecahkan masalah

    catch(IOException ioEx){
        return null;
    }

0
Geocoder coder = new Geocoder(this);
        List<Address> addresses;
        try {
            addresses = coder.getFromLocationName(address, 5);
            if (addresses == null) {
            }
            Address location = addresses.get(0);
            double lat = location.getLatitude();
            double lng = location.getLongitude();
            Log.i("Lat",""+lat);
            Log.i("Lng",""+lng);
            LatLng latLng = new LatLng(lat,lng);
            MarkerOptions markerOptions = new MarkerOptions();
            markerOptions.position(latLng);
            googleMap.addMarker(markerOptions);
            googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng,12));
        } catch (IOException e) {
            e.printStackTrace();
        }

1
Pemeriksaan nol itu tidak melakukan apa-apa.
AjahnCharles

0
public void goToLocationFromAddress(String strAddress) {
    //Create coder with Activity context - this
    Geocoder coder = new Geocoder(this);
    List<Address> address;

    try {
        //Get latLng from String
        address = coder.getFromLocationName(strAddress, 5);

        //check for null
        if (address != null) {

            //Lets take first possibility from the all possibilities.
            try {
                Address location = address.get(0);
                LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());

                //Animate and Zoon on that map location
                mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
                mMap.animateCamera(CameraUpdateFactory.zoomTo(15));
            } catch (IndexOutOfBoundsException er) {
                Toast.makeText(this, "Location isn't available", Toast.LENGTH_SHORT).show();
            }

        }


    } catch (IOException e) {
        e.printStackTrace();
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.