百度LBS开放平台Android SDK产品使用
使用百度地图需要
baidumapapi_v3_1_1.jar、locSDK_3.1.jar两个jar
libBaiduMapSDK_v3_1_1.so、liblocSDK3.so
权限:到百度LBS开放平台去申请key
1、百度地图基本用法
SDKInitializer.initialize(this.getApplication());
判断Intene是否有参数
Intent intent = getIntent();
if (intent.hasExtra("x") && intent.hasExtra("y")) {
// 当用intent参数时,设置中心点为指定点
Bundle b = intent.getExtras();
//设置中心点坐标
LatLng p = new LatLng(b.getDouble("y"), b.getDouble("x"));
mapView = new MapView(this,new BaiduMapOptions().mapStatus(new MapStatus.Builder().target(p).build()));
} else {
mapView = new MapView(this, new BaiduMapOptions());
}
setContentView(mapView);
baiduMap = mapView.getMap();
2、基于MapFragment的基本地图
继承FragmentActivity
//设置地图的状态
.overlook();地图俯仰角
.zoom();地图缩放级别
LatLng cenpt = new LatLng(29.806651,121.606983);设置经纬度
.target(cenpt)设定坐标
MapStatus ms = new MapStatus.Builder().overlook(-20).zoom(100).build();
.compassEnabled();设置是否允许指南针 默认允许
.zoomControlsEnabled();是否显示缩放控件
BaiduMapOptions bo = new BaiduMapOptions().mapStatus(ms).compassEnabled(false).zoomControlsEnabled(false);
map = SupportMapFragment.newInstance(bo);
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().add(R.id.map, map, "map_fragment").commit();
3、多地图展示
第一步:在xml中设置多个展示框
第二步:设置中心点坐标GEO_BEIJING
第三步:创建地图
MapStatusUpdate u1 = MapStatusUpdateFactory.newLatLng(GEO_BEIJING);
SupportMapFragment map1 = (SupportMapFragment) (getSupportFragmentManager().findFragmentById(R.id.map1));
map1.getBaiduMap().setMapStatus(u1);
地图图层显示控制
//普通图层: baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//卫星图层:baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//交通图层:baiduMap.setTrafficEnabled(((CheckBox) v).isChecked());
//地图的操作功能[截图、缩放、旋转、视角控制、点击某个位置获取经纬度]
zoom缩放大小 rotate旋转角度 overlook俯视角度
-----------------------------------------------------------------------------------------------
处理地图缩放 缩放级别[3.0--19.0]
float zoomLevel = Float.parseFloat(t.getText().toString());//得到缩放的值
//定义MapStatusUpdate对象,以便描述地图状态将要发生的变
MapStatusUpdate u = MapStatusUpdateFactory.zoomTo(zoomLevel);//设置缩放到MapStatusUpdate对象中
mBaiduMap.animateMapStatus(u);
//更新地图到显示面板
MapStatus ms = mBaiduMap.getMapStatus();
-------------------------------------------------------------------------------------------------
处理地图旋转
int rotateAngle = Integer.parseInt(t.getText().toString());//得到角度
MapStatus ms = new MapStatus.Builder(mBaiduMap.getMapStatus()).rotate(rotateAngle).build();
MapStatusUpdate u = MapStatusUpdateFactory.newMapStatus(ms);
mBaiduMap.animateMapStatus(u);
//更新地图到显示面板
MapStatus ms = mBaiduMap.getMapStatus();
---------------------------------------------------------------------------------------------
处理地图的俯视
int overlookAngle = Integer.parseInt(t.getText().toString());
MapStatus ms = new MapStatus.Builder(mBaiduMap.getMapStatus()).overlook(overlookAngle).build();
MapStatusUpdate u = MapStatusUpdateFactory.newMapStatus(ms);
mBaiduMap.animateMapStatus(u);
//更新地图到显示面板
MapStatus ms = mBaiduMap.getMapStatus();
---------------------------------------------------------------------------------------------
处理截图[在SnapshotReadyCallback中保存图片到 sd 卡]
mBaiduMap.snapshot
(
new SnapshotReadyCallback(){
public void onSnapshotReady(Bitmap snapshot){
File file = new File("/mnt/sdcard/test.png");
FileOutputStream out;
try {
out = new FileOutputStream(file);
if (snapshot.compress(Bitmap.CompressFormat.PNG, 100, out)) {
out.flush();
out.close();
}
Toast.makeText(MapControlDemo.this,"屏幕截图成功,图片存在: " + file.toString(),Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
);
-------------------------------------------------------------------------------------------------
单击、长按、双击 获得当前的经纬度
单击
mBaiduMap.setOnMapClickListener(
new OnMapClickListener(){
public void onMapClick(LatLng point){
经度point.longitude 纬度 point.latitude
}
public boolean onMapPoiClick(MapPoi poi){return false;}
}
);
双击:mBaiduMap.setOnMapDoubleClickListener(new OnMapDoubleClickListener());
长按:mBaiduMap.setOnMapLongClickListener(new OnMapLongClickListener() {});
-----------------------------------------------------------------------------------------
UI控制功能[UiSettings]
UiSettings ui=new UiSettings();
void setAllGesturesEnabled(boolean enabled)//设置是否允许所有手势操作
void setCompassEnabled(boolean enabled)//设置是否允许指南针
void setOverlookingGesturesEnabled(boolean enabled)//设置是否允许俯视手势
void setRotateGesturesEnabled(boolean enabled)//设置是否允许旋转手势
void setScrollGesturesEnabled(boolean enabled)//设置是否允许拖拽手势
void setZoomGesturesEnabled(boolean enabled)//设置是否允许缩放手势
-------------------------------------------------------------------------------------
Android百度地图--定位SDK[版本V3.1]
[相关网址][http://wenku.baidu.com/link?url=DHmlQ-L3dNoKIxVYv2sLL_esD-pKJcQMTZCNKh6NcQEbKKTZKDfR3miw21lLUkpb2VbHUd3yCmUxSYzJ82eZZ8paBW2p3wz676rBKAUkK47]
1、定位的jar
2、在配置中声明service组件
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
3、权限
........
4、构建LocationClient 类的对象,设定定位参数,注册实现BDLocationListener接口的类的对象监听器
[1]、
LocationClient mLocationClient=new LocationClient(this);
BDLocationListener mBDLocationListener=new BDLocationListener();
mLocationClient.registerLocationListener(mBDLocationListener);
LocationClientOption option = new LocationClientOption();
// 设置是否返回POI的电话和地址等详细信息。默认值为false,即不返回POI的电话和地址信息。
option.setAddrType("all");
// 设置是否返回POI的电话和地址等详细信息。默认值为false,即不返回POI的电话和地址信息。
option.setPoiExtraInfo(true);
// 设置产品线名称。强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务
option.setProdName("定位我当前的位置");
//打开GPS 前提用户硬件打开gps 默认不打开
option.setOpenGps(false);
//定位的时间间隔单位(ms)
option.setScanSpan(1000);
//查询范围 当前定位中心半径大小
option.setPoiDistance(500)
//禁用启用缓存定位数据
option.disableCache(true);
坐标系类型,百度手机地图对外接口中的坐标系默认是bd09ll
option.setCoorType("bd09ll");
设置最多可返回的POI个数,默认值为3。由于POI查询比较耗费流量,设置最多返回的POI个数,以便节省流量
option.setPoiNumber(3);
设置定位方式的优先级
//即使有GPS,而且可用,也仍旧会发起网络请求。这个选项适合对精确坐标不是特别敏感、是希望得到位置描述的用户
option.setPriority(LocationClientOption.NetWorkFirst);网络优先
mLocClient.setLocOption(option);
mLocClient.start();//发起定位请求
mLocationClient.requestLocation();//发起重新定位
mLocationClient.requestLocation();//发起查询请求
编写BDLocationListener接口的实现类,接收异步返回的定位结果和异步返回的POI查询结果
int type=location.getLocType();//当前定位采用的类型
String coorType=location.getCoorType();//坐标系类型
location.hasRadius是否有定位精度半径
float accuracy=location.getRadius();定位精度半径 [单位:米]
if(location.hasAddr){在使用网络定位的情况下获得当前位置的反地理编码String address=location.getAddrStr();}
String province=location.getProvince();获取省份信息 getCity();获取城市信息getDistrict();获取区县信息
double latitude=location.getLatitude();//获取纬度信息getLongitude();获取经度信息
定位结束后停止服务
mLocationClient.unRegisterLocationListener(mBDLocationListener);
mLocationClient.stop();
mLocationClient=null;
百度地图自定义绘制功能
绘制文字
绘制文字坐标 背景 字体大小 字体颜色 角度 等
坐标:LatLng llText=new LatLng(纬度,经度);
添加属性OverlayOptions ooText=new TextOptions().bgColor(背景).fontSize(字体大小).fontColor(字体颜色).text(文字).rotate(角度).position(位置);
mBaiduMap.addOverlay(ooText);//添加到地图上
绘制多边形
使用LatLng绘制多边形的坐标 添加到List集合中
使用OverlayOptions ooPolygon = new PolygonOptions();添加属性
.points()添加坐标的集合.fillColor(0xAAFFFF00)填充颜色 默认黑色
.stroke(new Stroke(5, 0xAA00FF00))绘制多边形的线及颜色
mBaiduMap.addOverlay(ooPolygon);//添加到地图上
绘制一个点
使用LatLng绘制点的坐标
OverlayOptions ooDot = new DotOptions()添加属性
.center(中心).radius(点的大小).color(背景颜色);
mBaiduMap.addOverlay(ooDot);
绘制圆
OverlayOptions ooCircle = new CircleOptions().fillColor(0x000000FF).center(llCircle).stroke(new Stroke(5, 0xAA000000)).radius(1400);
绘制弧线
OverlayOptions ooArc = new ArcOptions().color(0xAA00FF00).width(4).points(p1, p2, p3);
绘制折线
OverlayOptions ooPolyline = new PolylineOptions().width(10).color(0xAAFF0000).points(points);
百度地图覆盖物用法[响应点击功能和弹出pop功能]
1、初始化bitmap信息,用来定义图标、不用时调用recycle();方法回收资源。
BitmapDescriptor bdA = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
2、清除所有的图标mBaiduMap.clear();
3、OverlayOptions ooA=new MarkerOptions().position(位置[LatLng]).icon(图标[bdA]).perspective(true|false[是否透视]).anchor(0.5f,0.5f).rotate(角度).zIndex().draggable(true[是否可以拖拽]);
mMarkerA=(Marker) (mBaiduMap.addOverlay(ooA));
4、mBaiduMap.setOnMarkerClickListener();点击标记触发事件
5、自定义Button button=new Button(this); 设置Button的样式button.setBackgroundResource(R.drawable.popup);
百度地图poi搜索功能[可以是一栋房子、商铺、邮筒、公交站等]
1、继承FragmentActivity 实现OnGetPoiSearchResultListener和OnGetSuggestionResultListener的接口
2、定义:
搜索模块
PoiSearch poiSearch=PoiSearch.newInstance(); poiSearch.setOnGetPoiSearchResultListener(this);
SuggestionSearch suggestionSearch=SuggestionSearch.newInstance();suggestionSearch.setOnGetPoiSearchResultListener(this);
3、得到地图
使用fragment控件得到要显示图形的界面
<fragment android:id="@+id/map" 定义图形的长宽 class="com.baidu.mapapi.map.SupportMapFragment"/>
baiduMap=((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getBaiduMap();
4、在点击的搜索事件中开始查询
poiSearch.searchInCity((new PoiCitySearchOption()).city("城市").keyword("搜索位置").pageNum(当前页数[从0开始]));
5、在onGetPoiResult(PoiResult result)得到返回结果方法中显示
if(result==null||result.error==SearchResult.ERRORNO.RESULT_NOT_FOUND){返回result为空、或者错误return;}
if(result.error == SearchResult.ERRORNO.NO_ERROR){//返回没有错误 在地图上显示
baiduMap.clear();
PoiOverlay overlay = new MyPoiOverlay(baiduMap);
baiduMap.setOnMarkerClickListener(overlay);
overlay.setData(result);
overlay.addToMap();
overlay.zoomToSpan();
return;
}
if(result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD){本市没有找到在其他省市找到
result.getSuggestCityList()方法返回CityInfo吧查到的市找出来
}
public MyPoiOverlay(BaiduMap baiduMap) {super(baiduMap);}
@Override
public boolean onPoiClick(int index) {super.onPoiClick(index);
PoiInfo poi = getPoiResult().getAllPoi().get(index);
poiSearch.searchPoiDetail((new PoiDetailSearchOption()).poiUid(poi.uid));return true;
}
地理编码搜索[地址检索坐标][坐标检索地址]
实现OnGetGeoCoderResultListener接口和onGetGeoCodeResult[地址返回经纬度]onGetReverseGeoCodeResult[经纬度返回地址]
1、定义 GeoCoder mSearch = null; // 搜索模块
BaiduMap mBaiduMap = null 和 MapView mMapView = null;
//得到控件显示地图
2、mMapView = (MapView) findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
3、初始化搜索模块,注册监听事件
mSearch = GeoCoder.newInstance();
mSearch.setOnGetGeoCodeResultListener(this);
4、发起搜索[坐标搜索地址]
得到坐标封装成LatLng类型的坐标 LatLng ptCenter = new LatLng(纬度,经度);
mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(ptCenter));
if(result==null||result.error!=SearchResult.ERRORNO.NO_ERROR){return;}搜索有误
else{
mBaiduMap.clear();
mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation()).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_marka)));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result.getLocation()));
Toast.makeText(GeoCoderDemo.this, result.getAddress(),1).show();
}
发起搜索[地址搜索坐标]
mSearch.geocode(new GeoCodeOption().city("城市").address("具体位置"));
if(result==null||result.error!= SearchResult.ERRORNO.NO_ERROR){return;}返回错误
mBaiduMap.clear();
mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation()).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_marka)));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result.getLocation()));
String strInfo = String.format("纬度:%f 经度:%f",result.getLocation().latitude, result.getLocation().longitude);
Toast.makeText(GeoCoderDemo.this, strInfo, Toast.LENGTH_LONG).show();