您的位置:首页 > 其它

百度地图的简单使用(定位、画区域、线路规划、搜索)

2017-09-11 17:44 726 查看
参考学习:

百度地图官网:

androidsdk/guide/basicmap - Wiki http://lbsyun.baidu.com/index.php?title=androidsdk/guide/basicmap
很有学习价值!!!

Small_Cake的专栏里对于百度地图的使用做了很详细的介绍

1.深入学习百度地图Android SDK v4.0.0【第一关】基础地图 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52193921
2.深入学习百度地图Android SDK v4.0.0【第二关】公交地图 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52199135
3.深入学习百度地图Android SDK v4.0.0【第三关】路线规划 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52212402
4.深入学习百度地图Android SDK v4.0.0【第四关】OpenGL绘制 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52336116
5.深入学习百度地图Android SDK v4.0.0【第五关】瓦片图层 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52370635
6.深入学习百度地图Android SDK v4.0.0【第六关】室内地图 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52370729
7.深入学习百度地图Android SDK v4.0.0【第七关】周边雷达 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52412099

注意事项:

libs文件夹放入jar包,在main里新建的jniLibs文件夹放入.so文件

具体代码:

学习的时候,大神有时没有放具体的布局截图或代码,所以自行研究了一下,特此记录下来。

我把每一个功能都独立出来了,一个大功能一个界面。

1.公交线路搜索:

1.布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#FFFFFF"
android:layout_width="match_parent"
android:layout_height="match_parent">

<EditText
android:id="@+id/ed_start_bus_station"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入城市名称"/>
<EditText
android:id="@+id/ed_end_bus_station"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入公交路线号"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_choose_bus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="搜索公交路线"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:gravity="center"
android:layout_weight="1"
android:textSize="21sp"/>
<TextView
android:id="@+id/tv_previous"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上一个"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:gravity="center"
android:layout_weight="1"
android:textSize="21sp"/>
<TextView
android:id="@+id/tv_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一个"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:gravity="center"
android:layout_weight="1"
android:textSize="21sp"/>
</LinearLayout>
<com.baidu.mapapi.map.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:clickable="true" />
</LinearLayout>


2.activity代码:

public class ActBusLineMap extends AppCompatActivity
implements OnGetBusLineSearchResultListener, OnGetPoiSearchResultListener {

@BindView(R.id.map_view)
MapView mapView;
@BindView(R.id.ed_start_bus_station)
EditText edStartBusStation;
@BindView(R.id.ed_end_bus_station)
EditText edEndBusStation;
@BindView(R.id.tv_choose_bus)
TextView tvChooseBus;
@BindView(R.id.tv_previous)
TextView tvPrevious;
@BindView(R.id.tv_next)
TextView tvNext;

private BaiduMap mBaiduMap;

private PoiSearch poiSearch;
private BusLineSearch busLineSearch;
private List<String> busLines = new ArrayList<>();
private int uidPostion = 0;//当前选中第几条路线
private BusLineResult mBusLineResult;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());

setContentView(R.layout.activity_act_buslinemap);
ButterKnife.bind(this);

mBaiduMap = mapView.getMap();

init();
onEvent();

}

/**
* 点击事件
* @param view
*/
@OnClick({R.id.tv_choose_bus, R.id.tv_previous, R.id.tv_next})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.tv_choose_bus:
poiSearch.searchInCity(
new PoiCitySearchOption().city(
edStartBusStation.getText().toString()).keyword(edEndBusStation.getText().toString()));
break;
case R.id.tv_previous:
if (uidPostion>0){
uidPostion--;
searchBusLine();
}
break;
case R.id.tv_next:
if (uidPostion<(busLines.size()-1)){
uidPostion++;
searchBusLine();
}
break;
}
}

private void onEvent() {

}

public void init() {
//检索查询初始化并监听
poiSearch = PoiSearch.newInstance();
poiSearch.setOnGetPoiSearchResultListener(this);
//路线查询初始化并监听
busLineSearch = BusLineSearch.newInstance();
busLineSearch.setOnGetBusLineSearchResultListener(this);
//公交路线覆盖物,并设置路线的点击事件
overlay = new BusLineOverlay(mBaiduMap){
@Override
public boolean onBusStationClick(int index) {
if (mBusLineResult.getStations() != null
&& mBusLineResult.getStations().get(index) != null) {
showToast( mBusLineResult.getStations().get(index).getTitle() );
}
return true;
};
};
mBaiduMap.setOnMarkerClickListener(overlay);
}

/**
* 【1】首先检索查询
*
* @param poiResult
*/
@Override
public void onGetPoiResult(PoiResult poiResult) {
if (poiResult == null || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
showToast("抱歉,未找到结果" );
return;
}
if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {

busLines.clear();
List<PoiInfo> allPoi = poiResult.getAllPoi();
if (allPoi == null || allPoi.size() == 0) return;
for (int i = 0; i < allPoi.size(); i++) {
PoiInfo poiInfo = allPoi.get(i);
//如果是公交类型的路线,就把它的UID添加到集合中
if (poiInfo.type == PoiInfo.POITYPE.BUS_LINE) {
busLines.add(poiInfo.uid);
}
}
mBusLineResult=null;
if (busLines.size() == 0) return;
uidPostion = 0;
showToast( "发现"+busLines.size()+"条线路!");
busLineSearch.searchBusLine(
new BusLineSearchOption().city(edStartBusStation.getText().toString()).uid(busLines.get(uidPostion)));
}
}

/**
* 【2】从检索的结果中筛选出公交路线
* 并将其添加到地图上
*
* @param busLineResult
*/
private BusLineResult route = null; // 保存驾车/步行路线数据的变量,供浏览节点时使用
private int nodeIndex = -2; // 节点索引,供浏览节点时使用
BusLineOverlay overlay; // 公交路线绘制对象
@Override
public void onGetBusLineResult(BusLineResult busLineResult) {
if (busLineResult == null || busLineResult.error != SearchResult.ERRORNO.NO_ERROR) {
showToast( "抱歉,未找到结果" );
return;
}

mBaiduMap.clear();
mBusLineResult = busLineResult;
nodeIndex = -1;
overlay.removeFromMap();
overlay.setData(busLineResult);
overlay.addToMap();
overlay.zoomToSpan();
tvPrevious.setVisibility(View.VISIBLE);
tvNext.setVisibility(View.VISIBLE);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("路线详情").setMessage(busLineResult.getBusLineName()).setPositiveButton("朕知道了",null).show();
}

@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
}

@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}

private void searchBusLine(){
showToast( "当前查询的路线=="+uidPostion);
busLineSearch.searchBusLine(
new BusLineSearchOption().city(edStartBusStation.getText().toString()).uid(busLines.get(uidPostion)));

}

private void showToast(String str){
Toast.makeText(ActBusLineMap.this,str,Toast.LENGTH_SHORT).show();
}

@Override
public void onBackPressed() {
super.onBackPressed();
if (!isFinishing()) {
finish();
}
}

@Override
protected void onDestroy() {
super.onDestroy();
// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mapView.onDestroy();
busLineSearch.destroy();
poiSearch.destroy();
}

@Override
protected void onResume() {
super.onResume();
// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mapView.onResume();
}

@Override
protected void onPause() {
super.onPause();
// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mapView.onPause();
}

}


2.定位

1.布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#FFFFFF"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.baidu.mapapi.map.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
</LinearLayout>


2.activity代码:

public class ActLocation extends AppCompatActivity {

@BindView(R.id.map_view)
MapView mapView;

private BaiduMap mBaiduMap;
public LocationClient mLocationClient = null;
//BDAbstractLocationListener为7.2版本新增的Abstract类型的监听接口,
// 原有BDLocationListener接口暂时同步保留。具体介绍请参考后文中的说明
public BDAbstractLocationListener myListener = new MyLocationListener();

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());

setContentView(R.layout.activity_act_location);
ButterKnife.bind(this);

mBaiduMap = mapView.getMap();
//设置地图级别为18
initMap(18);

mLocationClient = new LocationClient(getApplicationContext());
//声明LocationClient类
mLocationClient.registerLocationListener( myListener );
//注册监听函数

mLocationClient.start();
initLocation();
}

private void initLocation(){

LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备

option.setCoorType("bd09ll");
//可选,默认bd09ll表示百度经纬度坐标,设置返回的定位结果坐标系

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仿真结果,默认需要

//        option.setWifiValidTime(5*60*1000);
//可选,7.2版本新增能力,如果您设置了这个接口,首次启动定位时,会先判断当前WiFi是否超出有效期,超出有效期的话,会先重新扫描WiFi,然后再定位

mLocationClient.setLocOption(option);
}

public class MyLocationListener extends BDAbstractLocationListener {

@Override
public void onReceiveLocation(BDLocation location) {

if( location != null ){
//设置一开始的中心点
initLocation( location.getLatitude(), location.getLongitude() );
//显示标记图标
drawMark( location.getLatitude(), location.getLongitude() );
//以此为中心绘制指定区域圆形
drawCircle( location.getLatitude(), location.getLongitude() );
}

//获取定位结果
location.getTime();    //获取定位时间
location.getLocationID();    //获取定位唯一ID,v7.2版本新增,用于排查定位问题
location.getLocType();    //获取定位类型
location.getLatitude();    //获取纬度信息
location.getLongitude();    //获取经度信息
location.getRadius();    //获取定位精准度
location.getAddrStr();    //获取地址信息
location.getCountry();    //获取国家信息
location.getCountryCode();    //获取国家码
location.getCity();    //获取城市信息
location.getCityCode();    //获取城市码
location.getDistrict();    //获取区县信息
location.getStreet();    //获取街道信息
location.getStreetNumber();    //获取街道码
location.getLocationDescribe();    //获取当前位置描述信息
location.getPoiList();    //获取当前位置周边POI信息

location.getBuildingID();    //室内精准定位下,获取楼宇ID
location.getBuildingName();    //室内精准定位下,获取楼宇名称
location.getFloor();    //室内精准定位下,获取当前位置所处的楼层信息

if (location.getLocType() == BDLocation.TypeGpsLocation){

//当前为GPS定位结果,可获取以下信息
location.getSpeed();    //获取当前速度,单位:公里每小时
location.getSatelliteNumber();    //获取当前卫星数
location.getAltitude();    //获取海拔高度信息,单位米
location.getDirection();    //获取方向信息,单位度

} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){

//当前为网络定位结果,可获取以下信息
location.getOperators();    //获取运营商信息

} else if (location.getLocType() == BDLocation.TypeOffLineLocation) {

//当前为网络定位结果

} else if (location.getLocType() == BDLocation.TypeServerError) {

//当前网络定位失败
//可将定位唯一ID、IMEI、定位失败时间反馈至loc-bugs@baidu.com

} else if (location.getLocType() == BDLocation.TypeNetWorkException) {

//当前网络不通

} else if (location.getLocType() == BDLocation.TypeCriteriaException) {

//当前缺少定位依据,可能是用户没有授权,建议弹出提示框让用户开启权限
//可进一步参考onLocDiagnosticMessage中的错误返回码

}
}

/**
* 回调定位诊断信息,开发者可以根据相关信息解决定位遇到的一些问题
* 自动回调,相同的diagnosticType只会回调一次
*
* @param locType           当前定位类型
* @param diagnosticType    诊断类型(1~9)
* @param diagnosticMessage 具体的诊断信息释义
*/
public void onLocDiagnosticMessage(int locType, int diagnosticType, String diagnosticMessage) {

if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_BETTER_OPEN_GPS) {

//建议打开GPS

} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_BETTER_OPEN_WIFI) {

//建议打开wifi,不必连接,这样有助于提高网络定位精度!

} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_CHECK_LOC_PERMISSION) {

//定位权限受限,建议提示用户授予APP定位权限!

} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_CHECK_NET) {

//网络异常造成定位失败,建议用户确认网络状态是否异常!

} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_CLOSE_FLYMODE) {

//手机飞行模式造成定位失败,建议用户关闭飞行模式后再重试定位!

} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_INSERT_SIMCARD_OR_OPEN_WIFI) {

//无法获取任何定位依据,建议用户打开wifi或者插入sim卡重试!

} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_OPEN_PHONE_LOC_SWITCH) {

//无法获取有效定位依据,建议用户打开手机设置里的定位开关后重试!

} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_SERVER_FAIL) {

//百度定位服务端定位失败
//建议反馈location.getLocationID()和大体定位时间到loc-bugs@baidu.com

} else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_FAIL_UNKNOWN) {

//无法获取有效定位依据,但无法确定具体原因
//建议检查是否有安全软件屏蔽相关定位权限
//或调用LocationClient.restart()重新启动后重试!

}
}

}

/**
* 设置地图级别为18
*
* @param grade
*/
private void initMap(int grade) {
//描述地图将要发生的变化,使用工厂类MapStatusUpdateFactory创建,
//设置级别为18,进去就是18了,默认是12
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.zoomTo(grade);
mBaiduMap.setMapStatus(mapStatusUpdate);
//是否显示缩放按钮
//mMapView.showZoomControls(false);
}

/**
* 绘制mark覆盖物
*/
private void drawMark(double varX, double varY) {
MarkerOptions markerOptions = new MarkerOptions();
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_map_mark); // 描述图片
markerOptions.position(new LatLng(varX, varY)) // 设置位置
.icon(bitmap) // 加载图片
.draggable(true) // 支持拖拽
.title("当前位置"); // 显示文本
//把绘制的圆添加到百度地图上去
mBaiduMap.addOverlay(markerOptions);
}

/**
* 设置一开始中心点的经纬度坐标
*
* @param varX
* @param varY
*/
private void initLocation(double varX, double varY) {
//经纬度(纬度,经度)
LatLng latlng = new LatLng(varX, varY);
MapStatusUpdate mapStatusUpdate_circle = MapStatusUpdateFactory.newLatLng(latlng);
mBaiduMap.setMapStatus(mapStatusUpdate_circle);
}

/**
* 绘制圆
*/
private void drawCircle( double varX, double varY) {
// 1.创建自己
CircleOptions circleOptions = new CircleOptions();
// 2.设置数据 以世界之窗为圆心,1000米为半径绘制
circleOptions.center(new LatLng(varX, varY))//中心
.radius(1000)  //半径
.fillColor(0x00000000)//填充圆的颜色 0x60FF0000
.stroke(new Stroke(10, 0x600FF000));  //边框的宽度和颜色
//把绘制的圆添加到百度地图上去
mBaiduMap.addOverlay(circleOptions);
}

@Override
public void onBackPressed() {
super.onBackPressed();
if (!isFinishing()) {
finish();
}
}

@Override
protected void onDestroy() {
super.onDestroy();
// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mapView.onDestroy();
}

@Override
protected void onResume() {
super.onResume();
// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mapView.onResume();
}

@Override
protected void onPause() {
super.onPause();
// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mapView.onPause();
}

}


3.搜索关键词:

1.布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#FFFFFF"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:orientation="horizontal"
android:layout_margin="10dp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/ed_search"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="match_parent" />
<Button
android:id="@+id/btn_range_search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00000000"
android:textSize="24sp"
android:layout_weight="3"
android:text="范围搜索"/>
<Button
android:id="@+id/btn_around_search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00000000"
android:textSize="24sp"
android:layout_weight="3"
android:text="周边搜索"/>
</LinearLayout>

<com.baidu.mapapi.map.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
</LinearLayout>


2.acitivty代码:

public class ActSearchAddress extends AppCompatActivity {

@BindView(R.id.ed_search)
EditText edSearch;
@BindView(R.id.btn_range_search)
Button btnRangeSearch;
@BindView(R.id.btn_around_search)
Button btnAroundSearch;
@BindView(R.id.map_view)
MapView mapView;

//初始化一个搜索广播
private PoiSearch poiSearch;

private BaiduMap mBaiduMap;
private double coordinateX = 22.5422870000;
private double coordinateY = 113.9804440000;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());

setContentView(R.layout.activity_act_searchaddress);
ButterKnife.bind(this);

mBaiduMap = mapView.getMap();

//设置地图级别为18
initMap(18);

//设置地图中心点
initLocation(coordinateX, coordinateY);
}

@OnClick({R.id.btn_range_search, R.id.btn_around_search})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.btn_range_search:
//范围搜索
//搜索:指定范围、关键字,周边搜索和范围搜索基本一致
if (!TextUtils.isEmpty(edSearch.getText().toString().trim())) {
rangeSearch(edSearch.getText().toString().trim());
} else {
Toast.makeText(getApplicationContext(), "请输入关键字", Toast.LENGTH_SHORT).show();
}
break;
case R.id.btn_around_search:
//周边圆形搜索
//搜索:指定关键字、圆半径、中心点
if (!TextUtils.isEmpty(edSearch.getText().toString().trim())) {
aroundSearch(edSearch.getText().toString().trim());
} else {
Toast.makeText(getApplicationContext(), "请输入关键字", Toast.LENGTH_SHORT).show();
}
break;
}
}

/**
* 设置地图级别为18
*
* @param grade
*/
private void initMap(int grade) {
//描述地图将要发生的变化,使用工厂类MapStatusUpdateFactory创建,
//设置级别为18,进去就是18了,默认是12
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.zoomTo(grade);
mBaiduMap.setMapStatus(mapStatusUpdate);
//是否显示缩放按钮
//mMapView.showZoomControls(false);
}

/**
* 设置一开始中心点的经纬度坐标
*
* @param varX
* @param varY
*/
private void initLocation(double varX, double varY) {
//经纬度(纬度,经度)
LatLng latlng = new LatLng(varX, varY);
MapStatusUpdate mapStatusUpdate_circle = MapStatusUpdateFactory.newLatLng(latlng);
mBaiduMap.setMapStatus(mapStatusUpdate_circle);
}

/**
* 范围搜索:指定范围、关键字进行搜索
* 标记处此范围内所有与关键字相关的地方
*
* @param keyWord
*/
private void rangeSearch(String keyWord) {
// 实例化搜索方法
PoiSearch newInstance = PoiSearch.newInstance();
newInstance.setOnGetPoiSearchResultListener(new MyRangeSearchListener());
// 发出搜索的请求 范围检索
PoiBoundSearchOption boundOption = new PoiBoundSearchOption();
// 确定两点坐标(东北,西南),在此两点之间的范围内搜索
LatLngBounds latLngBounds = new LatLngBounds.Builder()
// 这里我们随机弄两个坐标 分别是深圳世界之窗附近
.include(new LatLng(22.5441560000, 113.9828800000)) // 世界之窗右上角的美加广场
.include(new LatLng(22.5413850000, 113.9777770000)) // 世界之窗左下角的一个不知道叫啥的街道
.build();
boundOption.bound(latLngBounds); // 设置搜索的范围
boundOption.keyword(keyWord); // 搜索的关键字
newInstance.searchInBound(boundOption);
}

/**
* 周边搜索
*
* @param keyWord
*/
private void aroundSearch(String keyWord) {
poiSearch = PoiSearch.newInstance();
poiSearch.setOnGetPoiSearchResultListener(new MyAroudSearchListener());

PoiNearbySearchOption nearbyOption = new PoiNearbySearchOption();
LatLng hmPos = new LatLng(22.5441560000, 113.9828800000);//指定中心点
nearbyOption.location(hmPos);// 设置中心点
nearbyOption.radius(1000);// 设置半径 单位是米
nearbyOption.keyword(keyWord);// 关键字
poiSearch.searchNearby(nearbyOption);
}

/**
* 范围搜索监听
*/
class MyRangeSearchListener implements OnGetPoiSearchResultListener {

@Override
public void onGetPoiDetailResult(PoiDetailResult result) {

}

@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {

}

@Override
public void onGetPoiResult(PoiResult result) {
// 收到发送过来的搜索请求之后我们进行处理
if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
Toast.makeText(getApplicationContext(), "未搜索到结果", Toast.LENGTH_LONG).show();
return;
}
//搜索类型的类
PoiOverlay overlay = new PoiOverlay(mBaiduMap);  //处理搜索Poi的覆盖物
mBaiduMap.setOnMarkerClickListener(overlay);// 把事件分发给overlay,overlay才能处理点击事件
overlay.setData(result);  //设置结果
overlay.addToMap();//把搜索的结果添加到地图中去
overlay.zoomToSpan(); //自动缩放到所以的mark覆盖物都能看到
}
}

/**
* 周边搜索(圆形)
*/
class MyAroudSearchListener implements OnGetPoiSearchResultListener {

@Override
public void onGetPoiDetailResult(PoiDetailResult result) {
if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
Toast.makeText(getApplicationContext(), "未搜索到结果", Toast.LENGTH_LONG).show();
return;
}

String text = result.getAddress() + "::" + result.getCommentNum() + result.getEnvironmentRating();
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show();
}

@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {

}

@Override
public void onGetPoiResult(PoiResult result) {
if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
Toast.makeText(getApplicationContext(), "未搜索到结果", Toast.LENGTH_LONG).show();
return;
}
PoiOverlay overlay = new MyPoiOverlay(mBaiduMap);// 搜索poi的覆盖物
mBaiduMap.setOnMarkerClickListener(overlay);// 把事件分发给overlay,overlay才能处理点击事件
overlay.setData(result);// 设置结果
overlay.addToMap();// 把搜索的结果添加到地图中
overlay.zoomToSpan();// 缩放地图,使所有Overlay都在合适的视野内 注: 该方法只对Marker类型的overlay有效
}

}

//自己实现点击事件
class MyPoiOverlay extends PoiOverlay {

public MyPoiOverlay(BaiduMap arg0) {
super(arg0);
}

@Override
public boolean onPoiClick(int index) {
PoiResult poiResult = getPoiResult();
PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 得到点击的那个poi信息
String text = poiInfo.name + "," + poiInfo.address;
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();

PoiDetailSearchOption detailOption = new PoiDetailSearchOption();
detailOption.poiUid(poiInfo.uid);// 设置poi的uid
poiSearch.searchPoiDetail(detailOption);

return super.onPoiClick(index);
}
}

@Override
public void onBackPressed() {
super.onBackPressed();
if (!isFinishing()) {
finish();
}
}

@Override
protected void onDestroy() {
super.onDestroy();
// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mapView.onDestroy();
}

@Override
protected void onResume() {
super.onResume();
// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mapView.onResume();
}

@Override
protected void onPause() {
super.onPause();
// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mapView.onPause();
}

}


4.线路规划

1.布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#FFFFFF"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:id="@+id/layout_search_bus_line"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/ed_city"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入城市名"/>
<EditText
android:id="@+id/ed_start_bus_station"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入起始点"/>
<EditText
android:id="@+id/ed_end_bus_station"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:hint="请输入终点"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_choose_biking"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="骑行"
android:layout_margin="5dp"
android:gravity="center"
android:layout_weight="1"
android:textSize="21sp"/>
<TextView
android:id="@+id/tv_choose_car"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="驾车"
android:layout_margin="5dp"
android:gravity="center"
android:layout_weight="1"
android:textSize="21sp"/>
<TextView
android:id="@+id/tv_choose_bus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="公交"
android:layout_margin="5dp"
android:gravity="center"
android:layout_weight="1"
android:textSize="21sp"/>
<TextView
android:id="@+id/tv_choose_walk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="步行"
android:layout_margin="5dp"
android:gravity="center"
android:layout_weight="1"
android:textSize="21sp"/>
</LinearLayout>

</LinearLayout>

<com.baidu.mapapi.map.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:clickable="true" />
</LinearLayout>


2.activity代码:

public class ActRoutePlanMap extends AppCompatActivity
implements   OnGetRoutePlanResultListener {

@BindView(R.id.map_view)
MapView mapView;

@BindView(R.id.ed_city)
EditText edCity;
@BindView(R.id.ed_start_bus_station)
EditText edStartBusStation;
@BindView(R.id.ed_end_bus_station)
EditText edEndBusStation;
@BindView(R.id.tv_choose_biking)
TextView tvChooseBiking;
@BindView(R.id.tv_choose_car)
TextView tvChooseCar;
@BindView(R.id.tv_choose_bus)
TextView tvChooseBus;
@BindView(R.id.tv_choose_walk)
TextView tvChooseWalk;

private BaiduMap mBaiduMap;

private RoutePlanSearch routePlanSearch;//路径规划搜索接口

private BikingRouteOverlay bikingOverlay;
private DrivingRouteOverlay drivingOverlay;
private TransitRouteOverlay transOverlay;
private WalkingRouteOverlay walkingOverlay;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());

setContentView(R.layout.activity_act_routeplanmap);
ButterKnife.bind(this);
mBaiduMap = mapView.getMap();

init();
}

@OnClick({ R.id.tv_choose_biking,
R.id.tv_choose_car, R.id.tv_choose_bus, R.id.tv_choose_walk})
public void onViewClicked(View view) {
//路径规划中的出行节点信息,出行节点包括:起点,终点,途经点
PlanNode fromPlanNode = PlanNode.withCityNameAndPlaceName(edCity.getText().toString(), edStartBusStation.getText().toString());
PlanNode toPlanNode = PlanNode.withCityNameAndPlaceName(edCity.getText().toString(), edEndBusStation.getText().toString());
switch (view.getId()) {
/**
* 各种路线规划的查询
*/
case R.id.tv_choose_biking:
//骑行路线
routePlanSearch.bikingSearch(new BikingRoutePlanOption().from(fromPlanNode).to(toPlanNode));
break;
case R.id.tv_choose_car:
//驾车路线
routePlanSearch.drivingSearch(new DrivingRoutePlanOption().from(fromPlanNode).to(toPlanNode));
break;
case R.id.tv_choose_bus:
//换乘公共交通工具的路线
routePlanSearch.transitSearch(new TransitRoutePlanOption().city(edCity.getText().toString()).from(fromPlanNode).to(toPlanNode));
break;
case R.id.tv_choose_walk:
//步行路线
routePlanSearch.walkingSearch(new WalkingRoutePlanOption().from(fromPlanNode).to(toPlanNode));
break;
}
}

public void init() {

//路径规划搜索接口
routePlanSearch = RoutePlanSearch.newInstance();
routePlanSearch.setOnGetRoutePlanResultListener(this);

//骑行覆盖物添加并监听
bikingOverlay = new BikingRouteOverlay(mBaiduMap);
//驾车覆盖物添加并监听
drivingOverlay = new DrivingRouteOverlay(mBaiduMap);
//换乘覆盖物添加并监听
transOverlay = new TransitRouteOverlay(mBaiduMap);
//步行覆盖物添加并监听
walkingOverlay = new WalkingRouteOverlay(mBaiduMap);
//TODO: 添加各种路线覆盖物的点击事件
mBaiduMap.setOnMarkerClickListener(bikingOverlay);
mBaiduMap.setOnMarkerClickListener(drivingOverlay);
mBaiduMap.setOnMarkerClickListener(transOverlay);
mBaiduMap.setOnMarkerClickListener(walkingOverlay);
}

/**
* 以下四个方法是路线规划搜索监听后的回调
* a.步行回调
*
* @param walkingRouteResult
*/

@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
if (walkingRouteResult == null || walkingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
showToast( "抱歉,未找到结果");
return;
}
showToast( "步行线路条数:" + walkingRouteResult.getRouteLines().size());
List<WalkingRouteLine> routeLines = walkingRouteResult.getRouteLines();
mBaiduMap.clear();
walkingOverlay.removeFromMap();
walkingOverlay.setData(routeLines.get(0));
walkingOverlay.addToMap();
walkingOverlay.zoomToSpan();
}

/**
* b.换乘路线结果回调
*
* @param transitRouteResult
*/

@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
if (transitRouteResult == null || transitRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
showToast("抱歉,未找到结果" );
return;
}
showToast( "公交线路条数:" + transitRouteResult.getRouteLines().size());
List<TransitRouteLine> routeLines = transitRouteResult.getRouteLines();
mBaiduMap.clear();
transOverlay.removeFromMap();
transOverlay.setData(routeLines.get(0));
transOverlay.addToMap();
transOverlay.zoomToSpan();
}

@Override
public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {

}

/**
* c.驾车路线结果回调
*
* @param drivingRouteResult
*/

@Override
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
if (drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
showToast( "抱歉,未找到结果" );
return;
}
showToast( "驾车线路条数:" + drivingRouteResult.getRouteLines().size());
List<DrivingRouteLine> routeLines = drivingRouteResult.getRouteLines();
mBaiduMap.clear();
drivingOverlay.removeFromMap();
drivingOverlay.setData(routeLines.get(0));
drivingOverlay.addToMap();
drivingOverlay.zoomToSpan();
}

@Override
public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {

}

/**
* d.骑行路线结果回调
*
* @param bikingRouteResult
*/

@Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
if (bikingRouteResult == null || bikingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
showToast( "抱歉,未找到结果");
return;
}
showToast( "骑行线路条数:" + bikingRouteResult.getRouteLines().size());
List<BikingRouteLine> routeLines = bikingRouteResult.getRouteLines();
mBaiduMap.clear();
bikingOverlay.removeFromMap();
bikingOverlay.setData(routeLines.get(0));
bikingOverlay.addToMap();
bikingOverlay.zoomToSpan();
}

private void showToast(String str){
Toast.makeText(ActRoutePlanMap.this,str,Toast.LENGTH_SHORT).show();
}

@Override
public void onBackPressed() {
super.onBackPressed();
if (!isFinishing()) {
finish();
}
}

@Override
protected void onDestroy() {
super.onDestroy();
// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mapView.onDestroy();
routePlanSearch.destroy();
}

@Override
protected void onResume() {
super.onResume();
// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mapView.onResume();
}

@Override
protected void onPause() {
super.onPause();
// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mapView.onPause();
}

}


5.标记地址、画区域、更新标记图、自定义弹出框

1.布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="#FFFFFF"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ScrollView
android:layout_width="match_parent"
android:layout_height="100dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_margin="10dp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_custom_map"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="19sp"
android:text="普通地图"/>
<TextView
android:id="@+id/tv_satellite_map"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="19sp"
android:text="卫星地图"/>
<TextView
android:id="@+id/tv_blank_map"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="19sp"
android:text="空白地图"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_margin="10dp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_traffic_map"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="19sp"
android:text="开启交通图"/>
<TextView
android:id="@+id/tv_thermal_map"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="19sp"
android:text="开启热力图"/>
</LinearLayout>

</LinearLayout>
</ScrollView>

<com.baidu.mapapi.map.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />

</LinearLayout>


2.activity代码:

/**
* 1.显示地图(普通、卫星、空白、交通图、热力图)
* 2.标记指定的位置点、不断更新标记图标
* 3.在指定的位置点显示自定义文字
* 4.点击指定的位置点的标记图标,显示自定义弹出框
* 5.指定半径、中心点画出区域圆形图
* 6.显示指南针
* 7.设置地图级别、中心点
*/

public class ActCommonMap extends AppCompatActivity {

@BindView(R.id.map_view)
MapView mapView;
@BindView(R.id.tv_custom_map)
TextView tvCustomMap;
@BindView(R.id.tv_satellite_map)
TextView tvSatelliteMap;
@BindView(R.id.tv_blank_map)
TextView tvBlankMap;
@BindView(R.id.tv_traffic_map)
TextView tvTrafficMap;
@BindView(R.id.tv_thermal_map)
TextView tvThermalMap;

private BaiduMap mBaiduMap;
//要显示的pop
private View pop;
//pop中的文本信息
private TextView popWindowTitle;

private boolean isTrafficMap = false;
private boolean isThermalMap = false;
private boolean isInfoWindow = false;
private double coordinateX = 22.5422870000;
private double coordinateY = 113.9804440000;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());

setContentView(R.layout.activity_act_commonmap);
ButterKnife.bind(this);

initView();
}

@OnClick({R.id.tv_custom_map, R.id.tv_satellite_map, R.id.tv_blank_map, R.id.tv_traffic_map, R.id.tv_thermal_map})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.tv_custom_map:
//普通地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
break;
case R.id.tv_satellite_map:
//卫星地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
break;
case R.id.tv_blank_map:
//空白地图, 基础地图瓦片将不会被渲染。在地图类型中设置为NONE,
// 将不会使用流量下载基础地图瓦片图层。使用场景:与瓦片图层一起使用,
// 节省流量,提升自定义瓦片图下载速度。
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
break;
case R.id.tv_traffic_map:
if (isTrafficMap == false) {
//开启交通图
mBaiduMap.setTrafficEnabled(true);
tvTrafficMap.setText("关闭交通图");
isTrafficMap = true;
} else {
//开启交通图
mBaiduMap.setTrafficEnabled(false);
tvTrafficMap.setText("开启交通图");
isTrafficMap = false;
}
break;
case R.id.tv_thermal_map:
if (isThermalMap == false) {
//城市热力图
mBaiduMap.setBaiduHeatMapEnabled(true);
tvThermalMap.setText("关闭热力图");
isThermalMap = true;
} else {
//开启交通图
mBaiduMap.setBaiduHeatMapEnabled(false);
tvThermalMap.setText("开启热力图");
isThermalMap = false;
}
break;
}
}

/**
* 设置地图属性等等
*/
private void initView(){
mBaiduMap = mapView.getMap();

//设置地图级别为18
initMap(18);

//设置地图中心点
initLocation(coordinateX, coordinateY);

//显示指南针
mBaiduMap.getUiSettings().setCompassEnabled(true);

//        //绘制区域圆形
//        drawCircle();

//        //显示自定义文字
//        drawText();

//显示标记图标
drawMark(coordinateX, coordinateY);

//初始化popwindow,通过点击mark来控制它的显示
initPop();

//mark的点击事件
// 点击某一个mark在他上放显示泡泡
// 加载pop 添加到mapview 把他设置为隐藏 当点击的时候更新pop的位置 设置为显示
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker result) {
showPop(result);
return true;
}
});

//隐藏pop
pop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
pop.setVisibility(View.INVISIBLE);
}
});

//        //不断切换mark图标(显示多个图片的来回切换,类似于帧动画)
//        drawMarks();
}

/**
* 不断更新Mark图标
* 显示多个图片的来回切换,类似于帧动画
* 拿上面那个方法直接改的设置icon
* 绘制mark覆盖物
*/
private void drawMarks() {
MarkerOptions markerOptions = new MarkerOptions();
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_map_mark); // 描述图片
ArrayList<BitmapDescriptor> bitmaps = new ArrayList<BitmapDescriptor>();
bitmaps.add(bitmap);  //显示多个图片的来回切换,类似于帧动画
bitmaps.add(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher_round));
markerOptions.position(new LatLng(22.5422870000, 113.9804440000)) // 设置位置
//.icon(bitmap) // 加载图片
//切换图片
.icons(bitmaps)
.period(10) //切换时间
.draggable(true) // 支持拖拽
.title("世界之窗旁边的草房"); // 显示文本
mBaiduMap.addOverlay(markerOptions);
}

/**
* 初始化pop
*/
private void initPop() {
pop = View.inflate(getApplicationContext(), R.layout.map_pop_window, null);
//必须使用百度的params
ViewGroup.LayoutParams params = new MapViewLayoutParams.Builder().layoutMode(MapViewLayoutParams.ELayoutMode.mapMode) //按照经纬度设置
.position(new LatLng(coordinateX, coordinateY)) //这个坐标无所谓的,但是不能传null
.width(MapViewLayoutParams.WRAP_CONTENT)  //宽度
.height(MapViewLayoutParams.WRAP_CONTENT)  //高度
.build();
mapView.addView(pop, params);
//先设置隐藏,点击的时候显示
pop.setVisibility(View.INVISIBLE);
popWindowTitle = (TextView) pop.findViewById(R.id.popWindowTitle);
}

/**
* 显示加载pop
*/
private void showPop( Marker result){
if( !isInfoWindow){
//处理点击 ,当点击的时候更新并且显示位置
ViewGroup.LayoutParams params = new MapViewLayoutParams.Builder().
layoutMode(MapViewLayoutParams.ELayoutMode.mapMode) //按照经纬度设置位置
.position(result.getPosition()) //这个坐标无所谓的,但是不能传null
.width(MapViewLayoutParams.WRAP_CONTENT)  //宽度
.height(MapViewLayoutParams.WRAP_CONTENT)  //高度
.yOffset(-5)  //相距  正值往下  负值往上
.build();
mapView.updateViewLayout(pop, params);
//更新下title
String title = result.getTitle();
popWindowTitle.setText(title);
pop.setVisibility(View.VISIBLE);
}else{
pop.setVisibility(View.INVISIBLE);
}
}

/**
* 绘制mark覆盖物
*/
private void drawMark(double varX, double varY) {
MarkerOptions markerOptions = new MarkerOptions();
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_map_mark); // 描述图片
markerOptions.position(new LatLng(varX, varY)) // 设置位置
.icon(bitmap) // 加载图片
.draggable(true) // 支持拖拽
.title("世界之窗旁边的草房"); // 显示文本
//把绘制的圆添加到百度地图上去
mBaiduMap.addOverlay(markerOptions);
}

/**
* 绘制文字
*/
private void drawText() {
TextOptions textOptions = new TextOptions();
textOptions.fontColor(Color.RED) //设置字体颜色
.text("自定义文字覆盖物")  //设置显示文本
.position(new LatLng(22.5422870000, 113.9804440000))   //设置显示坐标
.fontSize(20) //设置文本大小
.typeface(Typeface.SERIF)  //设置字体 Android的字体就三种,对称的,不对称的,等宽的
.rotate(30);  //设置旋转角度
//把绘制的圆添加到百度地图上去
mBaiduMap.addOverlay(textOptions);
}

/**
* 绘制圆
*/
private void drawCircle() {
// 1.创建自己
CircleOptions circleOptions = new CircleOptions();
// 2.设置数据 以世界之窗为圆心,1000米为半径绘制
circleOptions.center(new LatLng(22.5422870000, 113.9804440000))//中心
.radius(1000)  //半径
.fillColor(0x60FF0000)//填充圆的颜色
.stroke(new Stroke(10, 0x600FF000));  //边框的宽度和颜色
//把绘制的圆添加到百度地图上去
mBaiduMap.addOverlay(circleOptions);
}

/**
* 设置地图级别为18
*
* @param grade
*/
private void initMap(int grade) {
//描述地图将要发生的变化,使用工厂类MapStatusUpdateFactory创建,
//设置级别为18,进去就是18了,默认是12
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.zoomTo(grade);
mBaiduMap.setMapStatus(mapStatusUpdate);
//是否显示缩放按钮
//mMapView.showZoomControls(false);
}

/**
* 设置一开始中心点的经纬度坐标
*
* @param varX
* @param varY
*/
private void initLocation(double varX, double varY) {
//经纬度(纬度,经度)
LatLng latlng = new LatLng(varX, varY);
MapStatusUpdate mapStatusUpdate_circle = MapStatusUpdateFactory.newLatLng(latlng);
mBaiduMap.setMapStatus(mapStatusUpdate_circle);
}

@Override
public void onBackPressed() {
super.onBackPressed();
if (!isFinishing()) {
finish();
}
}

@Override
protected void onDestroy() {
super.onDestroy();
// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mapView.onDestroy();
}

@Override
protected void onResume() {
super.onResume();
// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mapView.onResume();
}

@Override
protected void onPause() {
super.onPause();
// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mapView.onPause();
}

}


补充:

配置文件里需要添加:

1..在application外添加权限:

<!-- 百度地图需要的权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>


2.在application里添加你在百度地图为应用申请的key:

<!-- 百度地图key -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="xxxxxxxxxxx" />


3.写定位功能时,需在application里添加:

<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote">
</service>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: