【问题标题】:Getting results of nearby places from User's Location using Google Maps API in Android在 Android 中使用 Google Maps API 从用户位置获取附近地点的结果
【发布时间】:2015-11-30 07:43:11
【问题描述】:

这是第一次使用 google map API 和 google places API。我正在做一个演示应用程序,它显示离用户位置最近的医院列表(例如)以及到每个医院的路线。我能够使用以下代码获取用户的位置:

public class MainActivity extends ActionBarActivity {
    private GoogleMap map;
    UiSettings mapSettings;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

        if (map != null) {
           // map.addMarker(new MarkerOptions().position(myLocation).title("Start"));
            map.setMyLocationEnabled(true);
            mapSettings = map.getUiSettings();
            mapSettings.setScrollGesturesEnabled(true);
            mapSettings.setZoomControlsEnabled(true);
        }
    }
}

xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.MapFragment" />


</RelativeLayout>

我的问题是如何使用 Google Places API 获取医院列表并显示它们。任何帮助、提示、演练或教程都会非常受欢迎。在此先感谢。

【问题讨论】:

标签: android google-maps google-maps-android-api-2 google-places-api


【解决方案1】:

对于 Android,我尝试使用 Place picker for Android。它可以将built-in place picker UI widget 添加到您的应用程序中,因此用户可以从地图上显示的一组附近地点中进行选择。它使用方便,您只需要:

int PLACE_PICKER_REQUEST = 1;
PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();    
startActivityForResult(builder.build(this), PLACE_PICKER_REQUEST);

它会显示下面的 UI 来为您选择一个地方,您可以通过以下方式获取地点信息:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (requestCode == PLACE_PICKER_REQUEST) {
    if (resultCode == RESULT_OK) {
        Place place = PlacePicker.getPlace(data, this);
        String toastMsg = String.format("Place: %s", place.getName());
        Toast.makeText(this, toastMsg, Toast.LENGTH_LONG).show();
    }
  }
}

更多详情请参考指南here和代码here

但是,它无法设置地点类型,因为它没有内置 UI 的功能。如果你真的需要设置,你应该使用Google Places API Web Service APIhere,自己搜索位置,解析 JSON 数据,然后显示在您自己的 UI 上。

“附近搜索”可让您搜索指定区域内的地点。您可以通过提供关键字或指定要搜索的地点类型来优化您的搜索请求。

附近搜索请求是以下形式的 HTTP URL:

https://maps.googleapis.com/maps/api/place/nearbysearch/output?parameters

注意参数中需要设置types=hospital

编辑

关于如何使用 google places API web API web service API 以 JSON 格式传递特定位置的搜索请求的示例。

请求

location: -33.8670,151.1957
radius: 500
types: food
name: cruise
key: API_KEY

网址:

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670,151.1957&radius=500&types=food&name=cruise&key=API_KEY

和这样的响应 JSON:

{
   "debug_log" : {
      "line" : []
   },
   "html_attributions" : [],
   "logging_info" : {
      "experiment_id" : [],
      "query_geographic_location" : "AU"
   },
   "results" : [
      {
         "geometry" : {
            "location" : {
               "lat" : -33.86879,
               "lng" : 151.194217
            }
         },
         "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/restaurant-71.png",
         "id" : "21a0b251c9b8392186142c798263e289fe45b4aa",
         "name" : "Rhythmboat Cruises",
         "opening_hours" : {
            "open_now" : false,
            "weekday_text" : []
         },
         "photos" : [
            {
               "height" : 426,
               "html_attributions" : [
                  "\u003ca href=\"https://www.google.com/maps/views/profile/104066891898402903288\"\u003eRhythmboat Cruises\u003c/a\u003e"
               ],
               "photo_reference" : "CmRdAAAA-YL_I_Gk02blOX6S0nKHry8PFu9pDyp3Y9AnqISsa3Eq8mkbdD5mXuu1Fax60s0nSy3iiX-h5j-ztyLHcc1-782MsLQsgLLa4t3ZgDmCMll-a8ABapZGnZwDKByk67LFEhBgedv_u_eYFsEo9ay8jxJjGhTUHKPJ4G82vBJqSNliuv7UlAtclw",
               "width" : 640
            }
         ],
         "place_id" : "ChIJyWEHuEmuEmsRm9hTkapTCrk",
         "reference" : "CnRmAAAAvQlMKw-XtxEY4vWFCvudF7CEMQGI5ycNbfVgGl9rAF75fdiPOiLJw1k9NL2v8ZIJsOJuRS3Lm9Dw1vga4ajycAs7PlxN1MVnnYT9la0pBvEvSQNlyvszKANS1R4P7Mvk_jhqswMggqCUtwJ13LN2hRIQOiAkLTWUi3DOjVVOw7J5IRoUb_cJyJaJNqKdmkDM2f0OjQjh9F0",
         "scope" : "GOOGLE",
         "types" : [ "restaurant", "food", "point_of_interest", "establishment" ],
         "vicinity" : "Pyrmont Bay Wharf (Near Australia Maritime Museum), Pyrmont, NSW 2009"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : -33.867591,
               "lng" : 151.201196
            }
         },
         "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/restaurant-71.png",
         "id" : "a97f9fb468bcd26b68a23072a55af82d4b325e0d",
         "name" : "Australian Cruise Group",
         "opening_hours" : {
            "open_now" : false,
            "weekday_text" : []
         },
         "photos" : [
            {
               "height" : 1331,
               "html_attributions" : [
                  "\u003ca href=\"https://www.google.com/maps/views/profile/110751364053842618118\"\u003eAustralian Cruise Group\u003c/a\u003e"
               ],
               "photo_reference" : "CmRdAAAAtEoj29FJcNBccrsu6bHt0xgwVGhYlciCY1fe6gTr_d5_KkeP3LITnOwnpNRJWnX39B04-aIBOKXKJH6ltx948T5vWIYBoah1yZDXsWngWZ5kMsK7xyCB5P_q_xBIBxxUEhAYWeB4PiOm_Jy093fB-j0iGhSYmIs9xB2aa6u-RH8V8lZEk-Q5ig",
               "width" : 2000
            }
         ],
         "place_id" : "ChIJrTLr-GyuEmsRBfy61i59si0",
         "reference" : "CnRqAAAAFbukrZvRNsc05TreHUCrPEya5NcN9v0fFLLaK-D1fSyxFTuQlUDhDstU3qwXKw_fADX4W6guUkexax1nufgiYIuGCKoZPEnup1r-LhGGNz9dn1uf9Of5iOtZ1XgCeDjJaYvGbSB3C0pAXL8r9kOsmhIQbx2Sia2DAWTjtSZwuh5aehoUhM6upqBCDLhGruZAGGsCOwAiIq8",
         "scope" : "GOOGLE",
         "types" : [
            "restaurant",
            "travel_agency",
            "food",
            "point_of_interest",
            "establishment"
         ],
         "vicinity" : "32 The Promenade, King Street Wharf 5, Sydney"
      },
      {
         "geometry" : {
            "location" : {
               "lat" : -33.870943,
               "lng" : 151.190311
            }
         },
         "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/bar-71.png",
         "id" : "e644f7f34cf875b9919c6548f1b721947362850a",
         "name" : "Lunch Cruise with Jazz on Sydney Harbour",
         "opening_hours" : {
            "open_now" : false,
            "weekday_text" : []
         },
         "photos" : [
            {
               "height" : 292,
               "html_attributions" : [
                  "\u003ca href=\"https://www.google.com/maps/views/profile/105423912060796272053\"\u003eFrom a Google User\u003c/a\u003e"
               ],
               "photo_reference" : "CmRdAAAAR4bqFTKYWdBwZwdBdON_JRD7V_joTwwIPwRUpZIZWkSSd8GQ3P2O-_aQbUJdL2RhoAyzCUIF0f--DI4oXFneTpj5zZfFq-iFiT7i_x0tjnDveIY8tJv-6o0uWSSjYqabEhCKqQWZqrKAoddjDcc64N48GhQZ2T1_ntPzNKCooHpZzlYQ7AxFOA",
               "width" : 438
            }
         ],
         "place_id" : "ChIJLfySpTOuEmsRPCRKrzl8ZEY",
         "reference" : "CoQBewAAAFd2fO_YWGTiT4RzXWb5tsOuOt7YyV_ScQOwm0tqJSrAyACCczeOzV-P_mgZLro1oKP_34Nt0nVC_1OEKAQUcd7cUm7xmAMSX-EkbSWiD0kOWGgGgKuDRtb0t_8qsxBGU_izugWCyK7SRWezTxELYNdkS0OEiSWPnvhxvXuQktBBEhAAtEe7fagW2kUR14T1QpVsGhQBO7YpIyYSPvo4zUJuL_bX30nJZw",
         "scope" : "GOOGLE",
         "types" : [ "bar", "restaurant", "food", "point_of_interest", "establishment" ],
         "vicinity" : "37 Bank St, Pyrmont"
      }
   ],
   "status" : "OK"
}

以下示例返回英国伦敦附近的医院列表。

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=51.503186,-0.126446&radius=5000&types=hospital&key=API_KEY

更多详情请参考here

【讨论】:

  • 谢谢,这正是我想要的。您能否举个例子,说明如何使用 google places API web API web service API 以 JSON 格式传递特定位置的搜索请求?因为我需要静态搜索(即它会不断搜索一个地方,例如基于用户位置的电影院)提前致谢。
  • 抱歉延迟回复,我正在度假顺便说一句:) 请在我的回答中查看编辑。
  • 链接中将传递哪个 api 密钥您是在谈论 Google Place API 吗?
  • 不幸的是,Web API maps.googleapis.com/maps/api/place/nearbysearch/… 现在可以收费,获取地点详细信息会花费很多。作为开发人员,您每月可以获得 200 美元的信用额度,但如果您发布一个下载量为数千的 Android 应用程序,那么账单将是巨大的,每月数千美元。发布的唯一可能的 Android 应用程序是使用原生 Android Places API,其中配额是它们以前在位置 Web API 中的配额。
【解决方案2】:

点击这个链接,已经全部解释清楚了,

在 String type='grocery_or_supermarket' 中将其替换为 'hospital' 就可以了:

http://androidmastermind.blogspot.co.ke/2016/06/android-google-maps-with-nearyby-places.html

【讨论】:

  • 您可以通过提供报价或必要的数据来支持您的声明来改进您的答案:String type='grocery[…]。请参阅此参考:stackoverflow.com/help/referencing
【解决方案3】:
 private void loadNearByPlaces(double latitude, double longitude)

//YOU Can change this type at your own will, e.g hospital, cafe, restaurant.... and see how it all works
{


    mMap.clear();
    Intent i = getIntent();
    String type = hospital;

    StringBuilder googlePlacesUrl =
            new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?");
    googlePlacesUrl.append("location=").append(latitude).append(",").append(longitude);
    googlePlacesUrl.append("&radius=").append(PROXIMITY_RADIUS);
    googlePlacesUrl.append("&types=").append(type);
    googlePlacesUrl.append("&sensor=true");
    googlePlacesUrl.append("&key=" + GOOGLE_BROWSER_API_KEY);

    JsonObjectRequest request = new JsonObjectRequest(googlePlacesUrl.toString(),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject result) {

                    Log.i(TAG, "onResponse: Result= " + result.toString());
                    parseLocationResult(result);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e(TAG, "onErrorResponse: Error= " + error);
                    Log.e(TAG, "onErrorResponse: Error= " + error.getMessage());
                }
            });

    AppController.getInstance().addToRequestQueue(request);
}

这将根据您的位置加载附近的医院。

【讨论】:

    【解决方案4】:

    按照以下代码:

    private static final String TAG_RESULT = "predictions";
    JSONObject json;
    
    
    ArrayList<String> names;
    ArrayAdapter<String> adapter;
    String browserKey = "Google API key";
    //------------------------AutoComplete code--------------  
      public void updateList(String place) {
            String input = "";
    
            try {
                input = "input=" + URLEncoder.encode(place, "utf-8");
            } catch (UnsupportedEncodingException e1) {
                e1.printStackTrace();
            }
    
            String output = "json";
            String parameter = input + "&types=geocode&sensor=true&key="                + browserKey;
    
            url = "https://maps.googleapis.com/maps/api/place/autocomplete/"                + output + "?" + parameter;
    
            JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET, url,
                    null, new Response.Listener<JSONObject>() {
    
                @Override            public void onResponse(JSONObject response) {
                    System.out.println("response"+response);
                    try {
    
                        JSONArray ja = response.getJSONArray(TAG_RESULT);
    
                        for (int i = 0; i < ja.length(); i++) {
                            JSONObject c = ja.getJSONObject(i);
                            String description = c.getString("description");
                            System.out.println("description"+description);
                            names.add(description);
                        }
    
                        adapter = new ArrayAdapter<String>(
                                getApplicationContext(),
                                android.R.layout.simple_list_item_1, names) {
                            @Override                        public View getView(int position,
                                                View convertView, ViewGroup parent) {
                                View view = super.getView(position,
                                        convertView, parent);
                                TextView text = (TextView) view
                                        .findViewById(android.R.id.text1);
                                text.setTextColor(Color.BLACK);
                                return view;
                            }
                        };
                        edittext_signup_city.setAdapter(adapter);
                        adapter.notifyDataSetChanged();
                    } catch (Exception e) {
                    }
                }
            }, new Response.ErrorListener() {
                @Override            public void onErrorResponse(VolleyError error) {
                }
            });
            AppController.getInstance().addToRequestQueue(jsonObjReq, "jreq");
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      • 2012-01-15
      相关资源
      最近更新 更多