关于使用google map实现周边搜索的功能
由于公司项目是针对美国市场,所以接入的是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实现周边搜索的功能相关推荐
- 使用google map实现周边搜索的功能_「转」“搜索”的原理,架构,实现,实践,面试不用再怕了...
可能99%的同学不做搜索引擎,但99%的同学一定实现过检索功能.搜索,检索,这里面到底包含哪些技术的东西,希望本文能够给大家一些启示. 全网搜索引擎架构与流程如何? 全网搜索引擎的宏观架构如上图,核心 ...
- 用google map实现周边搜索功能
项目要实现根据经纬度获取附近的建筑,由于项目在海外运营,谷歌地图首当其冲. 首先说明的是,该功能需要在服务端实现,也就是安卓的SDK不适用. api文档地址: https://developers.g ...
- google map v3 地图搜索功能
第一次做google map 开发,对很多东西不熟习,除了看api外,就是各种尝试.也谢谢帮我的 睥睨 在下班前,把这些整理了下传上来,方便自己以后用到,同时也给做map开发的新人一点提示吧 func ...
- 记录:谷歌地图google map api实现基本测距功能
测距 demo-代码 <!DOCTYPE html> <eteral:html><head><meta name="viewport" c ...
- GIS(六)——实现js版搜狗地图周边搜索功能
在上一篇文章<GIS(五)--完成js版搜狗地图基本交互搜索功能>中,介绍了搜狗地图的关键字搜索功能,今天就实现以下另一个重要功能吧--那就是周边搜索功能. 按照惯例,还是把官网上的示例代 ...
- Google map 和Baidu map搜索目标地点周边
0. 引言 本文主要是总结之前项目中的地图需求: 1.根据后端返回的location(坐标)在地图上marker. 2.可以搜索出该点附近的景点,酒店,餐厅等周边.(需要在地图上marker出来) 3 ...
- Google Map API使用谷歌地图api实现地点搜索功能
需求:提供谷歌地图搜索地点功能,并查出经纬度坐标. 官方文档:https://developers.google.com/maps/?hl=zh-cn 地点详情接口: https://maps.goo ...
- Android特色开发之Google MAP
本文节选于机械工业出版社推出的<Android应用开发揭秘>一书,作者为杨丰盛.本书内容全面,详细讲解了Android框架.Android组件.用户界面开发.游戏开发.数据存储.多媒体开发 ...
- 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 ...
最新文章
- 懒人神器 !一个创意十足的 Python 命令行工具
- SAP Forecasting Replenishment (SAP FR)(中英双语)
- Solr中Field常用属性
- 景观设计主题命名_好听的景观名字
- redis java根据value排序_Redis高级特性——排序
- 如何优雅的利用Windows服务来部署ASP.NET Core程序
- Sacrilege –自定义SWT滚动条
- 街上第一台电子计算机是,南京信息工程大学滨江学院2009级《计算机基础》(文科)a试卷(含答案)【最新】.doc...
- linux系统怎么删除打印机,解决LINUX ES3.0下想指定打印机和用户的删除打印作业的问题...
- .NET 靠开源再“出圈”!
- dqn在训练过程中loss越来越大_强化学习笔记:OpenAI Gym+DQN+Tensorflow2实现
- summit超级计算机gpu温度,揭秘Summit:加速计算赋力全球最快超级计算机
- Vue进阶-异步动态加载组件
- 对话夏琳·查布利斯:Primer.AI机器学习工程师是怎样炼成的?
- Windows阿帕奇apache服务器安装(httpd)
- IBM副总裁胡世忠:数据是新的自然资源
- 开启大功率无线充电新时代
- 1.4 7系列FPGA IOB
- 小程序代码审核一二事
- 计算机处理器ghz,电脑CPU的GHZ代表什么?比如1.7GHZ、2.2GHZ??