我正在使用google autocomplete place api搜索我的应用中的位置,现在我想获得我搜索过的地方的纬度和经度。如何从Android中的google自动完成位置api返回的结果获取经度和经度
答案 0 :(得分:44)
以下使用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以获取从地点检索数据的完整方法列表
答案 1 :(得分:26)
Google Place Details就是答案。
从您获得的place_id
中,查询类似https://maps.googleapis.com/maps/api/place/details/json?placeid={placeid}&key={key}
的广告详细信息,您可以从lat
JSON获取lng
和result.geometry.location
。
答案 2 :(得分:5)
在地方自动填充响应中返回的每个地方都有一个Id和一个参考字符串,如here所述。
使用其中一个(最好是Id,因为不推荐使用引用)来查询Places API以获取有关该地点的完整信息(包括lat / lng): https://developers.google.com/places/documentation/details#PlaceDetailsRequests
关于shyam的评论 - 只有在自动填充响应中有完整地址时,地理编码才有效,但并非总是如此。此外,地理编码还会列出可能的结果,因为您在自动填充响应中获得的地点描述不是唯一的。根据您的需要,地理编码可能就足够了。
答案 3 :(得分:2)
地理编码是一种非常间接的解决方案,就像第二响应者所说的那样,如果你做了#34; Apple Store&#34;它可能不会返回完整的地址。代替:
Place_ID包含您需要的一切。我假设你知道如何从Places API获取place_id(如果没有,他们会有一个完整的例子)。
然后使用本文档后面的place_id拉出第二个地点详细信息请求(包括几何部分下的纬度和经度): https://developers.google.com/places/documentation/details?utm_source=welovemapsdevelopers&utm_campaign=mdr-devdocs
答案 4 :(得分:2)
参考: - https://developers.google.com/places/android/place-details#get-place 上面的链接给出了一个具有lat和long的place对象。地方对象是从地方自动完成的地方获得的。
答案 5 :(得分:2)
@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 以及字符串地址。在任何地方使用LatLng。
答案 6 :(得分:1)
此片段允许根据标识符获取地点的纬度和经度回到自动完成
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());
}
}
答案 7 :(得分:1)
基于最新版本的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:使用意图启动自动完成活动
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
答案 8 :(得分:1)
在功能下添加这些行
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);
答案 9 :(得分:0)
请提供Place.Field.LAT_LNG以获取该地点的纬度和经度。
autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID,
Place.Field.NAME,Place.Field.LAT_LNG));
然后获取LatLng
LatLng destinationLatLng = place.getLatLng();
并且可以看透吐司
destlat = destinationLatLng.latitude;
destLon = destinationLatLng.longitude;
Toast.makeText(getApplicationContext(), "" + destlat + ',' + destLon, Toast.LENGTH_LONG).show();
答案 10 :(得分:0)
对于这个问题,我有非常简单的解决方案,感谢穆罕默德·亚西尔(Muhammad Yasir)的回答。
yyyy-MM-dd
您可以在列表中指定所需的任何字段,例如名称,地址等。
注意:此答案适用于android java,但我认为其他语言(例如javascript)也会有类似的方法。
答案 11 :(得分:-2)
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。