ฉันจะหาละติจูดและลองจิจูดจากที่อยู่ได้อย่างไร


111

ฉันต้องการแสดงตำแหน่งของที่อยู่ใน Google Maps

ฉันจะหาละติจูดและลองจิจูดของที่อยู่โดยใช้ Google Maps API ได้อย่างไร


ฉันมีปัญหาเดียวกันดูการแก้ปัญหาของฉันที่นี่ stackoverflow.com/a/19170557/2621050
Bruno Pinto

คำตอบ:


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

strAddressคือสตริงที่มีที่อยู่ addressตัวแปรถืออยู่แปลง


1
มันพ่น "java.io.IOException service not available"
Kandha

3
คุณต้องมีสิทธิ์ที่ถูกต้องจึงจะสามารถเข้าถึงบริการได้ # <ใช้อนุญาตหุ่นยนต์: name = "android.permission.ACCESS_COARSE_LOCATION" /> <ใช้อนุญาตหุ่นยนต์: name = "android.permission.INTERNET" />
Flo

Android api เวอร์ชันใดที่คุณกำลังสร้างแอปพลิเคชันที่คุณต้องมี google api ฉันสร้างด้วย google api 8 ตรวจสอบว่ามีโฟลเดอร์ google api อยู่ในโครงการ และในไฟล์ Manifest ของคุณใช้ไลบรารี com.google.android.maps
ud_an

1
ฉันให้สิทธิ์เหล่านั้นแล้วและรวมไลบรารี ... ฉันสามารถดูแผนที่ได้ ... มันพ่น IOException ที่ geocoder ...
Kandha

6
ตรวจสอบคำตอบโดย @NayAneshGupte ด้านล่างฉันไม่คิดว่าจะมีGeoPointคลาสในไลบรารีใหม่ ใช้แทนLatLng. stackoverflow.com/a/27834110/2968401
user2968401

81

โซลูชันของ Ud_an พร้อม API ที่อัปเดตแล้ว

หมายเหตุ : คลาสLatLngเป็นส่วนหนึ่งของบริการ Google Play

บังคับ :

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

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

อัปเดต:หากคุณมี SDK เป้าหมาย 23 ขึ้นไปตรวจสอบให้แน่ใจว่าคุณดูแลสิทธิ์รันไทม์สำหรับตำแหน่ง

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
ขอบคุณมันใช้งานได้สำหรับฉันวิธีแก้ปัญหาข้างต้นไม่ทำงาน
Rizwan Sohaib

1
เมื่อสร้างอินสแตนซ์ Geocoder คุณควรส่งบริบท Geocoder coder = Geocoder ใหม่ (สิ่งนี้); หรือ Geocoder ใหม่ (getApplicationContext) ไม่ใช่ getActivity () ตามที่ระบุไว้ในคำตอบ
The_Martian

1
@Quantumdroid โค้ดด้านบนเขียนในส่วนย่อย มิฉะนั้นคุณจะถูกต้อง มันเป็นบริบท
Nayanesh Gupte

2
โซลูชันที่สวยงามและสะอาด ไม่มีคำตอบใดที่ระบุว่า Geocoder ใช้การเข้าถึงแบบซิงโครนัสดังนั้นขอแนะนำอย่างยิ่งให้วางสิ่งนี้ไว้ในบริการพื้นหลังเพื่อหลีกเลี่ยงการปิดกั้น UI
The_Martian

1
ทางออกที่ดี IOException จะถูกเรียกเมื่อป้อนที่อยู่ / รหัสไปรษณีย์ไม่ถูกต้อง คุณสามารถหลีกเลี่ยงข้อผิดพลาดนั้นได้อย่างง่ายดาย if(address.size() <1){//show a Toast}else{//put rest of code here}
Grantespo

51

หากคุณต้องการวางที่อยู่ของคุณในแผนที่ Google วิธีง่ายๆในการใช้ดังต่อไปนี้

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

หรือ

หากคุณต้องการ lat long จากที่อยู่ของคุณให้ใช้Google Place Apiดังต่อไปนี้

สร้างเมธอดที่ส่งคืนJSONObjectด้วยการตอบสนองของHTTP Callดังต่อไปนี้

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

ตอนนี้ส่งJSONObjectไปที่ getLatLong () วิธีการดังต่อไปนี้

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

หวังว่านี่จะช่วยคุณและคนอื่น ๆ .. !! ขอบคุณ..!!


1
น่าเสียดายที่โซลูชันนี้ใช้ไม่ได้กับการเชื่อมต่อมือถือของผู้ให้บริการมือถือบางรายคำขอจะส่งคืนOVER_QUERY_LIMITเสมอ ผู้ให้บริการมือถือเหล่านั้นใช้ NAT มากเกินไปกำหนด IP เดียวกันให้กับอุปกรณ์จำนวนมาก ...
Umberto

@UmbySlipKnot คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับ OVER_QUERY_LIMIT ได้หรือไม่ นั่นคืออะไร? ขอบคุณ.
FariborZ

7

รหัสต่อไปนี้จะใช้ได้กับ 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

โดยที่อยู่คือ String (123 Testing Rd City State zip) ที่คุณต้องการแปลงเป็น LatLng


3

นี่คือวิธีที่คุณสามารถค้นหาละติจูดและลองจิจูดของตำแหน่งที่เราคลิกบนแผนที่

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

มันทำงานได้ดี

ในการรับที่อยู่ของสถานที่เราสามารถใช้ geocoder class


1

คำตอบสำหรับปัญหา Kandha ด้านบน:

มันพ่น "บริการ java.io.IOException ไม่พร้อมใช้งาน" ฉันได้ให้สิทธิ์เหล่านั้นแล้วและรวมไลบรารี ... ฉันสามารถรับมุมมองแผนที่ ... มันพ่น IOException ที่ geocoder ...

ฉันเพิ่งเพิ่ม IOException ที่จับได้หลังจากการลองและมันแก้ปัญหาได้

    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
การตรวจสอบว่างนั้นไม่ได้ทำอะไรเลย
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();
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.