0

У меня возникает проблема, когда мне нужно получить долготу/широту от адреса, который передается в AsyncTask, который извлекает статическую карту Google.Проблема, связанная с получением долготы/широты с помощью Google Статических карт

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

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как я могу получить координаты передаваемого адреса. Кто-нибудь знает способ, которым я могу получить Long/Lat? Единственный способ, которым я понял, как это сделать, - использовать другую AsyncTask. Я бы предпочел не делать 2 запроса.

CREATE Статическая карта класса CreateStaticMapAsyncTask расширяет AsyncTask {

private static final String STATIC_MAPS_API_BASE = "https://maps.googleapis.com/maps/api/staticmap"; 
    private static final String STATIC_MAPS_API_SIZE = "300x300"; 

    @Override 
    protected void onPreExecute() { 
     addTask(); // adds one to task count. 
     super.onPreExecute(); 

    } 

    @Override 
    protected Bitmap doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     locationString = params[0]; 
     Log.e("LOCATION STRING", locationString); 
     Bitmap bmp = null; 
     StringBuilder sb = new StringBuilder(STATIC_MAPS_API_BASE); 
     try { 
      sb.append("?center=").append(
        URLEncoder.encode(locationString, "UTF-8")); 
     } catch (UnsupportedEncodingException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     sb.append("&size=" + STATIC_MAPS_API_SIZE); 
     sb.append("&key=" + API_KEY); 
     String url = new String(sb.toString()); 
     Log.e("URL", sb.toString()); 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(url); 

     InputStream in = null; 
     try { 
      in = httpclient.execute(request).getEntity().getContent(); 
      bmp = BitmapFactory.decodeStream(in); 
      in.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return bmp; 

    } 

    protected void onPostExecute(Bitmap bmp) { 
     super.onPostExecute(bmp); 
     if (bmp != null) { 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 
      data = stream.toByteArray(); 
      removeTask(); 
      // allTasksComplete(); 

     } 
    } 
} 

ответ

0

Вам нужен Geocoder класс.

Класс для обработки геокодирования и обратного геокодирования. Геокодирование - это процесс преобразования уличного адреса или другого описания местоположения в координату (широта, долгота).

Если вы идете по the example, вы увидите, что Geocoder используется в фоновом потоке. Поскольку у вас уже есть AsyncTask, вы можете добавить код в doInBackground(). Этот пример нужно будет изменить, потому что вам нужна широта и долгота от адреса, а не наоборот.

Вам потребуется getFromLocationName() метод:

Возвращает массив адресов, которые известны для описания местоположения по имени , который может быть название места, такие как «Dalvik, Исландия», в адрес такого как «1600 Amphitheatre Parkway, Mountain View, CA», код аэропорта , такой как «SFO» и т. д. Возвращенные адреса будут локализованы для локали, предоставленной конструктору этого класса.

Затем с объекта Address вы можете получить широту и долготу.