Làm cách nào tôi có thể tìm vĩ độ và kinh độ từ địa chỉ?


Câu trả lời:


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

strAddresslà một chuỗi chứa địa chỉ. Các addressbiến giữ các địa chỉ được chuyển đổi.


1
Nó ném "dịch vụ java.io.IOException không khả dụng"
Kandha

3
Bạn cần có quyền phù hợp để có thể truy cập dịch vụ. # <use-allow android: name = "android.permission.ACCESS_COARSE_LOCATION" /> <use-allow android: name = "android.permission.INTERNET" />
Flo

Phiên bản api android nào bạn đang xây dựng ứng dụng, bạn cần có sẵn google api. Tôi đã xây dựng với google api 8. Kiểm tra xem thư mục google api có trong dự án của bạn không. và trong tệp kê khai của bạn, thêm vào sử dụng thư viện com.google.android.maps
ud_an

1
tôi đã đưa ra những phép và bao gồm thư viện ... tôi có thể nhận xem bản đồ ... nó ném mà IOException tại geocoder ...
Kandha

6
Hãy xem câu trả lời của @NayAneshGupte bên dưới, tôi không nghĩ rằng có một GeoPointlớp trong các thư viện mới. Thay vào đó sử dụng LatLng. stackoverflow.com/a/27834110/2968401
user2968401

80

Giải pháp của Ud_an với API được cập nhật

Lưu ý : Lớp LatLng là một phần của Dịch vụ Google Play.

Bắt buộc :

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

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

Cập nhật: Nếu bạn có SDK mục tiêu 23 trở lên, hãy đảm bảo bạn quan tâm đến quyền thời gian chạy cho vị trí.

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
Cảm ơn, nó đã làm việc cho tôi, giải pháp trên không hoạt động.
Rizwan Sohaib

1
Khi khởi tạo Geocoder, bạn nên chuyển ngữ cảnh Geocoder coder = new Geocoder (this); hoặc Geocoder mới (getApplicationContext) không getActivity () như đã nêu trong câu trả lời.
The_Martian

1
@Quantumdroid ở trên mã được viết dưới dạng phân đoạn. Nếu không thì bạn hoàn toàn chính xác. Đó là bối cảnh.
Nayanesh Gupte

2
Dung dịch đẹp và sạch. Không có câu trả lời nào đề cập đến việc Bộ mã hóa địa lý sử dụng quyền truy cập đồng bộ, vì vậy, bạn nên đặt tính năng này trong dịch vụ nền để tránh chặn giao diện người dùng.
The_Martian

1
Giải pháp tuyệt vời. IOException sẽ được gọi khi nhập địa chỉ / mã zip không hợp lệ. Bạn có thể tránh lỗi đó bằng một đơn giản if(address.size() <1){//show a Toast}else{//put rest of code here}
Grantespo

51

Nếu bạn muốn đặt địa chỉ của mình trên google map thì cách dễ dàng sử dụng sau đây

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

HOẶC LÀ

nếu bạn cần thời gian chờ từ địa chỉ của mình, hãy sử dụng Google Place Api sau

tạo một phương thức trả về một JSONObject với phản hồi của HTTP Call như sau

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

bây giờ chuyển JSONObject đó đến phương thức getLatLong () như sau

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

Tôi hy vọng điều này sẽ giúp bạn và những người khác .. !! Cảm ơn bạn..!!


1
rất tiếc, giải pháp này không hoạt động với kết nối di động của một số nhà khai thác di động: yêu cầu luôn trả về OVER_QUERY_LIMIT . Những nhà khai thác di động sử dụng quá tải NAT, gán cùng một IP với nhiều thiết bị ...
Umberto

@UmbySlipKnot Bạn có thể giải thích thêm về OVER_QUERY_LIMIT không? Đó là gì? cảm ơn bạn.
FariborZ

7

Mã sau sẽ hoạt động cho 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

Địa chỉ ở đâu là String (123 Testing Rd City State zip) bạn muốn chuyển đổi sang LatLng.


3

Đây là cách bạn có thể tìm vĩ độ và kinh độ của nơi chúng tôi đã nhấp vào bản đồ.

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

nó hoạt động tốt.

Để lấy địa chỉ của vị trí, chúng ta có thể sử dụng lớp mã hóa địa lý.


1

Một câu trả lời cho vấn đề Kandha ở trên:

Nó ném "dịch vụ java.io.IOException không khả dụng" tôi đã cấp những quyền đó và bao gồm thư viện ... tôi có thể xem bản đồ ... nó ném rằng IOException tại geocoder ...

Tôi vừa thêm một IOException bắt sau khi thử và nó đã giải quyết được sự cố

    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
Kiểm tra null đó không làm bất cứ điều gì.
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();
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.