【问题标题】:Get the particular address using latitude and longitude [duplicate]使用纬度和经度获取特定地址[重复]
【发布时间】:2013-05-07 02:39:46
【问题描述】:

我需要知道是否有任何 API,我可以从那里接收当前地点的地址。使用位置管理器我已经收到了当前地点的纬度和经度,但我需要地址。

我已经尝试了下面的 api。

http://maps.googleapis.com/maps/api/geocode/json?latlng="+ lat + "," + lon + &sensor=true"

但它没有显示确切的位置。有人可以帮助我吗。@谢谢

【问题讨论】:

标签: android geolocation


【解决方案1】:

Geocoder 对象,您可以调用getFromLocation(double, double, int) 方法。

喜欢:-

private String getAddress(double latitude, double longitude) {
        StringBuilder result = new StringBuilder();
        try {
            Geocoder geocoder = new Geocoder(this, Locale.getDefault());
            List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
            if (addresses.size() > 0) {
                Address address = addresses.get(0);
                result.append(address.getLocality()).append("\n");
                result.append(address.getCountryName());
            }
        } catch (IOException e) {
            Log.e("tag", e.getMessage());
        }

        return result.toString();
    }

另一个最佳答案在这里How to get city name from latitude and longitude coordinates in Google Maps?

【讨论】:

  • 感谢使用上面的代码我可以得到确切的地址位置
  • 让我检查一下,+1 为您提供帮助
  • 不行,地址总是空的,没有错误,没有异常,只有空。
【解决方案2】:

我创建了一个类,用于获取特定纬度、经度的地址。你可以用这个:

public class getReverseGeoCoding {
    private String Address1 = "", Address2 = "", City = "", State = "", Country = "", County = "", PIN = "";

    public void getAddress() {
        Address1 = "";
        Address2 = "";
        City = "";
        State = "";
        Country = "";
        County = "";
        PIN = "";

        try {

            JSONObject jsonObj = parser_Json.getJSONfromURL("http://maps.googleapis.com/maps/api/geocode/json?latlng=" + Global.curLatitude + ","
                    + Global.curLongitude + "&sensor=true");
            String Status = jsonObj.getString("status");
            if (Status.equalsIgnoreCase("OK")) {
                JSONArray Results = jsonObj.getJSONArray("results");
                JSONObject zero = Results.getJSONObject(0);
                JSONArray address_components = zero.getJSONArray("address_components");

                for (int i = 0; i < address_components.length(); i++) {
                    JSONObject zero2 = address_components.getJSONObject(i);
                    String long_name = zero2.getString("long_name");
                    JSONArray mtypes = zero2.getJSONArray("types");
                    String Type = mtypes.getString(0);

                    if (TextUtils.isEmpty(long_name) == false || !long_name.equals(null) || long_name.length() > 0 || long_name != "") {
                        if (Type.equalsIgnoreCase("street_number")) {
                            Address1 = long_name + " ";
                        } else if (Type.equalsIgnoreCase("route")) {
                            Address1 = Address1 + long_name;
                        } else if (Type.equalsIgnoreCase("sublocality")) {
                            Address2 = long_name;
                        } else if (Type.equalsIgnoreCase("locality")) {
                            // Address2 = Address2 + long_name + ", ";
                            City = long_name;
                        } else if (Type.equalsIgnoreCase("administrative_area_level_2")) {
                            County = long_name;
                        } else if (Type.equalsIgnoreCase("administrative_area_level_1")) {
                            State = long_name;
                        } else if (Type.equalsIgnoreCase("country")) {
                            Country = long_name;
                        } else if (Type.equalsIgnoreCase("postal_code")) {
                            PIN = long_name;
                        }
                    }

                    // JSONArray mtypes = zero2.getJSONArray("types");
                    // String Type = mtypes.getString(0);
                    // Log.e(Type,long_name);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public String getAddress1() {
        return Address1;

    }

    public String getAddress2() {
        return Address2;

    }

    public String getCity() {
        return City;

    }

    public String getState() {
        return State;

    }

    public String getCountry() {
        return Country;

    }

    public String getCounty() {
        return County;

    }

    public String getPIN() {
        return PIN;

    }

}

JSON 解析器类

public class parser_Json {
    public static JSONObject getJSONfromURL(String url) {

        // initialize
        InputStream is = null;
        String result = "";
        JSONObject jObject = null;

        // http post
        try {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

        } catch (Exception e) {
            Log.e("log_tag", "Error in http connection " + e.toString());
        }

        // convert response to string
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();
        } catch (Exception e) {
            Log.e("log_tag", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObject = new JSONObject(result);
        } catch (JSONException e) {
            Log.e("log_tag", "Error parsing data " + e.toString());
        }

        return jObject;
    }

}

【讨论】:

  • curLongitude 未被识别。有什么办法可以解决吗?
  • 只需在 Global.curLongitude 和 Global.curLatitude 的地方传递你的经纬度即可。
  • 非常感谢,但我在 logcat 02-26 16:48:21.900 31246-31246/guide_me_for_all.guide_me_for_all E/log_tag﹕ Error in http connection android.os.NetworkOnMainThreadException 02-26 16:48:21.900 31246-31246/guide_me_for_all.guide_me_for_all E/log_tag﹕ Error converting result java.lang.NullPointerException: lock == null 02-26 16:48:21.910 31246-31246/guide_me_for_all.guide_me_for_all E/log_tag﹕ Error parsing data org.json.JSONException: End of input at character 0 of 中收到此错误,在此 if (Status.equalsIgnoreCase("OK")) { 中收到空指针异常。
  • 当应用程序尝试在其主线程上执行网络操作时会引发此异常。尝试在 AsyncTask 中运行您的代码。有关更多详细信息,请参阅此链接link
  • 真棒小子
【解决方案3】:
    String longti = "0";
    String lati = "0";
    LocationManager locationManager;

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                        1000, 1, new MyLocationListners());

    final Location location = locationManager
                    .getLastKnownLocation(LocationManager.GPS_PROVIDER); 

//these are your longtitude and latitude  
         lati = String.valueOf(location.getLatitude());  
         longti = String.valueOf(location.getLongitude());

//here we are getting the address using the geo codes(longtitude and latitude). 

 String ad = getAddress(location.getLatitude(),location.getLongitude());


    private String getAddress(double LATITUDE, double LONGITUDE) {
        String strAdd = "";
        Geocoder geocoder = new Geocoder(this, Locale.getDefault());
        try {
            List<Address> addresses = geocoder.getFromLocation(LATITUDE,
                    LONGITUDE, 1);
            if (addresses != null) {
                Address returnedAddress = addresses.get(0);
                StringBuilder strReturnedAddress = new StringBuilder("");

                for (int i = 0; i < returnedAddress.getMaxAddressLineIndex(); i++) {
                    strReturnedAddress
                            .append(returnedAddress.getAddressLine(i)).append(
                                    "\n");
                }
                strAdd = strReturnedAddress.toString();
                Log.w("My Current loction address",
                        "" + strReturnedAddress.toString());
            } else {
                Log.w("My Current loction address", "No Address returned!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.w("My Current loction address", "Canont get Address!");
        }
        return strAdd;
    }

public class MyLocationListners implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }

    }

//确保gps和互联网已开启 //有时,由于某些//google服务问题,在您第一次运行代码时位置将不可见,因此您必须重新启动手机 //希望对你有帮助

【讨论】:

    【解决方案4】:

    我已尝试修改Vipul Purohit answer 给出的类以使其更好

    public class ReverseGeoCoding {
    private String address1, address2, city, state, country, county, PIN;
    private static final String LOG_TAG = ReverseGeoCoding.class.getSimpleName();
    
    public ReverseGeoCoding(double latitude, double longitude) {
        init();
        retrieveData(latitude, longitude);
    }
    
    private void retrieveData(double latitude, double longitude) {
        try {
            String responseFromHttpUrl = getResponseFromHttpUrl(buildUrl(latitude, longitude));
            JSONObject jsonResponse = new JSONObject(responseFromHttpUrl);
            String status = jsonResponse.getString("status");
            if (status.equalsIgnoreCase("OK")) {
                JSONArray results = jsonResponse.getJSONArray("results");
                JSONObject zero = results.getJSONObject(0);
                JSONArray addressComponents = zero.getJSONArray("address_components");
    
                for (int i = 0; i < addressComponents.length(); i++) {
                    JSONObject zero2 = addressComponents.getJSONObject(i);
                    String longName = zero2.getString("long_name");
                    JSONArray types = zero2.getJSONArray("types");
                    String type = types.getString(0);
    
    
                    if (!TextUtils.isEmpty(longName)) {
                        if (type.equalsIgnoreCase("street_number")) {
                            address1 = longName + " ";
                        } else if (type.equalsIgnoreCase("route")) {
                            address1 = address1 + longName;
                        } else if (type.equalsIgnoreCase("sublocality")) {
                            address2 = longName;
                        } else if (type.equalsIgnoreCase("locality")) {
                            // address2 = address2 + longName + ", ";
                            city = longName;
                        } else if (type.equalsIgnoreCase("administrative_area_level_2")) {
                            county = longName;
                        } else if (type.equalsIgnoreCase("administrative_area_level_1")) {
                            state = longName;
                        } else if (type.equalsIgnoreCase("country")) {
                            country = longName;
                        } else if (type.equalsIgnoreCase("postal_code")) {
                            PIN = longName;
                        }
                    }
                }
            }
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private void init() {
        address1 = "";
        address2 = "";
        city = "";
        state = "";
        country = "";
        county = "";
        PIN = "";
    }
    
    private URL buildUrl(double latitude, double longitude) {
        Uri uri = Uri.parse("http://maps.googleapis.com/maps/api/geocode/json").buildUpon()
                .appendQueryParameter("latlng", latitude + "," + longitude)
                .build();
        try {
            return new URL(uri.toString());
        } catch (MalformedURLException e) {
            e.printStackTrace();
            Log.e(LOG_TAG, "can't construct location object");
            return null;
        }
    }
    
    private String getResponseFromHttpUrl(URL url) throws IOException {
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        try {
            InputStream in = urlConnection.getInputStream();
            Scanner scanner = new Scanner(in);
            scanner.useDelimiter("\\A");
            if (scanner.hasNext()) {
                return scanner.next();
            } else {
                return null;
            }
        } finally {
            urlConnection.disconnect();
        }
    }
    
    public String getAddress1() { return address1; }
    
    public String getAddress2() { return address2; }
    
    public String getCity() { return city; }
    
    public String getState() { return state; }
    
    public String getCountry() { return country; }
    
    public String getCounty() { return county; }
    
    public String getPIN() { return PIN; }
    
    }
    

    【讨论】:

    • 修改了你的答案。检查上面
    【解决方案5】:

    这么多人给出了这么多答案,但都错过了最关键的部分。以下是我如何做到这一点:您需要一个 API 密钥。 https://developers.google.com/maps/documentation/android-api/signup 只是花点时间耐心地浏览代码。我在片段中使用了内部类。 代码:-

    private class DownloadRawData extends AsyncTask<LatLng, Void, ArrayList<String>> {
    
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                  progressDialog=new ProgressDialog(getActivity());
                progressDialog.setMessage("Loading........");
                progressDialog.setCancelable(false);
                progressDialog.show();
            }
    
    
            @Override
            protected ArrayList<String> doInBackground(LatLng... latLng) {
                ArrayList<String> strings=retrieveData(latLng[0].latitude,latLng[0].longitude);
                return strings;
            }
    
            @Override
            protected void onPostExecute(ArrayList<String> s) {
                super.onPostExecute(s);
                if(progressDialog!=null)
                progressDialog.dismiss();
                LocationInfoDialog locationinfoDialog=new LocationInfoDialog(getActivity(),s);
                locationinfoDialog.show();
                locationinfoDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                locationinfoDialog.setCancelable(false);
            }
        }
    
        private void init() {
            address1 = "";
            address2 = "";
            city = "";
            state = "";
            country = "";
            county = "";
            PIN = "";
        }
        private String createUrl(double latitude, double longitude) throws UnsupportedEncodingException {
            init();
            return "https://maps.googleapis.com/maps/api/geocode/json?" + "latlng=" + latitude + "," + longitude + "&key=" + getActivity().getResources().getString(R.string.map_apiid);
        }
    
        private URL buildUrl(double latitude, double longitude) {
    
            try {
                Log.w(TAG, "buildUrl: "+createUrl(latitude,longitude));
                return new URL(createUrl(latitude,longitude));
            } catch (MalformedURLException e) {
                e.printStackTrace();
                Log.e(LOG_TAG, "can't construct location object");
                return null;
            }
            catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        private String getResponseFromHttpUrl(URL url) throws IOException {
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            try {
                InputStream in = urlConnection.getInputStream();
                Scanner scanner = new Scanner(in);
                scanner.useDelimiter("\\A");
                if (scanner.hasNext()) {
                    return scanner.next();
                } else {
                    return null;
                }
            } finally {
                urlConnection.disconnect();
            }
        }
    
        public String getAddress1() { return address1; }
    
        public String getAddress2() { return address2; }
    
        public String getCity() { return city; }
    
        public String getState() { return state; }
    
        public String getCountry() { return country; }
    
        public String getCounty() { return county; }
    
        public String getPIN() { return PIN; }
        private ArrayList<String> retrieveData(double latitude, double longitude) {
            ArrayList<String> strings=new ArrayList<>();
            try {
                String responseFromHttpUrl = getResponseFromHttpUrl(buildUrl(latitude, longitude));
                JSONObject jsonResponse = new JSONObject(responseFromHttpUrl);
                String status = jsonResponse.getString("status");
                if (status.equalsIgnoreCase("OK")) {
                    JSONArray results = jsonResponse.getJSONArray("results");
                    JSONObject zero = results.getJSONObject(0);
                    JSONArray addressComponents = zero.getJSONArray("address_components");
                    String formatadd= zero.getString("formatted_address");
    
                    for (int i = 0; i < addressComponents.length(); i++) {
                        JSONObject zero2 = addressComponents.getJSONObject(i);
                        String longName = zero2.getString("long_name");
                        JSONArray types = zero2.getJSONArray("types");
                        String type = types.getString(0);
    
    
                        if (!TextUtils.isEmpty(longName)) {
                            if (type.equalsIgnoreCase("street_number")) {
                                address1 = longName + " ";
    
                            } else if (type.equalsIgnoreCase("route")) {
                                address1 = address1 + longName;
                            } else if (type.equalsIgnoreCase("sublocality")) {
                                address2 = longName;
                            } else if (type.equalsIgnoreCase("locality")) {
                                // address2 = address2 + longName + ", ";
                                city = longName;
                            } else if (type.equalsIgnoreCase("administrative_area_level_2")) {
                                county = longName;
                            } else if (type.equalsIgnoreCase("administrative_area_level_1")) {
                                state = longName;
                            } else if (type.equalsIgnoreCase("country")) {
                                country = longName;
                            } else if (type.equalsIgnoreCase("postal_code")) {
                                PIN = longName;
                            }
                        }
                    }
                    strings.add(formatadd);
                    strings.add(address1);
                    strings.add(address2);
                    strings.add(city);
                    strings.add(county);
                    strings.add(state);
                    strings.add(country);
    
                    strings.add(PIN);
    
    
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
            return  strings;
        }
    

    初始化如下:-

    googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
                @Override
                public void onMapClick(LatLng latLng) {
                    markerOptions.position(latLng);
    
                    // Setting the title for the marker.
                    // This will be displayed on taping the marker
                    markerOptions.title(latLng.latitude + " : " + latLng.longitude);
                    googleMap.addMarker(markerOptions);
                    new DownloadRawData().execute(latLng);
                }
            });
    

    【讨论】:

      【解决方案6】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多