您的位置:首页 > 移动开发 > Android开发

百度地图开发总结

2015-11-03 20:32 585 查看
1. 怎么接入百度SDK,百度文档说得很明白,我就不说了。
2. 注意
1)初始化的时候,上下文用全局的,即ApplicationContext。
2)要在Activity的相应生命周期方法里调用MapView对应的生命周期方法。
3. 百度地图的核心类:
1)SDKInitializer 百度地图初始化类
》》注册网络错误、key验证错误的广播
这样一样百度地图崩溃了,或者出异常了,就知道有没有可能是这一块出现了问题。
private void initSDK() {
SDKInitializer.initialize(getApplicationContext());
//注册网络错误和KEY验证失败的广播
IntentFilter filter = new IntentFilter();
filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
registerReceiver(new MyReceiver(), filter);
}

class MyReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)){
Toast.makeText(getApplicationContext(), "网络错误", 0).show();
}else if(action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)){
Toast.makeText(getApplicationContext(), "key验证失败", 0).show();
}
}
}
2)MapView 显示百度地图的组件
》》设置绽放按钮显示与隐藏
mMapView.showZoomControls(false);
》》设置比例尺显示与隐藏
mMapView.showScaleControl(false);
》》替换百度地图logo
将"baidumapapi_v3_3_0.jar"复制到桌面,然后解压,将assets目录下的logo_h,logo_l
用自己的图片替换掉。然后再将jar包拷贝回去。

可以做addView操作,而BaiduMap是addOverlay()添加覆盖物。

3)BaiduMap 控制器 通过MapView.getMap()获取
》》设置地图的状态 map.setMapStatus(MapStatusUpdate)
通过MapStatusUpdateFactory.方法()可以得到参数

//设置地图的绽放级别
MapStatusUpdate zoom = MapStatusUpdateFactory.zoomTo(18);
map.setMapStatus(zoom);


//设置中心点,注意LatLng的构造函数latitude,longtitude,分别为纬度、经度,在百度地
图上查的坐标与这个正好相反的。
map.setMapStatus(MapStatusUpdateFactory.newLatLng(
new LatLng(40.050513,116.30361)));
Android百度地图默认位置中心点设置
http://blog.csdn.net/xyy410874116/article/details/32094157

//旋转百度地图(以中心点)

//得到地图之前的状态和角度
MapStatus mapStatus = map.getMapStatus();
float preRotate = mapStatus.rotate;
//利用MapStatus.Builder静态内部类来构造新的状态,对之前状态的角度累加一个
值。
Builder builder = new MapStatus.Builder();
MapStatus newStatus = builder.rotate(preRotate + 30).build();
//将新的状态设置给百度地图
map.setMapStatus(MapStatusUpdateFactory.newMapStatus(newStatus));
//翻转百度地图(以直线),改变俯角,也就是看百度地图的角度。

MapStatus mapStatus2 = map.getMapStatus();
float preOverlook = mapStatus2.overlook;
Builder builder2 = new MapStatus.Builder();
MapStatus newStatus2 = builder2.overlook(preOverlook - 5 ).build();
map.setMapStatus(MapStatusUpdateFactory.newMapStatus(newStatus2));
//移动百度地图到指定中心点
animateMapStatus方法有重载形式,可以指定动画的时长。(默认300ms)
MapStatusUpdate statusUpdate = MapStatusUpdateFactory.newLatLng(
LatLng(39.979982, 116.309258));
map.animateMapStatus(statusUpdate);
》》更改底图和添加交通图图层
//底图设置为默认的
map.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//底图设置成卫星图
map.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//显示交通图图层
map.setTrafficEnabled(true);
4)OverlayOptions 本地覆盖物的抽象基类
OverlavOptions关于覆盖物的操作:
1)创建覆盖物
2)给覆盖物添加数据

一般都要设置坐标(覆盖物具体摆在哪儿)
其它的。。。

3)把覆盖物添加到地图上

例1:添加圆形覆盖物 CircleOptions

//创建圆形覆盖物
CircleOptions options = new CircleOptions();
//设置数据
//圆心坐标
options.center(new LatLng(40.050513,116.30361))
//圆半径
.radius(1000)
//填充颜色
.fillColor(Color.BLUE)
//圆的边框宽度和颜色
.stroke(new Stroke(5, Color.RED));
//将覆盖物添加到地图上
map.addOverlay(options);
效果如下图:





例2:添加文字覆盖物 TextOptions

TextOptions options = new TextOptions();
options.fontColor(Color.BLUE)
.fontSize(100)
.bgColor(0x3300ff00)
.rotate(30)
.typeface(Typeface.SERIF)
.position(new LatLng(40.050513,116.30361))
.text("我在北京");
map.addOverlay(options);
效果如下图:




通过上面的两个例子,发现,文字(包括百度地图本身的文字)并不会随着地图一起缩放,
但是圆形覆盖物会随着地图一起缩放。

例3:添加标记覆盖物 MarkerOptions

MarkerOptions options = new MarkerOptions();
BitmapDescriptor icon;
options.position(testPos)
.title("我在北京")
//是否可拖拽
.draggable(true)
//图标(工厂创建)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.eat_icon));
map.addOverlay(options);
作为一个注重产品性能的程序员,应该在设置icon的时候创建一个BitmapDescriptor的引用,
在onDestroy里回收资源

//释放图片资源
bitmapDescriptor.recycle();
4)OverlavManager 搜索覆盖物的抽象基类

显示和管理多个Overlay的基类
|--本地搜索覆盖物:PoiOverlay
|--驾车路线覆盖物:DrivingRouteOverlay
|--步行路线覆盖物:WalkingRouteOverlay
|--换乘路线覆盖物:TransitOverlay
|--公交路线覆盖物:BusLineOverlay

百度地图移动版API集成搜索服务包括
|---位置检索、周边检索、范围检索 (点搜索)
使用PoiSearch和OnGetPoiSearchResultListener核心类
|---公交检索、驾乘检索、步行检索 (线搜索)
使用RoutePlanSearch和OnGetRoutePlanResultListener核心类

POI(Point of Interest兴趣点)搜索有三种方式
根据范围和检索词发起范围检索searchInBound
周边检索searchNearby
城市poi检索searchInCity
poi详细信息检索 searchPoiDetail
结果的展示: PoiOverlay

例1:搜索指定范围内的加油站(矩形区域搜索)

private void search() {
PoiSearch search = PoiSearch.newInstance();
search.setOnGetPoiSearchResultListener(new MyOnGetPoiSearchResultListener());

//范围内搜索
PoiBoundSearchOption boundOption = new PoiBoundSearchOption();
//搜索关键字
boundOption.keyword("加油站");
//搜索范围
LatLngBounds latLngBounds = new LatLngBounds.Builder()
.include(new LatLng(39.98, 116.310))
.include(new LatLng(39.96, 116.30))
.build();
boundOption.bound(latLngBounds);

search.searchInBound(boundOption);
}

class MyOnGetPoiSearchResultListener implements OnGetPoiSearchResultListener
{

@Override
public void onGetPoiDetailResult(PoiDetailResult arg0) {
//详情搜索在此处理结果
}

@Override
public void onGetPoiResult(PoiResult result) {
if(result == null || result.error ==
SearchResult.ERRORNO.RESULT_NOT_FOUND)
{
return ;  //无搜索结果
}
//找到搜索结果

//创建覆盖物
MyOverlay overlay = new MyOverlay(map);

//++++++++监听覆盖物的点击事件++++++++++
map.setOnMarkerClickListener(overlay);

//为覆盖物绑定数据
overlay.setData(result);

//将覆盖物添加到地图上
overlay.addToMap();

//显示全部的搜索结果
overlay.zoomToSpan();
}
}

//自定义一个实现了点击事件的覆盖物
class MyOverlay extends PoiOverlay
{

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

@Override
public boolean onPoiClick(int index) {
PoiResult result = getPoiResult();
//在搜索集中找到被点击的覆盖物的信息
PoiInfo poiInfo = result.getAllPoi().get(index);
Toast.makeText(getApplicationContext(), poiInfo.address, 0).show();
return super.onPoiClick(index);
}
}


例2:搜索周边的地铁站(圆形区域搜索)
原理和加油站的搜索一下,只是PoiSearch调用的方法及方法的参数不同,监听者不用改变。
可以进行共用。
PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();
nearbySearchOption.keyword("地铁站")
.radius(1000)
.location(testPos);
search.searchNearby(nearbySearchOption);
上面两个例子,MyOverlay在监听点击的时候,得到了覆盖物的PoiInfo,通过PoiInfo又可以得
到uid,根据uid就可以发起详情搜索:
//详情搜索
protected void detailSearch(PoiInfo poiInfo) {
PoiDetailSearchOption detailSearchOption = new PoiDetailSearchOption();
detailSearchOption.poiUid(poiInfo.uid);
search.searchPoiDetail(detailSearchOption);
}
监听详情搜索结果
@Override
public void onGetPoiDetailResult(PoiDetailResult result) {
if(result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND)
{
return ;
}
Toast.makeText(getApplicationContext(),"电话:" +  result.getTelephone(), 0).show();
}


例3:城市搜索
//城市搜索
private void citySearch() {
PoiCitySearchOption citySearchOption = new PoiCitySearchOption();
citySearchOption.city("北京")
.keyword("武术馆")
.pageNum(pageIndex ++);	  //分布显示数据
search.searchInCity(citySearchOption);
}
注意分页显示数据的时候,要清除之前的数据,在onGetPoiResult方法里:
//清除数据,防止分布的时候显示前一页的数据。
map.clear();


4. 百度地图高级开发:
案例1:泡泡提示信息
第1步:初始化PopView,并添加到MapView当中,隐藏PopView
private void initPop() {
pop = View.inflate(getApplicationContext(), R.layout.mark_item, null);
tip = (TextView) pop.findViewById(R.id.tv);

MapViewLayoutParams params = new MapViewLayoutParams.Builder()
.layoutMode(ELayoutMode.mapMode)
.position(testPos)
.width(MapViewLayoutParams.WRAP_CONTENT)
.height(MapViewLayoutParams.WRAP_CONTENT)
.build();

mMapView.addView(pop,params);
pop.setVisibility(View.INVISIBLE);
}
第2步:为BaiduMap添加Marker覆盖物的点击监听
map.setOnMarkerClickListener(this);
第3步:处理点击事件
将PopView定位到Marker的位置、获得Marker的信息并展示到PopView上去。
@Override
public boolean onMarkerClick(Marker marker) {
MapViewLayoutParams params = new MapViewLayoutParams.Builder()
.layoutMode(ELayoutMode.mapMode)
.position(marker.getPosition())
.width(MapViewLayoutParams.WRAP_CONTENT)
.height(MapViewLayoutParams.WRAP_CONTENT)
.build();

mMapView.updateViewLayout(pop, params);
pop.setVisibility(View.VISIBLE);
tip.setText(marker.getTitle());

return true;
}
效果图如下:





4. 百度地图定位SDK使用:
上面讲的的这些,都是地图SDK的开发。下面要说的就是定位SDK使用,就是定位手机当前的
位置。照着百度定位SDK开发文档做,但是代码需要有一定的改动。
代码如下:
public class LocateActivity extends BaseActivity {
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类
mLocationClient.registerLocationListener( myListener );    //注册监听函数

initLocation();
}

@Override
protected void onStart() {
super.onStart();
mLocationClient.start();
}

@Override
protected void onStop() {
super.onStop();
mLocationClient.stop();
}

private void initLocation(){
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有效时按照1S1次频率输出GPS结果
option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死
option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
mLocationClient.setLocOption(option);

//设置自己的定位图标
BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
MyLocationConfiguration configuration = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.COMPASS, true, icon);
map.setMyLocationConfigeration(configuration);
}

public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//Receive Location
Builder builder = new MyLocationData.Builder();
builder.latitude(location.getLatitude())  //纬度
.longitude(location.getLongitude());	//经度

map.setMyLocationEnabled(true);      //允许定位图层
map.setMyLocationData(builder.build());  //设置定位数据
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android经验