2013-03-03 11 views

risposta

11

Uso Geocoder:

Geocoder geoCoder = new Geocoder(context); 
List<Address> matches = geoCoder.getFromLocation(latitude, longitude, 1); 
Address bestMatch = (matches.isEmpty() ? null : matches.get(0)); 
+0

Ho fatto questo per la geocodifica e works.My problema è che voglio fare retromarcia geocoding.From un punto di carta ottenere il indirizzo. Ma grazie comunque! – Dimitris

+1

GeoCoder esegue anche il reverse geocoding - Ho aggiornato il mio codice per utilizzare getFromLocation, che include latitudine e longitudine e inverte geocodifica in un indirizzo. – ianhanniballake

+0

@ianhanniballake è corretto, dovrai usare 'GeoCoder'. Solo per aggiungere un commento aggiuntivo ho formattato il mio indirizzo in quanto tale: 'String addressText = String.format ("% s,% s,% s ", \t bestMatch.getMaxAddressLineIndex()> 0? BestMatch.getAddressLine (0):" ", \t bestMatch.getLocality(), \t bestMatch.getCountryName());'. Questo mi permette di visualizzare l'indirizzo stradale all'utente semplicemente passando il valore 'addressText' via toast. – cking24343

3

Questo è come funziona per me ..

MarkerOptions markerOptions; 

Location myLocation; 
Button btLocInfo; 

String selectedLocAddress; 
    private GoogleMap myMap; 
LatLng latLng; 
LatLng tmpLatLng; 
    @Override 
public void onMapLongClick(LatLng point) { 

    // Getting the Latitude and Longitude of the touched location 
    latLng = point; 
    // Clears the previously touched position 
    myMap.clear(); 
    // Animating to the touched position 
    myMap.animateCamera(CameraUpdateFactory.newLatLng(latLng)); 
    // Creating a marker 
    markerOptions = new MarkerOptions(); 
    // Setting the position for the marker 
    markerOptions.position(latLng); 
    // Adding Marker on the touched location with address 

    new ReverseGeocodingTask(getBaseContext()).execute(latLng); 
    //tmpLatLng = latLng; 

    btLocInfo.setEnabled(true); 


    btLocInfo.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      double[] coordinates={tmpLatLng.latitude/1E6,tmpLatLng.longitude/1E6}; 

      double latitude = tmpLatLng.latitude; 
      double longitude = tmpLatLng.longitude; 

      Log.i("selectedCoordinates", latitude + " " + longitude); 
      Log.i("selectedLocAddress", selectedLocAddress); 


     } 
    }); 
} 


private class ReverseGeocodingTask extends AsyncTask<LatLng, Void, String>{ 
    Context mContext; 
    public ReverseGeocodingTask(Context context){ 
     super(); 
     mContext = context; 
     } 
    // Finding address using reverse geocoding 
    @Override 
    protected String doInBackground(LatLng... params) { 
     Geocoder geocoder = new Geocoder(mContext); 
     double latitude = params[0].latitude; 
     double longitude = params[0].longitude; 
     List<Address> addresses = null; 
     String addressText=""; 
     try { 
      addresses = geocoder.getFromLocation(latitude, longitude,1); 
      Thread.sleep(500); 


     if(addresses != null && addresses.size() > 0){ 
      Address address = addresses.get(0); 
      addressText = String.format("%s, %s, %s", 
        address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "", 
          address.getLocality(), 
          address.getCountryName()); 
      } 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     selectedLocAddress = addressText; 
     return addressText; 
    } 

    @Override 
    protected void onPostExecute(String addressText) { 
     // Setting the title for the marker. 
     // This will be displayed on taping the marker 
     markerOptions.title(addressText); 
     // Placing a marker on the touched position 
     myMap.addMarker(markerOptions); 
     } 
    } 
4

Si può fare reverse-geocoding in due modi

  • Geocoder
  • Google API

Geocoder Esso deve essere eseguito in un thread separato:

private class FindPlaces extends AsyncTask<String, Void, List<Address>> { 

    @Override 
    protected List<Address> doInBackground(String... params) { 
     if (act == null) 
      this.cancel(true); 
     Geocoder geocoder = new Geocoder(act, Locale.getDefault()); 
     try { 
      addresses = geocoder.getFromLocation(
        Double.parseDouble(params[0]), 
        Double.parseDouble(params[1]), result); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return addresses; 
    } 

    @Override 
    protected void onPostExecute(List<Address> addresses) { 
     super.onPostExecute(addresses); 
     if (act == null) 
      return; 
     if (addresses == null || addresses.size() == 0) { 
      Toast.makeText(act, "No location found", Toast.LENGTH_SHORT) 
        .show(); 
      return; 
     } 
     address = addresses.get(0); 

     String aLine = ""; 
     for (int addr = 0; addr <= address.getMaxAddressLineIndex() - 2; addr++) { 
      aLine = aLine.length() > 0 ? aLine + ", " 
        + String.valueOf(address.getAddressLine(addr)) : String 
        .valueOf(address.getAddressLine(addr)); 
     } 
     address.setAddressLine(0, aLine); 
     if (act == null) 
      return; 

    } 
} 

Google API 1) Attivazione di Google Maps Geocoding API nella console google 2) concatenare tuo LatLong in questo URL https://maps.googleapis.com/maps/api/geocode/json?latlng=

Ad esempio: https://maps.googleapis.com/maps/api/geocode/json?latlng=youlatitude,yourlongitude&key=yourapikey

Chiamare l'asyntask sottostante con il tuo latlog Questo funziona per me ..

public class ReverseGecoding extends AsyncTask<Double, Void, String> { 

Context context;** 
private Address address; 
private String GEOCODINGKEY = "&key=YourKey"; 
private String REVERSE_GEOCODING_URL = "https://maps.googleapis.com/maps/api/geocode/json?latlng="; 

public ReverseGecoding(Context context) { 
    this.context = context; 
    this.listener = listener; 
} 

@Override 
protected String doInBackground(Double... params) { 
    if (params[0] != null) { 
     String result = ""; 
    try { 
     String mUrl = REVERSE_GEOCODING_URL + params[0] + "," 
       + params[1] + GEOCODINGKEY; 

     URL url = new URL(mUrl); 
     HttpURLConnection httpsURLConnection = (HttpURLConnection) url.openConnection(); 
     httpsURLConnection.setReadTimeout(10000); 
     httpsURLConnection.setConnectTimeout(15000); 
     httpsURLConnection.setDoInput(true); 
     httpsURLConnection.setRequestMethod("GET"); 
     httpsURLConnection.connect(); 
     int mStatus = httpsURLConnection.getResponseCode(); 
     if (mStatus == 200) 
      return readResponse(httpsURLConnection.getInputStream()).toString(); 
     return result; 

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

    } 
    return null; 

} 



private static StringBuilder readResponse(InputStream inputStream) throws IOException, NullPointerException { 
     BufferedReader r = new BufferedReader(new InputStreamReader(inputStream)); 
     StringBuilder stringBuilder = new StringBuilder(); 
     String line; 
     while ((line = r.readLine()) != null) { 
      stringBuilder.append(line); 
     } 
     return stringBuilder; 
    } 
} 
+0

Puoi aggiornare il codice? Sembra che HttpClient sia deprecato e non sia più disponibile su Android 6, e devi usare qualcos'altro. –

+0

Sì. Lo farò ... –

+0

Dire, è corretto legalmente usare questo per una vera app di un'azienda? C'è una licenza che dovrei leggere? O è gratuito per tutti? –

Problemi correlati