百度地图3.0开发(首先去申请应用程序的key)
------------key教验------------
1,自定义广播
public class SDKReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String s = intent.getAction();
TextView text = (TextView) findViewById(R.id.text_Info);
text.setTextColor(Color.RED);
if (s.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
text.setText("key 验证出错! 请在 AndroidManifest.xml 文件中检查 key 设置");
} else if (s
.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
text.setText("网络出错");
}
}
}
2,注册广播
// 注册 SDK 广播监听者
IntentFilter iFilter = new IntentFilter();
iFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
iFilter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
SDKReceiver mReceiver = new SDKReceiver();
registerReceiver(mReceiver, iFilter);// 注册
------------设置地图中心点------------
LatLng p = new LatLng(22.547619, 114.109202);//中心点纬度和经度
mMapView = new MapView(this, new BaiduMapOptions().mapStatus(new MapStatus.Builder()
.target(p).build()));
其中BaiduMapOptions:设置地图是否可以拖拽手势,旋转,指南针,地图状态(默认为天安门)等
MapStatus:地图状态(控制中心点,缩放级别,旋转角度,俯仰角度)
MapStatus status =new MapStatus.Builder()
.target(p)//中心点
.overlook(120)//俯仰角度
.rotate(6.0f)//缩放大小
.build();
------------地图事件的监听------------
1,首先通过mapView.getMap()获取到BaiduMap(定义了地图对象的操作方法与接,地图状态和事件的监听都是通过它完成的)对象
2,通过BaiduMap的setOnXXX方法绑定各类事件;
BaiduMap还可以设置地图的模式(普通地图,卫星地图)
------------标注覆盖物------------
LatLng point = new LatLng(39.963175, 116.400244); //定义Maker坐标点
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka); //构建Marker图标
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(point)
.icon(bitmap)
.title("B");
mBaiduMap.addOverlay(option);//在地图上添加Marker,并显示
覆盖物分类:
ArcOptions,弧线
CircleOptions,圆
DotOptions,点
GroundOverlayOptions,
MarkerOptions,带图标标记
PolygonOptions,多边形覆盖物
PolylineOptions,折线覆盖物
TextOptions文字
点击的时候弹出覆盖物:
//创建InfoWindow展示的view
Button button = new Button(getApplicationContext());
button.setBackgroundResource(R.drawable.popup);
//定义用于显示该InfoWindow的坐标点
LatLng pt = new LatLng(39.86923, 116.397428);
//创建InfoWindow , 传入 view, 地理坐标, y 轴偏移量
InfoWindow mInfoWindow = new InfoWindow(button, pt, -47);
//显示InfoWindow
mBaiduMap.showInfoWindow(mInfoWindow);
--------------------------------------------------------------------------------
------------百度地图计算距离------------
double distance =DistanceUtil.getDistance(point2, point);
------------百度地图定位功能实现--------------------
1,实现BDLocationListener定位接口
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {//定位请求回调函数
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null)
return;
MyLocationData locData = new MyLocationData.Builder() //MyLocationData 定位数据
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100)//定位数据的方向信息
.latitude(location.getLatitude())//定位数据的纬度
.longitude(location.getLongitude())/定位数据的经度
.build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(u);
Log.d(TAG, location.getLatitude()+":"+location.getLongitude());
}
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
2,定位初始化及定位条件
mBaiduMap.setMyLocationEnabled(true);// 开启定位
// 定位初始化
mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(new MyLocationListenner ());//监听位置
LocationClientOption option = new LocationClientOption();//设置定位条件
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
mLocClient.setLocOption(option);
mLocClient.start();
------------离线地图------------
对于官方开发指南对于离线地图的教程,提供了两种方案:
第一,手动导入,先将从官网下载的离线包解压,把vmp文件夹拷入SD卡根目录下的BaiduMapSDK文件夹内。
第二,接口下载方法如下:mOffline.start(cityid);还比较靠谱,就是没详细介绍。
MKOfflineMap mOffline = new MKOfflineMap();//提供供地图的下载,离线地图列表的获取,已下载地图的查询等
mOffline.init(new MKOfflineMapListener() {//
@Override
public void onGetOfflineMapState(int type, int state) {
switch (type) {
case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: {
MKOLUpdateElement update = mOffline.getUpdateInfo(state);
// 处理下载进度更新提示
if (update != null) {
stateView.setText(String.format("%s : %d%%", update.cityName,
update.ratio));
updateView();
}
}
break;
case MKOfflineMap.TYPE_NEW_OFFLINE:
// 有新离线地图安装
Log.d("OfflineDemo", String.format("add offlinemap num:%d", state));
break;
case MKOfflineMap.TYPE_VER_UPDATE:
// 版本更新提示
// MKOLUpdateElement e = mOffline.getUpdateInfo(state);
break;
}
}
});
mOffline.start(cityid);//开始下载
mOffline.pause(cityid);//暂停下载
MKOfflineMap中其他常用方法(详情参见官方api及demo):
java.util.ArrayList<MKOLUpdateElement> getAllUpdateInfo() 返回各城市离线地图更新信息
java.util.ArrayList<MKOLSearchRecord> getHotCityList() 返回热门城市列表
java.util.ArrayList<MKOLSearchRecord> getOfflineCityList() 返回支持离线地图城市列表
MKOLUpdateElement getUpdateInfo(int cityID) 返回指定城市ID离线地图更新信息
java.util.ArrayList<MKOLSearchRecord> searchCity(java.lang.String cityName) 根据城市名搜索该城市离线地图记录
boolean init(MKOfflineMapListener listener) 初使化
boolean pause(int cityID) 暂停下载指定城市ID的离线地图
boolean remove(int cityID) 删除指定城市ID的离线地图
boolean start(int cityID) 启动下载指定城市ID的离线地图
void destroy() 销毁离线地图管理模块,不用时调用
------------公交线路查询------------
PoiSearch mSearch = PoiSearch.newInstance();//检索接口
mSearch.searchInCity((new PoiCitySearchOption()).city("深圳").keyword("223"));//检索城市,公交路线
mSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(BusLineSearchDemo.this, "抱歉,未找到结果",
Toast.LENGTH_LONG).show();
return;
}
// 遍历所有poi,找到类型为公交线路的poi
for (PoiInfo poi : result.getAllPoi()) {
if (poi.type == PoiInfo.POITYPE.BUS_LINE
|| poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
}
}
}
@Override
public void onGetPoiDetailResult(PoiDetailResult result){//查询结果回调
}
});
BusLineSearch mBusLineSearch = BusLineSearch.newInstance();//该接口用于查询整条公交线路信息,公交换乘路线查询请参看 RoutePlanSearch
mBusLineSearch.searchBusLine((new BusLineSearchOption()
.city("深圳")//城市
.uid("101")));//公交线路id
mBusLineSearch.setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() {
@Override
public void onGetBusLineResult(BusLineResult result) {//公共交通信息查询结果(包括站点信息,发车时间等信息)
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(BusLineSearchDemo.this, "抱歉,未找到结果",
Toast.LENGTH_LONG).show();
return;
}
.......
}
});
---------------------地图导航----------------------
1, 通过手机客户端导航:
LatLng pt1 = new LatLng(x1, y1);
LatLng pt2 = new LatLng(x2,y2);
// 构建 导航参数
NaviPara para = new NaviPara();
para.startPoint = pt1;
para.startName = "从这里开始";
para.endPoint = pt2;
para.endName = "到这里结束";
try {
BaiduMapNavigation.openBaiduMapNavi(para, this);
} catch (BaiduMapAppNotSupportNaviException e) {
e.printStackTrace();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("您尚未安装百度地图app或app版本过低,点击确认安装?");
builder.setTitle("提示");
builder.setPositiveButton("确认", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
BaiduMapNavigation.getLatestBaiduMapApp(NaviDemo.this);
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
2, 通过Web端导航:
LatLng pt1 = new LatLng(x1, y1);
LatLng pt2 = new LatLng(x2,y2);
// 构建 导航参数
NaviPara para = new NaviPara();
para.startPoint = pt1;
para.endPoint = pt2;
BaiduMapNavigation.openWebBaiduMapNavi(para, this);
---------------------地理坐标与地理位置之间相互转换---------------------
GeoCoder:地理编码查询接口(坐标与位置之间相互转换)
GeoCoder mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {//转换监听接口
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {//地理编码回调,转换后的地址
}
@Override
public void onGetGeoCodeResult(GeoCodeResult result) {//地理编码查询结果回调函数,GeoCodeResult转换后的经纬度信息
}
});
mSearch.reverseGeoCode(new ReverseGeoCodeOption()//发起反地理编码请求(经纬度->地址信息)
.location(point));// 要转换的地理坐标
mSearch.geocode(new GeoCodeOption()//发起地理编码(地址信息->经纬度)请求
.city("深圳")
.address("具体要查找的地址信息"));