Обратное геокодирование в приложении для Android - PullRequest
1 голос
/ 17 октября 2010

Я пытаюсь преобразовать текущие данные широты / долготы GeoCode в область администрирования и субадминистрацию с помощью класса Geocoder. Я использую NETWORK_PROVIDER в качестве поставщика местоположения. Вот код, который я использую, и он работает. Проблема в том, что иногда это не дает мне места, иногда это так.

Разрешения для манифеста Android, которые я использую.

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

Вот остальная часть кода, которая время от времени дает мне правильное местоположение, но в остальное время ничего не дает.

            double latPoint = 0;
            double lngPoint = 0;
            List<Address> myList = null;
            getApplicationContext();
            LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            Location recentLoc = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            if (recentLoc != null){
            latPoint = recentLoc.getLatitude();
            lngPoint = recentLoc.getLongitude();

            Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());
            if (myLocation != null){
            try {
                 myList = myLocation.getFromLocation(latPoint, lngPoint, 1);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            if (myList.size()> 0){
                        String AdminArea = myList.get(0).getAdminArea();
                        String SubAdminArea = myList.get(0).getSubAdminArea();
                        String Zipcode = myList.get(0).getPostalCode();

                        String urlocation = SubAdminArea + ", " + AdminArea + " " + Zipcode;

                        Context context1 = getApplicationContext(); 
                        int duration1 = Toast.LENGTH_LONG;
                        CharSequence text1 = urlocation;
                        Toast toast1 = Toast.makeText(context1, text1, duration1);
                        toast1.show();
            }
            }

Существуют ли ограничения у сетевых провайдеров, как часто вы можете запрашивать данные о местоположении?

Как я могу убедиться, что при каждом запуске это может дать мне действительные данные о местоположении.

Заранее благодарим за понимание этого вопроса.

PS: я запустил этот код на моем реальном устройстве под управлением Froyo 2.2 (Verizon Wireless). Целевой уровень API 8 *. 1015 *

Вот что я получил от отладки.

Широта Долгота всегда выбирается, но getFromLocation часто возвращает ноль для данных широты и долготы, переданных ей. Так какой же должен быть обходной путь? Может быть передать информацию о широте / длине в Google Maps API для обратного геокодирования. Будем рады получить любой вклад.

Ответы [ 2 ]

1 голос
/ 09 мая 2012
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET"/>

    public static String getUserLocation(String lat, String lon) {
        String userlocation = null;
        String readUserFeed = readUserLocationFeed(lat.trim() + ","+ lon.trim());
        try {
            JSONObject Strjson = new JSONObject(readUserFeed);
            JSONArray jsonArray = new JSONArray(Strjson.getString("results"));
            userlocation = jsonArray.getJSONObject(1)
                    .getString("formatted_address").toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.i("User Location ", userlocation);
        return userlocation;
    }



      public static String readUserLocationFeed(String address) {
        StringBuilder builder = new StringBuilder();
        HttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?latlng="+ address + "&sensor=false");
        try {
            HttpResponse response = client.execute(httpGet);
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) {
                HttpEntity entity = response.getEntity();
                InputStream content = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
                }
            } else {
                Log.e(ReverseGeocode.class.toString(), "Failed to download file");
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return builder.toString();
    }
1 голос
/ 20 октября 2010

Ну, вот как я это решил.

Поскольку NETWORK_PROVIDER каждый раз предоставляет информацию о широте и долготе, я сначала извлекаю ее для текущего местоположения пользователя.*

Я получил ключ API Карт Google, а затем использовал его для обратного геокодирования данных широты и долготы от поставщика сети.Это вернуло требуемый адрес и почтовый индекс каждый раз в обязательном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...