转载请说明出处!
- 开发工具:android studio 2.2.3
- 测试手机:夜神模拟器,华为MT2
- 百度地图版本:4.3.0
效果图:
Activity:
package com.wentong.zt.map;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.CardView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.baidu.location.Poi;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiNearbySearchOption;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
/**
* 我的位置
*/
private Button btn_myPosition;
/**
* 地图
*/
private MapView mapView;
/**
* 当前位置信息
*/
private TextView tv_myPosition;
/**
* 卡片
*/
private CardView cardView;
/**
* 定义 BaiduMap 地图对象的操作方法与接口
*/
private BaiduMap baiduMap;
/**
* 定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动
*/
private LocationClient locationClient;
/**
* 定位请求回调接口
*/
private BDLocationListener listener = new MyLocationListener();
/**
* 是否第一次定位
*/
private boolean isFirstLogin = true;
/**
* 纬度
*/
private double latitude;
/**
* 经度
*/
private double longitude;
/**
* POI检索接口
*/
PoiSearch poiSearch;
/**
* 展示列表
*/
private RecyclerView recycler;
/**
* RecyclerView适配器
*/
AdapterRecyclerView adapter;
/**
* 地理编码查询接口
*/
GeoCoder geocode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext 注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
initView();
}
/**
* create at 2017/4/13 13:37
* 方法名:initView
* <p>
* 方法说明: 初始化界面
* <p>
*/
private void initView() {
//绑定控件
btn_myPosition = (Button) findViewById(R.id.act_main_btn_myPosition);
mapView = (MapView) findViewById(R.id.act_main_mapView);
recycler = (RecyclerView) findViewById(R.id.act_main_recycler);
tv_myPosition = (TextView) findViewById(R.id.act_main_tv_myPosition);
cardView = (CardView) findViewById(R.id.act_main_cardView);
//recyclerView属性设置
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recycler.setLayoutManager(linearLayoutManager);
//实例化定位服务的客户端
locationClient = new LocationClient(getApplicationContext());
//注册监听函数
locationClient.registerLocationListener(listener);
//配置定位SDK各配置参数,比如定位模式、定位时间间隔、坐标系类型等
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
int span = 1000;
option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
option.setOpenGps(true);//可选,默认false,设置是否使用gps
option.setLocationNotify(true);//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
//地图对象的操作方法与接口
baiduMap = mapView.getMap();
baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);//设置地图类型 MAP_TYPE_NORMAL 普通图; MAP_TYPE_SATELLITE 卫星图;MAP_TYPE_NONE 卫星图
baiduMap.setBuildingsEnabled(true);//设置是否允许楼块效果
baiduMap.setMyLocationEnabled(true);//设置是否允许定位图层
locationClient.setLocOption(option);
locationClient.start();//开始定位
//实例化recyclerView适配器
adapter = new AdapterRecyclerView(this);
//地图移动监听
baiduMap.setOnMapStatusChangeListener(onMapStatusChangeListener);
//我的位置点击事件
btn_myPosition.setOnClickListener(onClickListener);
}
//地图状态改变相关接口
BaiduMap.OnMapStatusChangeListener onMapStatusChangeListener = new BaiduMap.OnMapStatusChangeListener() {
/**
* 手势操作地图,设置地图状态等操作导致地图状态开始改变。
* @param status 地图状态改变开始时的地图状态
*/
@Override
public void onMapStatusChangeStart(MapStatus mapStatus) {
}
/**
* 地图状态变化中
* @param status 当前地图状态
*/
@Override
public void onMapStatusChange(MapStatus mapStatus) {
}
/**
* 地图状态改变结束
* @param status 地图状态改变结束后的地图状态
*/
@Override
public void onMapStatusChangeFinish(MapStatus mapStatus) {
LatLng latLng = baiduMap.getMapStatus().target;
if (geocode == null) {//如果地理编码查询接口为空
geocode = GeoCoder.newInstance();//获取其唯一实例化
}
geocode.setOnGetGeoCodeResultListener(onGetGeoCoderResultListener);//设置查询结果监听者
geocode.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));//发起反地理编码请求(经纬度->地址信息)
retrieval(latLng);
}
} ;
//点击事件
View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.act_main_btn_myPosition:
LatLng latLng = new LatLng(latitude, longitude);//地理坐标基本数据结构
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng, 16f);//描述地图状态将要发生的变化
baiduMap.animateMapStatus(mapStatusUpdate);//以动画方式更新地图状态,动画耗时 300 ms
break;
}
}
} ;
//地理编码/反地理编码结果
OnGetGeoCoderResultListener onGetGeoCoderResultListener = new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {//没有检索到结果
return;
}
Log.e("地理编码结果", geoCodeResult.getAddress().toString());
Toast.makeText(MainActivity.this, geoCodeResult.getAddress().toString(), Toast.LENGTH_SHORT).show();
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {//没有找到检索结果
return;
}
Log.e("反 Geo Code 结果", reverseGeoCodeResult.getAddress().toString());
if (cardView.getVisibility() == cardView.GONE) {
cardView.setVisibility(cardView.VISIBLE);
}
//reverseGeoCodeResult.getAddress()简要地址信息
tv_myPosition.setText(reverseGeoCodeResult.getAddress().toString());
}
};
/**
* create at 2017/4/12 11:23
* 方法名:retrieval
* <p>
* 方法说明: 检索周边位置
* <p>
*/
private void retrieval(LatLng latLng) {
poiSearch = PoiSearch.newInstance();//创建POI检索实例
poiSearch.setOnGetPoiSearchResultListener(poiListener);//设置POI检索监听者
poiSearch.searchNearby(new PoiNearbySearchOption()
.keyword("小")//检索关键字
.radius(100)//设置检索的半径范围
.location(latLng)//检索位置
.pageNum(10)
.pageCapacity(10));//发起检索请求
}
//创建POI检索监听者
OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {//获取POI检索结果
Log.e("PoiResult", "城市:" + poiResult.getAllPoi().get(0).city + "/n名称:" + poiResult.getAllPoi().get(0).name + "/n地址:" + poiResult.getAllPoi().get(0).address);
List<PoiInfo> list_poi = poiResult.getAllPoi(); //获取Poi检索结果
for (PoiInfo p : list_poi) {
Log.e("poi地址信息", p.address);
Log.e("poi所在城市", p.city);
Log.e("poi名称", p.name);
Log.e("poi类型", p.type + "");
}
ArrayList<PoiInfo> arr = (ArrayList) poiResult.getAllPoi();
adapter.setArrayList(arr);
recycler.setAdapter(adapter);
}
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {//获取Place详情页检索结果
Log.e("PoiDetailResult", "进入了PoiDetailResult方法");
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {//获取室内POI搜索结果
Log.e("PoiIndoorResult", "进入了PoiIndoorResult方法");
}
};
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//获取定位结果
StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime()); //获取定位时间
sb.append("\nerror code : ");
sb.append(location.getLocType()); //获取类型类型
sb.append("\nlatitude : ");
sb.append(location.getLatitude()); //获取纬度信息
sb.append("\nlontitude : ");
sb.append(location.getLongitude()); //获取经度信息
sb.append("\nradius : ");
sb.append(location.getRadius()); //获取定位精准度
if (location.getLocType() == BDLocation.TypeGpsLocation) {
// GPS定位结果
sb.append("\nspeed : ");
sb.append(location.getSpeed()); // 单位:公里每小时
sb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber()); //获取卫星数
sb.append("\nheight : ");
sb.append(location.getAltitude()); //获取海拔高度信息,单位米
sb.append("\ndirection : ");
sb.append(location.getDirection()); //获取方向信息,单位度
sb.append("\naddr : ");
sb.append(location.getAddrStr()); //获取地址信息
sb.append("\ndescribe : ");
sb.append("gps定位成功");
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
// 网络定位结果
sb.append("\naddr : ");
sb.append(location.getAddrStr()); //获取地址信息
sb.append("\noperationers : ");
sb.append(location.getOperators()); //获取运营商信息
sb.append("\ndescribe : ");
sb.append("网络定位成功");
} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {
// 离线定位结果
sb.append("\ndescribe : ");
sb.append("离线定位成功,离线定位结果也是有效的");
} else if (location.getLocType() == BDLocation.TypeServerError) {
sb.append("\ndescribe : ");
sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
sb.append("\ndescribe : ");
sb.append("网络不同导致定位失败,请检查网络是否通畅");
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
sb.append("\ndescribe : ");
sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
}
sb.append("\nlocationdescribe : ");
sb.append(location.getLocationDescribe()); //位置语义化信息
List<Poi> list = location.getPoiList(); // POI数据
if (list != null) {
sb.append("\npoilist size = : ");
sb.append(list.size());
for (Poi p : list) {
sb.append("\npoi= : ");
sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
}
}
Log.i("BaiduLocationApiDem", sb.toString());
latitude = location.getLatitude();
longitude = location.getLongitude();
// map view 销毁后不在处理新接收的位置
if (location == null || mapView == null)
return;
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
.direction(100)// 此处设置开发者获取到的方向信息,顺时针0-360
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.build();
baiduMap.setMyLocationData(locData);
if (isFirstLogin) {//如果是第一次加载地图
isFirstLogin = false;
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());//地理坐标基本数据结构
MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll, 16.0f);//设置地图中心点以及缩放级别
baiduMap.animateMapStatus(u);//以动画方式更新地图状态,动画耗时 300 ms
retrieval(new LatLng(latitude, longitude));//检索周边信息
geocode = GeoCoder.newInstance();//获取新建地理编码查询
geocode.setOnGetGeoCodeResultListener(onGetGeoCoderResultListener);//设置查询结果监听者
geocode.reverseGeoCode(new ReverseGeoCodeOption().location(ll));//发起反地理编码请求(经纬度->地址信息)
}
}
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
}
@Override
protected void onPause() {
mapView.onPause();//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
super.onPause();
}
@Override
protected void onDestroy() {
mapView.onDestroy();//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
if (poiSearch != null) {
poiSearch.destroy();
}
if (geocode != null) {
geocode.destroy();
}
super.onDestroy();
}
@Override
protected void onRestart() {
mapView.onResume();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
super.onRestart();}}
XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.wentong.zt.map.MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:gravity="center_vertical">
<Button
android:id="@+id/act_main_btn_retrieval"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:text="返回" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="位置信息" />
<Button
android:id="@+id/act_main_btn_myPosition"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:text="我的位置" />
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.baidu.mapapi.map.MapView
android:id="@+id/act_main_mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"></com.baidu.mapapi.map.MapView>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:orientation="vertical">
<android.support.v7.widget.CardView
android:id="@+id/act_main_cardView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone">
<TextView
android:id="@+id/act_main_tv_myPosition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:textColor="#000000" />
</android.support.v7.widget.CardView>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/mark_normal" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="2">
<android.support.v7.widget.RecyclerView
android:id="@+id/act_main_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
</LinearLayout>
</LinearLayout>
AdapterRecyclerView:
package com.wentong.zt.map;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.baidu.mapapi.search.core.PoiInfo;
import java.util.ArrayList;
import static com.baidu.location.h.j.ar;
/**
* Created by Administrator on 2017/4/12.
*/
public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.My>{
Context context ;
ArrayList<PoiInfo> arrayList ;
public AdapterRecyclerView(Context context) {
this.context = context;
arrayList = new ArrayList<>() ;
}
public ArrayList<PoiInfo> getArrayList() {
return arrayList;
}
public void setArrayList(ArrayList<PoiInfo> arrayList) {
this.arrayList = arrayList;
}
@Override
public My onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.adapter_recycler , parent , false) ;
My my = new My(view) ;
return my;
}
@Override
public void onBindViewHolder(My holder, int position) {
holder.tv_city.setText(arrayList.get(position).address);
holder.tv_name.setText(arrayList.get(position).name);
}
@Override
public int getItemCount() {
return arrayList.size();
}
class My extends RecyclerView.ViewHolder{
TextView tv_name , tv_city ;
public My(View itemView) {
super(itemView);
tv_name = (TextView) itemView.findViewById(R.id.ada_recycler_tv_name) ;
tv_city = (TextView) itemView.findViewById(R.id.ada_recycler_tv_city) ;
}
}
}
adapter_recycler XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:orientation="vertical">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/ada_recycler_tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" />
<TextView
android:id="@+id/ada_recycler_tv_city"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="center" />
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
题外话:
- 整理思路:
1、我们要在手机上显示出百度地图:
xml:
<com.baidu.mapapi.map.MapView
android:id="@+id/act_main_mapView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.baidu.mapapi.map.MapView>
在使用SDK各组件之前初始化context信息,传入ApplicationContext 注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
2、如何获取我们的位置
定位请求回调接口
private BDLocationListener listener = new MyLocationListener();
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//获取定位结果
StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime()); //获取定位时间
sb.append("\nerror code : ");
sb.append(location.getLocType()); //获取类型类型
sb.append("\nlatitude : ");
sb.append(location.getLatitude()); //获取纬度信息
sb.append("\nlontitude : ");
sb.append(location.getLongitude()); //获取经度信息
sb.append("\nradius : ");
sb.append(location.getRadius()); //获取定位精准度
if (location.getLocType() == BDLocation.TypeGpsLocation) {
// GPS定位结果
sb.append("\nspeed : ");
sb.append(location.getSpeed()); // 单位:公里每小时
sb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber()); //获取卫星数
sb.append("\nheight : ");
sb.append(location.getAltitude()); //获取海拔高度信息,单位米
sb.append("\ndirection : ");
sb.append(location.getDirection()); //获取方向信息,单位度
sb.append("\naddr : ");
sb.append(location.getAddrStr()); //获取地址信息
sb.append("\ndescribe : ");
sb.append("gps定位成功");
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
// 网络定位结果
sb.append("\naddr : ");
sb.append(location.getAddrStr()); //获取地址信息
sb.append("\noperationers : ");
sb.append(location.getOperators()); //获取运营商信息
sb.append("\ndescribe : ");
sb.append("网络定位成功");
} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {
// 离线定位结果
sb.append("\ndescribe : ");
sb.append("离线定位成功,离线定位结果也是有效的");
} else if (location.getLocType() == BDLocation.TypeServerError) {
sb.append("\ndescribe : ");
sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
sb.append("\ndescribe : ");
sb.append("网络不同导致定位失败,请检查网络是否通畅");
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
sb.append("\ndescribe : ");
sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
}
sb.append("\nlocationdescribe : ");
sb.append(location.getLocationDescribe()); //位置语义化信息
List<Poi> list = location.getPoiList(); // POI数据
if (list != null) {
sb.append("\npoilist size = : ");
sb.append(list.size());
for (Poi p : list) {
sb.append("\npoi= : ");
sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
}
}
Log.i("BaiduLocationApiDem", sb.toString());
location.getLatitude();//纬度
location.getLongitude();//经度
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
}
我们的位置(经纬度)
location.getLatitude();//纬度
location.getLongitude();//经度
3、如何在屏幕中显示我们当前的位置:
LatLng latLng = new LatLng(纬度, 经度);
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng, 16f);
baiduMap.animateMapStatus(mapStatusUpdate);
4、滑动地图标注跟着一起动?
不得不说当时我也是懵逼状态,好在本少爷天资纵横。
这其实是我的一种错觉,根据初中物理所学,物体的运动是相互的。我看到的标注随着地图滑动而运动是错误的,其实那个标注从未移动,是我的眼睛欺骗了我。想明白这一点做这个就很简单了。我们在布局中的地图正中心钉死一张图片,然后我们获取在屏幕正中心的经纬度。根据经纬度获取地理位置信息,根据经纬度进行Poi检索。
XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.wentong.zt.map.MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.baidu.mapapi.map.MapView
android:id="@+id/act_main_mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"></com.baidu.mapapi.map.MapView>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:orientation="vertical">
<android.support.v7.widget.CardView
android:id="@+id/act_main_cardView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone">
<TextView
android:id="@+id/act_main_tv_myPosition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:textColor="#000000" />
</android.support.v7.widget.CardView>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/mark_normal" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</LinearLayout>
5、地图移动监听:
地图对象的操作方法与接口
baiduMap = mapView.getMap();
地图移动监听
baiduMap.setOnMapStatusChangeListener(onMapStatusChangeListener);
地图状态改变相关接口
BaiduMap.OnMapStatusChangeListener onMapStatusChangeListener = new BaiduMap.OnMapStatusChangeListener() {
/**
* 手势操作地图,设置地图状态等操作导致地图状态开始改变。
* @param status 地图状态改变开始时的地图状态
*/
@Override
public void onMapStatusChangeStart(MapStatus mapStatus) {
}
/**
* 地图状态变化中
* @param status 当前地图状态
*/
@Override
public void onMapStatusChange(MapStatus mapStatus) {
}
/**
* 地图状态改变结束
* @param status 地图状态改变结束后的地图状态
*/
@Override
public void onMapStatusChangeFinish(MapStatus mapStatus) {
LatLng latLng = baiduMap.getMapStatus().target;//地图操作中心点在屏幕中的坐标
if (geocode == null) {
geocode = GeoCoder.newInstance();
}
//根据坐标获取地理位置信息,也就是百度官网所说的反Geo地理编码
geocode.setOnGetGeoCodeResultListener(onGetGeoCoderResultListener);
geocode.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));
retrieval(latLng);//根据经纬度检索周边信息
}
} ;
6、地理编码,反地理编码
通俗点讲 : 地理编码就是根据地理位置信息获取经纬度(例:广岛--(经度,纬度))
反地理编码就是根据经纬度获取地理位置信息(例:(经度,纬度)--长崎)
地理编码查询接口
GeoCoder geocode = GeoCoder.newInstance();
geocode.setOnGetGeoCodeResultListener(onGetGeoCoderResultListener);
geocode.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));
地理编码、反地理编码结果
OnGetGeoCoderResultListener onGetGeoCoderResultListener = new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {//没有检索到结果
return;
}
Log.e("地理编码结果", geoCodeResult.getAddress().toString());
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {//没有找到检索结果
return;
}
Log.e("反 Geo Code 结果", reverseGeoCodeResult.getAddress().toString());
}
};
7、Poi之周边信息检索
PoiSearch poiSearch = PoiSearch.newInstance();//创建POI检索实例
poiSearch.setOnGetPoiSearchResultListener(poiListener);//设置POI检索监听者
poiSearch.searchNearby(new PoiNearbySearchOption()
.keyword("小")//检索关键字
.radius(100)//设置检索的半径范围
.location(new LatLng(纬度, 经度))//检索位置
.pageNum(10)//分页编号
.pageCapacity(10));//发起检索请求