25

我正在使用google autocomplete位置api在我的應用中搜索位置,現在我想獲取我搜索的位置的經度和緯度。如何獲取自動填充返回的結果緯度和經度放置在Android谷歌API?從自動完成位置api返回的place_id獲取Lat Lang

+0

使用地理編碼器。請參閱:http://developer.android.com/reference/android/location/Geocoder.html – shyam 2014-09-19 08:06:15

+0

當前的API不允許通過一個請求來完成它,因爲它可以通過Web API進行。請注意https://issuetracker.google。com/issues/35828699來請求在預測響應中暴露的座標。 – AlexKorovyansky 2018-02-01 07:32:09

回答

5

在地址自動填充響應中返回的每個地方都有一個Id和一個參考字符串,如here所解釋的。

二者必選其一(最好標識,因爲參考不建議使用)來查詢有關該地點的完整信息的地方API(包括緯度/經度): https://developers.google.com/places/documentation/details#PlaceDetailsRequests

關於希亞姆的評論 - 如果你有一個地理編碼只會工作自動完成響應中的完整地址並非總是如此。此外,地理編碼提供了可能的結果列表,因爲您在自動填充響應中獲得的地點說明不是唯一的。根據您的需求,地理編碼可能就足夠了。

1

地理編碼是一個非常間接的解決方案,就像第二個響應者說的,如果你做「Apple Store」,它可能不會返回完整的地址。相反:

Place_ID包含您需要的一切。我假設你知道如何從Places API獲取place_id(如果沒有,他們有一個完整的例子)。

然後,使用place_id本文檔以下拉該地點的信息(包括下的幾何形狀部分緯度和經度)的第二請求: https://developers.google.com/places/documentation/details?utm_source=welovemapsdevelopers&utm_campaign=mdr-devdocs

+0

這對於獲取某個地方的完整數據非常有用。 – karenms 2017-11-03 22:30:04

20

Google Place Details就是答案。

place_id你有,查詢詳細地點像https://maps.googleapis.com/maps/api/place/details/json?placeid={placeid}&key={key},你可以從result.geometry.location JSON得到latlng

0

這個片段允許根據所述標識符返回到自動完成

public class PlacesDetails { 
    private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place"; 
    private static final String TYPE_AUTOCOMPLETE = "/autocomplete"; 
    private static final String TYPE_DETAIL = "/details"; 
    private static final String OUT_JSON = "/json"; 



    //private static final String API_KEY = "------------ make your specific key ------------; // cle pour le serveur  
    public PlacesDetails() { 
     // TODO Auto-generated constructor stub 
    } 
    public ArrayList<Double> placeDetail(String input) { 
     ArrayList<Double> resultList = null; 

     HttpURLConnection conn = null; 
     StringBuilder jsonResults = new StringBuilder(); 
     try { 
      StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_DETAIL + OUT_JSON); 
      sb.append("?placeid=" + URLEncoder.encode(input, "utf8")); 
      sb.append("&key=" + API_KEY); 
      URL url = new URL(sb.toString()); 
      //Log.e("url", url.toString()); 
      System.out.println("URL: "+url); 
      System.out.println("******************************* connexion au serveur *****************************************"); 
      //Log.e("nous sommes entrai de test la connexion au serveur", "test to connect to the api"); 
      conn = (HttpURLConnection) url.openConnection(); 
      InputStreamReader in = new InputStreamReader(conn.getInputStream()); 

      // Load the results into a StringBuilder 
      int read; 
      char[] buff = new char[1024]; 
      while ((read = in.read(buff)) != -1) { 
       jsonResults.append(buff, 0, read); 

      } 
      System.out.println("le json result"+jsonResults.toString()); 
     } catch (MalformedURLException e) { 
      //Log.e(LOG_TAG, "Error processing Places API URL", e); 
      return resultList; 
     } catch (IOException e) { 
      //Log.e(LOG_TAG, "Error connecting to Places API", e); 
      return resultList; 
     } finally { 
      if (conn != null) { 
       conn.disconnect(); 
      } 
      System.out.println("******************************* fin de la connexion*************************************************"); 
     } 

     try { 

      // Create a JSON object hierarchy from the results 
      //Log.e("creation du fichier Json", "creation du fichier Json"); 
      System.out.println("fabrication du Json Objet"); 
      JSONObject jsonObj = new JSONObject(jsonResults.toString()); 
      //JSONArray predsJsonArray = jsonObj.getJSONArray("html_attributions"); 
      JSONObject result = jsonObj.getJSONObject("result").getJSONObject("geometry").getJSONObject("location"); 
      System.out.println("la chaine Json "+result); 
      Double longitude = result.getDouble("lng"); 
      Double latitude = result.getDouble("lat"); 
      System.out.println("longitude et latitude "+ longitude+latitude); 
      resultList = new ArrayList<Double>(result.length()); 
      resultList.add(result.getDouble("lng")); 
      resultList.add(result.getDouble("lat")); 
      System.out.println("les latitude dans le table"+resultList); 

     } catch (JSONException e) { 
      ///Log.e(LOG_TAG, "Cannot process JSON results", e); 
     } 

     return resultList; 
    } 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     PlacesDetails pl = new PlacesDetails(); 
     ArrayList<Double> list = new ArrayList<Double>(); 
     list = pl.placeDetail("ChIJbf7h4osSYRARi8SBR0Sh2pI"); 
     System.out.println("resultat de la requette"+list.toString()); 
    }  
} 
35

下面的代碼片段爲我工作

Places.GeoDataApi.getPlaceById(mGoogleApiClient, placeId) 
    .setResultCallback(new ResultCallback<PlaceBuffer>() { 
    @Override 
    public void onResult(PlaceBuffer places) { 
    if (places.getStatus().isSuccess()) { 
     final Place myPlace = places.get(0); 
     LatLng queriedLocation = myPlace.getLatLng(); 
     Log.v("Latitude is", "" + queriedLocation.latitude); 
     Log.v("Longitude is", "" + queriedLocation.longitude); 
    } 
    places.release(); 
    } 
}); 

訪問Google Places API for Android的方法的完整列表,從一個地方獲取數據

-1
 Places.GeoDataApi.getPlaceById(mGoogleApiClient, placeId) 
     .setResultCallback(new ResultCallback<PlaceBuffer>() { 
     @Override 
     public void onResult(PlaceBuffer places) { 
      if (places.getStatus().isSuccess() && places.getCount() > 0) { 
       final Place myPlace = places.get(0); 
       Log.i(TAG, "Place found: " + myPlace.getName()); 
       LatLng latlangObj = myPlace.getLatLng(); 
       Log.v("latitude:", "" + latlangObj.latitude); 
       Log.v("longitude:", "" + latlangObj.longitude); 
      } else { 
       Log.e(TAG, "Place not found"); 
    } 
    places.release(); 
    } 
}); 

使用此方法從placeid獲取經緯度和朗。

0
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == Constant.REQUEST_LOCATION_CODE) { 

     Place place = PlaceAutocomplete.getPlace(this, data); 

     if (place != null) { 
      LatLng latLng = place.getLatLng(); 
      mStringLatitude = String.valueOf(latLng.latitude); 
      mStringLongitude = String.valueOf(latLng.longitude); 
      EditTextAddress.setText(place.getAddress()); 
     } 
    } 
} 

通過上面的代碼,就可以得到經緯度以及字符串的地址。在任何你想要的地方使用LatLng。