Sajal
Sajal

Reputation: 1472

get Lat Lang from a place_id returned by autocomplete place api

I am searching the place in my apps using the google autocomplete place api and now I want to get latitude and longitude of the place that i have searched. How to get latitude and longitude from the result returned by autocomplete place api by google in android?

Upvotes: 58

Views: 82613

Answers (13)

Merkost
Merkost

Reputation: 2396

Use Google Places API

implementation("com.google.android.libraries.places:places:3.1.0")

Initialize it in Application's file onCreate() fun

Places.initialize(applicationContext, "YOUR_API_KEY")

Then invoke the function to get LatLng by placeId

val client = Places.createClient(androidContext())

suspend fun getPlaceCoordinatesById(placeId: String): LatLng? = suspendCoroutine { continuation ->
    placesClient.fetchPlace(
        FetchPlaceRequest.newInstance(placeId, listOf(Place.Field.LAT_LNG))
    ).addOnSuccessListener {
        continuation.resume(it.place.latLng)
    }.addOnFailureListener {
        Log.e(this.toString(), it.stackTraceToString())
        continuation.resume(null)
    }
}

Upvotes: 0

Blaise Siani
Blaise Siani

Reputation: 31

This snippet allows obtain the latitude and longitude of a place according to the identifier back into the auto complete

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

Upvotes: 1

Black_shadow
Black_shadow

Reputation: 77

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

Use this method for getting lat and lang from placeid.

Upvotes: -1

Paritosh
Paritosh

Reputation: 83

I got very simple solution to this problem thanks answer by Muhammad Yasir.

    List<Place.Field> placeFields = Arrays.asList(Place.Field.LAT_LNG, Place.Field.ADDRESS_COMPONENTS);
    autocompleteFragment.setPlaceFields(placeFields);

    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            LatLng latLng = place.getLatLng(); // This will have required latitude and longitude
         }
   }

You can specify any field you want as in the list like name, address etc.

Note: This answer is for android java but I think there will be similar approach in other languages like javascript.

Upvotes: 0

rachna patwal
rachna patwal

Reputation: 141

do provide Place.Field.LAT_LNG to get the latitude and longitude for the place.

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

then get LatLng

LatLng destinationLatLng = place.getLatLng();

and can see through toast

 destlat = destinationLatLng.latitude;
 destLon = destinationLatLng.longitude;
 Toast.makeText(getApplicationContext(), "" + destlat + ',' + destLon, Toast.LENGTH_LONG).show();

Upvotes: 12

Muhammad Yasir
Muhammad Yasir

Reputation: 85

add these line under function

 autocomplete.addListener('place_changed', function() {});
 var place = autocomplete.getPlace();
 autocomplete.setFields(['place_id', 'geometry', 'name', 'formatted_address']);
 var lng = place.geometry.location.lng();
 var lat = place.geometry.location.lat();
 var latlng = {lat , lng};
 console.log(latlng);

Upvotes: 5

Ravi Rajput
Ravi Rajput

Reputation: 539

Based on the latest version of AutoComplete documentation

Option 1: Embed an 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));

Option 2: Use an intent to launch the autocomplete activity

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

whichever fields you are interested in, you have to mention as mentioned above.

You'll get result as below:

 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."
}

Note: The result displayed is by parsing the Place object to json

Upvotes: 6

Fahry Mohammed
Fahry Mohammed

Reputation: 659

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

With the code above, you can get the LatLng as well as the String address. Use the LatLng wherever you want.

Upvotes: 3

droidmad
droidmad

Reputation: 837

The following code snippet which uses Google Places API for android worked for me

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

Visit Google Places API for Android for a full list of methods to retrieve data from a place

Upvotes: 50

rohitsakala
rohitsakala

Reputation: 399

Ref :- https://developers.google.com/places/android/place-details#get-place The above link gives a place object which will have lat and long . The place object is deirved from placeid that one gets from place autocomplete.

Upvotes: 2

CallMeLaNN
CallMeLaNN

Reputation: 8578

Google Place Details is the answer.

From the place_id you got, query Place Details something like https://maps.googleapis.com/maps/api/place/details/json?placeid={placeid}&key={key} and you can get the lat and lng from result.geometry.location JSON.

Upvotes: 44

Sal
Sal

Reputation: 21

Geocoding is a very indirect solution, and like the second responder said, if you do "Apple Store" it may not return the full address. Instead:

Place_ID contains everything you need. I am assuming you know how to get the place_id from the Places API (they have a full example if not).

Then pull a second request for the place details (including latitude and longitude under the geometry section) using the place_id following this documentation: https://developers.google.com/places/documentation/details?utm_source=welovemapsdevelopers&utm_campaign=mdr-devdocs

Upvotes: 2

nitzanj
nitzanj

Reputation: 1699

Each place returned in the place-autocomplete response has an Id and a reference string as explained here.

Use either (preferably Id since reference is deprecated) to query Places API for the full information about that place (including lat/lng): https://developers.google.com/places/documentation/details#PlaceDetailsRequests

Regarding shyam's comment - Geocoding will work only if you got a full address in the autocomplete response which is not always the case. Also Geocoding gives a list of possible results since the place description you get in the autocomplete response is not unique. Depending on your needs, geocoding might be enough.

Upvotes: 7

Related Questions