从自动完成位置api返回的place_id中获取Lat Lang

我正在使用谷歌自动填充地点api搜索我的应用程序中的位置,现在我想得到我搜索过的地方的纬度和经度 . 如何从Android中的谷歌自动完成地点api返回的结果获取经度和经度?

回答(9)

2 years ago

以下使用Google Places API for android的代码段为我工作

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以获取从某个地方检索数据的完整方法列表

2 years ago

Google Place Details就是答案 .

place_id 获得,查询类似于 https://maps.googleapis.com/maps/api/place/details/json?placeid={placeid}&key={key} 的地方详细信息,您可以从 result.geometry.location JSON获取 latlng .

2 years ago

在地点自动完成响应中返回的每个地方都有一个Id和一个参考字符串,如here所述 .

使用任何一个(最好是Id,因为不推荐引用)来查询Places API以获取有关该地点的完整信息(包括lat / lng):https://developers.google.com/places/documentation/details#PlaceDetailsRequests

关于shyam的评论 - 只有在自动完成响应中有完整地址时,地理编码才有效,但情况并非总是如此 . 此外,地理编码还会列出可能的结果,因为您在自动填充响应中获得的地点描述不是唯一的 . 根据您的需要,地理编码可能就足够了 .

2 years ago

地理编码是一种非常间接的解决方案,就像第二响应者所说,如果你做“Apple Store”,它可能不会返回完整的地址 . 代替:

Place_ID包含您需要的一切 . 我假设你知道如何从Places API获取place_id(如果没有,他们有一个完整的例子) .

然后使用此文档后面的place_id拉出第二个地点详细信息请求(包括几何部分下的纬度和经度):https://developers.google.com/places/documentation/details?utm_source=welovemapsdevelopers&utm_campaign=mdr-devdocs

2 years ago

参考: - https://developers.google.com/places/android/place-details#get-place上面的链接给出了一个具有lat和long的位置对象 . 地方对象是从placeid获得的地方自动完成 .

2 years ago

@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 以及String地址 . 在任何地方使用LatLng .

2 years ago

该片段允许根据标识符获得地点的纬度和经度回到自动完成

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());
    }    
}

2 years ago

基于最新版本的AutoComplete文档

选项1:嵌入AutocompleteSupportFragment

AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
            getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);

 autocompleteFragment
    .setPlaceFields(Arrays.asList(Place.Field.ID, 
    Place.Field.NAME,Place.Field.LAT_LNG,Place.Field.ADDRESS));

选项2:使用intent启动自动完成活动

List<Place.Field> fields = Arrays.asList(Place.Field.ID, Place.Field.NAME,Place.Field.LAT_LNG,Place.Field.ADDRESS);

// Start the autocomplete intent.
Intent intent = new Autocomplete.IntentBuilder(
        AutocompleteActivityMode.FULLSCREEN, fields)
        .build(this);
startActivityForResult(intent, AUTOCOMPLETE_REQUEST_CODE);

无论你感兴趣哪个领域,你都要提到如上所述 .

你会得到如下结果:

onPlaceSelected: 

{

"a":"#90, 1st Floor, Balaji Complex, Kuvempu Main Road, Kempapura, Hebbal 
    Kempapura, Bengaluru, Karnataka 560024, India",
"b":[],
"c":"ChIJzxEsY4QXrjsRQiF5LWRnVoc",
"d":{"latitude":13.0498176,"longitude":77.600347},
    "e":"CRAWLINK Networks Pvt. Ltd."
}

注意:显示的结果是将Place对象解析为json

2 years ago

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获取lat和lang .