由于公司项目是针对美国市场,所以接入的是google定位

谷歌地图sdk不像高德地图或者百度地图那么好接入,一方面是纯英文,还有一方面国外文档习惯我们并不习惯,大多写得很简略

我的项目要实现附近宠物店的搜索和附近宠物医院的搜索,在接入谷歌地图用到了以下几个包:

"com.google.android.gms:play-services-maps:15.0.1"
"com.google.android.gms:play-services-location:15.0.1"
"com.google.android.gms:play-services-places:15.0.1"

此外还需要在清单文件中配置对应的

<meta-dataandroid:name="com.google.android.geo.API_KEY"android:value="@string/google_maps_key"/>

注:在string.xml中的谷歌地图的key的名字必须是google_maps_key

下面实现的搜索的功能:本质上调用的http接口来实现,比较坑的一点是同一个key一天调用的次数最多150000次,如果用户量较大时,要专门交费调整限制次数

1.首先初始化

private GoogleApiClient mGoogleApiClient;private void getLocationList() {if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED) {return;}//创建GoogleAPIClient实例if (mGoogleApiClient == null) {mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this).addApi(Places.GEO_DATA_API).addApi(Places.PLACE_DETECTION_API).addOnConnectionFailedListener(this).addApi(LocationServices.API).build();}}

2.调用接口进行请求地址数据:

 private void getGoogleLocation() {String baseUrl = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=";
//            String realUrl=baseUrl+mLat+","+mLng+"&radius="
//                    +5000+"&type=pet_store"+"&language=zh-CN"+"&key="+"你自己在谷歌的对应的key";String realUrl = null;
//            realUrl = baseUrl + mLat + "," + mLng + "&radius="
//                    + 20000 +"&rankby=distance"+
//                    "&types=" + searchType + "&key=" + "你自己在谷歌的对应的key";realUrl = baseUrl + mLat + "," + mLng +"&rankby=distance"+"&types=" + searchType + "&key=" + "你自己在谷歌对应的key";Call<ResponseBody> ca = HBClient.getService(MineService.class).listGoogleLocations(realUrl);ca.enqueue(new RequestCallBack<ResponseBody>() {@Overridepublic void onFailed(Call<ResponseBody> call, Response<ResponseBody> response) {super.onFailed(call, response);}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {super.onFailure(call, t);}@Overridepublic void onSuccess(Call<ResponseBody> call, Response<ResponseBody> response) {try {String json = response.body().string();LogUtil.e("周边地址的json为" + json);if (json != null && !json.equals("")) {googleLocationBean = GsonUtils.jsonToBean(json, GoogleLocationBean.class);if (googleLocationBean == null) {LogUtil.e("解析周边地址json为空");showEmpty();nextPageToken = null;} else {if (googleLocationBean.getStatus().equals("OK")) {List<GoogleLocationBean.GoogleLocationData> results = googleLocationBean.getResults();nextPageToken = googleLocationBean.getNext_page_token();showSuccess();mAdapter.setNewData(results);LogUtil.e("长度为" + results.size());
//                                    for (int i = 0; i < results.size(); i++) {
//                                    getGoogleDetail(results.get(i),results,i,hasMore);
//                                    }
//                                    getGooglePhotos(results.get(1).getReference());} else {nextPageToken = null;showEmpty();}}}} catch (IOException e) {e.printStackTrace();}}});}

3.当请求返回的数据中有

nextPageToken字段不为空时,就有多页数据,请求下一页数据时需要将该字段携带去请求

4.请求下一页数据时:

private void getGoogleLocationMore() {String baseUrl = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?pagetoken=";String realUrl = null;realUrl = baseUrl + nextPageToken + "&key=" + "你对应的谷歌的key";nextPageToken = null;Call<ResponseBody> ca = HBClient.getService(MineService.class).listGoogleLocations(realUrl);ca.enqueue(new RequestCallBack<ResponseBody>() {@Overridepublic void onFailed(Call<ResponseBody> call, Response<ResponseBody> response) {super.onFailed(call, response);}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {super.onFailure(call, t);}@Overridepublic void onSuccess(Call<ResponseBody> call, Response<ResponseBody> response) {try {String json = response.body().string();LogUtil.e("周边地址的json为" + json);if (json != null && !json.equals("")) {googleLocationBean = GsonUtils.jsonToBean(json, GoogleLocationBean.class);if (googleLocationBean == null) {LogUtil.e("解析周边地址json为空");mAdapter.loadMoreEnd();nextPageToken = null;} else {if (googleLocationBean.getStatus().equals("OK")) {List<GoogleLocationBean.GoogleLocationData> results = googleLocationBean.getResults();mAdapter.addData(results);mAdapter.loadMoreEnd();nextPageToken = googleLocationBean.getNext_page_token();LogUtil.e("长度为" + results.size());
//                                    for (int i = 0; i < results.size(); i++) {
//                                    getGoogleDetail(results.get(i),results,i,hasMore);
//                                    }
//                                    getGooglePhotos(results.get(1).getReference());} else {mAdapter.loadMoreEnd();}}}} catch (IOException e) {e.printStackTrace();}}});}

5.请求某个地点对应的照片时:

private void getGooglePhotos(String photoreference) {String baseUrlPhoto = "https://maps.googleapis.com/maps/api/place/photo?";String realUrlPhoto = baseUrlPhoto + "maxwidth=480&photoreference=" + photoreference+ "&key=" + "你的谷歌对应的key";HBClient.getService(MineService.class).listGooglePhotos(realUrlPhoto).enqueue(new RequestCallBack<ResponseBody>() {@Overridepublic void onFailed(Call<ResponseBody> call, Response<ResponseBody> response) {super.onFailed(call, response);}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {super.onFailure(call, t);}@Overridepublic void onSuccess(Call<ResponseBody> call, Response<ResponseBody> response) {try {String json = response.body().string();LogUtil.e("图片json为" + json);if (json != null && !json.equals("")) {GoogleLocationBean bean = GsonUtils.jsonToBean(json, GoogleLocationBean.class);if (bean == null) {LogUtil.e("解析周边地址图片json为空");} else {if (bean.getStatus().equals("OK")) {List<GoogleLocationBean.GoogleLocationData> results = bean.getResults();}}}} catch (IOException e) {e.printStackTrace();}}});
}

6.上述请求对应地点照片采用的Places的web的api,也可以采用安卓的api,如下:

private void getPhoto(String placeId, GoogleApiClient mGoogleApiClient, ImageView imgLogo) {Places.GeoDataApi.getPlacePhotos(mGoogleApiClient, placeId).setResultCallback(photos -> {if (!photos.getStatus().isSuccess()) {return;}PlacePhotoMetadataBuffer photoMetadataBuffer = photos.getPhotoMetadata();if (photoMetadataBuffer.getCount() > 0) {// Display the first bitmap in an ImageView in the size of the viewphotoMetadataBuffer.get(0).getScaledPhoto(mGoogleApiClient, imgLogo.getWidth(),imgLogo.getHeight()).setResultCallback(placePhotoResult -> {LogUtil.e("请求图片回调-"+placePhotoResult.getStatus().isSuccess());if (!placePhotoResult.getStatus().isSuccess()) {return;}imgLogo.setImageBitmap(placePhotoResult.getBitmap());});}else {LogUtil.e("查询到图片数量为0");}photoMetadataBuffer.release();});
}

7.关于谷歌地图的显示的补充:在Activity中实现OnMapReadyCallback接口

在onCreate方法中:注意

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// TODO: add setContentView(...) invocationButterKnife.bind(this);SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);mapFragment.getMapAsync(this);
}
    @Overridepublic void onMapReady(GoogleMap googleMap) {LogUtil.e("googleMap");mMap = googleMap;mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
//        mMap.setOnMyLocationButtonClickListener(this);
//        mMap.setOnMarkerDragListener(this);UiSettings uiSettings = mMap.getUiSettings();uiSettings.setZoomControlsEnabled(true);uiSettings.setZoomGesturesEnabled(true);uiSettings.setCompassEnabled(true);uiSettings.setMyLocationButtonEnabled(true);//不显示定位按钮
//        enableMyLocation();// Add a marker in Sydney and move the cameraLatLng sydney = new LatLng(item.getGeometry().getLocation().getLat(), item.getGeometry().getLocation().getLng());mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));new Handler().postDelayed(new Runnable() {@Overridepublic void run() {MyApp.runOnUIThread(new Runnable() {@Overridepublic void run() {mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(item.getGeometry().getLocation().getLat(),item.getGeometry().getLocation().getLng()), 16));Marker melbourne = mMap.addMarker(new MarkerOptions().position(sydney).title(item.getVicinity()));melbourne.showInfoWindow();CircleOptions circleOptions = new CircleOptions().center(sydney).radius(280); // In metersCircle circle = mMap.addCircle(circleOptions);circle.setFillColor(Color.argb(45, 0, 191, 255));circle.setStrokeColor(Color.argb(65, 0, 191, 255));circle.setStrokeWidth(6);}});}}, 300);}
}

对应的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<com.zhy.autolayout.AutoLinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:fitsSystemWindows="true"android:clipToPadding="true"android:layout_width="match_parent"android:layout_height="match_parent">
<include layout="@layout/include_title"/><fragmentandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent"class="com.google.android.gms.maps.SupportMapFragment"/>
</com.zhy.autolayout.AutoLinearLayout>

关于使用google map实现周边搜索的功能相关推荐

  1. 使用google map实现周边搜索的功能_「转」“搜索”的原理,架构,实现,实践,面试不用再怕了...

    可能99%的同学不做搜索引擎,但99%的同学一定实现过检索功能.搜索,检索,这里面到底包含哪些技术的东西,希望本文能够给大家一些启示. 全网搜索引擎架构与流程如何? 全网搜索引擎的宏观架构如上图,核心 ...

  2. 用google map实现周边搜索功能

    项目要实现根据经纬度获取附近的建筑,由于项目在海外运营,谷歌地图首当其冲. 首先说明的是,该功能需要在服务端实现,也就是安卓的SDK不适用. api文档地址: https://developers.g ...

  3. google map v3 地图搜索功能

    第一次做google map 开发,对很多东西不熟习,除了看api外,就是各种尝试.也谢谢帮我的 睥睨 在下班前,把这些整理了下传上来,方便自己以后用到,同时也给做map开发的新人一点提示吧 func ...

  4. 记录:谷歌地图google map api实现基本测距功能

    测距 demo-代码 <!DOCTYPE html> <eteral:html><head><meta name="viewport" c ...

  5. GIS(六)——实现js版搜狗地图周边搜索功能

    在上一篇文章<GIS(五)--完成js版搜狗地图基本交互搜索功能>中,介绍了搜狗地图的关键字搜索功能,今天就实现以下另一个重要功能吧--那就是周边搜索功能. 按照惯例,还是把官网上的示例代 ...

  6. Google map 和Baidu map搜索目标地点周边

    0. 引言 本文主要是总结之前项目中的地图需求: 1.根据后端返回的location(坐标)在地图上marker. 2.可以搜索出该点附近的景点,酒店,餐厅等周边.(需要在地图上marker出来) 3 ...

  7. Google Map API使用谷歌地图api实现地点搜索功能

    需求:提供谷歌地图搜索地点功能,并查出经纬度坐标. 官方文档:https://developers.google.com/maps/?hl=zh-cn 地点详情接口: https://maps.goo ...

  8. Android特色开发之Google MAP

    本文节选于机械工业出版社推出的<Android应用开发揭秘>一书,作者为杨丰盛.本书内容全面,详细讲解了Android框架.Android组件.用户界面开发.游戏开发.数据存储.多媒体开发 ...

  9. Google Map API V3开发(5)

    Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...

最新文章

  1. 懒人神器 !一个创意十足的 Python 命令行工具
  2. SAP Forecasting Replenishment (SAP FR)(中英双语)
  3. Solr中Field常用属性
  4. 景观设计主题命名_好听的景观名字
  5. redis java根据value排序_Redis高级特性——排序
  6. 如何优雅的利用Windows服务来部署ASP.NET Core程序
  7. Sacrilege –自定义SWT滚动条
  8. 街上第一台电子计算机是,南京信息工程大学滨江学院2009级《计算机基础》(文科)a试卷(含答案)【最新】.doc...
  9. linux系统怎么删除打印机,解决LINUX ES3.0下想指定打印机和用户的删除打印作业的问题...
  10. .NET 靠开源再“出圈”!
  11. dqn在训练过程中loss越来越大_强化学习笔记:OpenAI Gym+DQN+Tensorflow2实现
  12. summit超级计算机gpu温度,揭秘Summit:加速计算赋力全球最快超级计算机
  13. Vue进阶-异步动态加载组件
  14. 对话夏琳·查布利斯:Primer.AI机器学习工程师是怎样炼成的?
  15. Windows阿帕奇apache服务器安装(httpd)
  16. IBM副总裁胡世忠:数据是新的自然资源
  17. 开启大功率无线充电新时代
  18. 1.4 7系列FPGA IOB
  19. 小程序代码审核一二事
  20. 计算机处理器ghz,电脑CPU的GHZ代表什么?比如1.7GHZ、2.2GHZ??

热门文章

  1. JavaWeb——JSP技术
  2. base64真正的作用和意义
  3. 二叉树的遍历(非递归)整理
  4. win7 IE11浏览器怎么降至IE8?
  5. 你可以成为测试界的李子柒
  6. 前端发起接口请求时报错:405 Method Not Allowed
  7. 简直无敌!反向代理、负载均衡实战,架构师必备!
  8. Echarts (option.yAxis) Y轴 的属性
  9. arcgis新建图层信息复制_arcgis如何创建图层要素 专家详解
  10. VUE:自定义指令(directives )选项的用法