Adresten enlem ve boylamı nasıl bulabilirim?


Yanıtlar:


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;
    }
}

strAddressadresi içeren bir dizedir. addressDeğişken dönüştürülen adreslerini tutar.


1
"Java.io.IOException hizmeti kullanılamıyor"
Kandha

3
Hizmete erişebilmek için doğru izinlere ihtiyacınız var. # <uses-allow android: name = "android.permission.ACCESS_COARSE_LOCATION" /> <uses-allow android: name = "android.permission.INTERNET" />
Flo,

hangi android api sürümünü oluşturuyorsunuz uygulaması google api'ye sahip olmanız gerekir google api ile oluşturdum 8. projenizde google api klasörünün var olup olmadığını kontrol edin. ve manifest dosyanızda kitaplık com.google.android.maps kullanır
ud_an

1
bu izinleri zaten verdim ve kitaplığı dahil ettim ... harita görünümünü alabilirim ... bu IOException'ı geocoder'da atar ...
Kandha

6
Aşağıdaki @NayAneshGupte tarafından verilen cevaba bakın, GeoPointyeni kütüphanelerde bir sınıf olduğunu sanmıyorum . Bunun yerine kullanın LatLng. stackoverflow.com/a/27834110/2968401
user2968401

81

Ud_an'ın güncellenmiş API'lerle çözümü

Not : LatLng sınıfı, Google Play Hizmetlerinin bir parçasıdır.

Zorunlu :

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

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

Güncelleme: Hedef SDK 23 ve üzeri varsa, konum için çalışma zamanı iznine dikkat ettiğinizden emin olun.

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
Teşekkürler, benim için çalıştı, yukarıdaki çözüm işe yaramadı.
Rizwan Sohaib

1
Geocoder'ı başlatırken bağlam Geocoder coder = new Geocoder (bu); veya yeni Geocoder (getApplicationContext), yanıtta belirtildiği gibi getActivity () değil.
The_Martian

1
@Quantumdroid yukarıdaki kod parça halinde yazılmıştır. Aksi takdirde kesinlikle haklısınız. Bağlam.
Nayanesh Gupte

2
Güzel ve temiz çözüm. Cevapların hiçbiri Geocoder'ın eşzamanlı erişim kullandığından bahsetmediğinden, UI'yi engellemekten kaçınmak için bunu bir arka plan hizmetine koymanız şiddetle tavsiye edilir.
The_Martian

1
Harika Çözüm. Geçersiz adres / posta kodu girildiğinde IOException çağrılacaktır. Bu hatayı basit bir şekilde önleyebilirsiniz if(address.size() <1){//show a Toast}else{//put rest of code here}
grantespo

51

Adresinizi google haritasına yerleştirmek istiyorsanız, aşağıdakileri kullanmanın kolay yolu

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

VEYA

Adresinizden en uzun süre gitmeniz gerekiyorsa, aşağıdaki Google Place Api'yi kullanın

Aşağıdaki gibi HTTP Çağrısının yanıtıyla JSONObject döndüren bir yöntem oluşturun

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;
    }

şimdi bu JSONObject'i aşağıdaki gibi getLatLong () yöntemine geçirin

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;
    }

Umarım bu size ve başkalarına yardımcı olur .. !! Teşekkür ederim..!!


1
ne yazık ki bu çözüm bazı mobil operatörlerin mobil bağlantısıyla çalışmıyor: istek her zaman OVER_QUERY_LIMIT döndürüyor . Bu mobil operatörler NAT aşırı yüklemesini kullanıyor, aynı IP'yi birçok cihaza
atıyor

@UmbySlipKnot OVER_QUERY_LIMIT hakkında daha fazla açıklama yapabilir misiniz? O nedir? teşekkür ederim.
FariborZ

7

Aşağıdaki kod Google apiv2 için çalışacaktır:

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

Adres, LatLng'ye dönüştürmek istediğiniz Dizedir (123 Test Rd Şehir Eyaleti posta kodu).


3

Haritaya tıkladığımız yerin enlem ve boylamını bu şekilde bulabilirsiniz.

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;
} 

iyi çalışıyor.

Konumun adresini almak için geocoder sınıfını kullanabiliriz.


1

Yukarıdaki Kandha sorununa bir cevap:

"Java.io.IOException hizmeti mevcut değil" i atar, bunlara zaten izin verdim ve kitaplığı dahil ettim ... harita görünümünü alabilirim ... geocoder'da bu IOException'ı atar ...

Sadece denemeden sonra bir catch IOException ekledim ve sorunu çözdü

    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
Bu boş kontrol hiçbir şey yapmıyor.
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();
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.