Android课程-百度地图

ygf 贡献于2015-05-10

作者 shkstart  创建于2013-07-13 17:44:00   修改者Windows 用户  修改于2015-05-05 08:23:00字数37835

文档摘要: 课程简介-(2)1、百度地图API2、百度地图入门3、百度地图加强.02、什么是百度地图API-(3)百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松访问百度服务和数据,构建功能丰富、交互性强的地图应用程序。百度地图移动版API不仅包含构建地图的基本接口,还提供了本地搜索、路线规划、地图定位等数据服务。
关键词:

 ————————————————————————————— 百度地图 讲师:尚硅谷-杨光福 微博:http://weibo.com/321chinavideo 01、课程简介-(2) 1、百度地图API 2、百度地图入门 3、百度地图加强 . 02、什么是百度地图API-(3) 百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松访问百度服务和数据,构建功能丰富、交互性强的地图应用程序。 百度地图移动版API不仅包含构建地图的基本接口,还提供了本地搜索、路线规划、地图定位等数据服务。 sdk下载地址:http://developer.baidu.com/map/ 使用百度经纬度坐标,可以通过http://api.map.baidu.com/lbsapi/getpoint/index.html查询地理 03、百度地图入门(45) 三大核心 BMapManager:百度引擎的管理工具。 MapView:显示地图的类,它的父类是ViewGroup. MapView 的MKMapViewListener MapController:对当前地图进行控制:缩放、旋转、平移。 准备工作 1、获取API Key ————————————————————————————— 获取API Key 地址:http://developer.baidu.com/map/android-mobile-apply-key.htm 已经得到的Key: 1A4A4ABEFBEECD8C17DEE880C4EA69B9607020B5 不同的地图厂商,申请API Key 2、 建立工程 创建工程后BaiduMap 添加引擎到Andoid工程中 添加jar包:baidumapapi_v2_1_2.jar和locSDK_3.1.jar 添加.so文件:拷贝libapp_BaiduMapApplib_v2_1_2.so、liblocSDK3.so、libvi_voslib.so到libs\armeabi目录下 注:liblocSDK3.so和locSDK_3.1.jar为百度定位SDK所使用资源,开发者可根据实际需求自行添加。 3、 添加地图引擎到Andoid工程中 4、添加权限 5、 初始化地图引擎 /** ————————————————————————————— * 初始化地图引擎 */ private void initManager() { // 地图引擎 manager = new BMapManager(this); /** * strKey - 申请的授权验证码 listener - 注册回调事件 */ manager.init(ConfigValues.key, new MKGeneralListener() { // MKEvent // 授权验证 @Override public void onGetPermissionState(int iError) { // if (iError == MKEvent.ERROR_PERMISSION_DENIED) { Toast.makeText(getApplicationContext(), "授权失败", 1).show(); } } // 网络状态 @Override public void onGetNetworkState(int iError) { if (iError == MKEvent.ERROR_NETWORK_CONNECT) { Toast.makeText(getApplicationContext(), "网络连接失败", 1).show(); } } }); } 6、 引入布局(地图控件)common.xml Layout中添加MapView控件用于展示地图 运行演示,看看显示效果。 7、 缩放级别 打开浏览器看一看百度地图最小级别 地图缩放级别 V1.X : 3--18级别 V2.X : 3--19级别 V2.X和V1.X的主要区别 A:修改了地图文件袋格式,节省空间。 例如北京市地图:V1.x:120MB,V2.X:20MB,相对于压缩9倍。 B:放大级别多了一个级别变成19级别,增加了3D效果。 8、 MapController地图控制器 创建管理工具,并初使化 BMapManager在init时校验key(300)和网络状态(2),关于状态码信息我们可以在MKEvent查询 ————————————————————————————— 管理某个具体的MapView:缩放、旋转、移动; private void init() { //MapController管理某个MapView:缩放、旋转、移动 mapView = (MapView) findViewById(R.id.map_view); controller = mapView.getController(); //设置地图的缩放级别,这个参数取值范围3--19 controller.setZoom(12); } 运行起来,演示一下。 9、 添加控制地图放大放小按钮 //需要在mapview添加一组按钮,mapview.addView(view) mapView.setBuiltInZoomControls(true); 10. 中心点的设置 默认地图中心设置是天安门 如果自己设置喜欢的中心点? 北京天安门广场的经纬度(东经:116°23′17〃,北纬:39°54′27〃 ) int latitudeE6 = 116°23′17 乘以 10六次方 这样便于支持小数点后几位 代码如下: int latitude=(int) (40.107218*1E6);//纬度 ————————————————————————————— int longitude=(int) (116.385178*1E6);//经度 GeoPoint point=new GeoPoint(latitude, longitude);//尚硅谷 controller.setCenter(point); 尚硅谷办公楼:116.385178,40.107218 天安门:39912725, 116404008 , int latitude=(int) (40.107218*1E6);//纬度 int longitude=(int) (116.385178*1E6);//经度 GeoPoint point=new GeoPoint(latitude, longitude);//尚硅谷 controller.setCenter(point); int latitude=(int) (39997741);//纬度 int longitude=(int) (116316176);//经度 GeoPoint point=new GeoPoint(latitude, longitude);//北京大学 controller.setCenter(point); ————————————————————————————— 04、第一个百度地图应用-(25) 1、增加权限重点是处理位置信息权限 ————————————————————————————— 2、 Layout中添加MapView控件用于展示地图 退出项目,进来,拖动地图出现下面bug.如图: 解决方案:控制MapView的onResume、onPause、destroy ; 代码如下: @Override ————————————————————————————— protected void onResume() { super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mapView.destroy(); } BMapManager对象创建一个就可以; 必须校验key,并且key值不能为空; 对于2.0之前的版本还需要注意 如果想让该监听起作用,并且看到地图内容必须处理BMapManager 涉及生命周期的方法。 引擎控制:结合MapActivity管理生命周期,及BMapManager的start()、stop()、destroy() ————————————————————————————— 控制管理 通过MapView设置缩放控件setBuiltInZoomControls(true) 缩放级别:V2.0之前支持(3-18),V2.0之后多一级(3-19) 默认的缩放级别 设置地图的中心位置 MapController controller = mapView.getController();//控制地图移动、缩放、旋转的工具 int latitude=(int) (40.107218*1E6);//纬度 int longitude=(int) (116.385178*1E6);//经度 GeoPoint point=new GeoPoint(latitude, longitude);//尚硅谷 controller.setCenter(point); 尚硅谷公楼:116.385178,40.107218 天安门:39912725, 116404008 MapController:主要用于控制地图移动、缩放、旋转的工具 动画形式移动 :animateTo(GeoPoint point) 缩放:zoomOut()—缩小;zoomIn()—放大;setZoom(arg0)—指定缩放级别 旋转 水平方向:setRotation,旋转角范围: 0 ~ 360(?) , 单位:度 默认值为0度,逆时针旋转为角度增大方向,通过MapView的getMapRotation获取当前角度 俯视:setOverlooking,俯角范围: -45 ~ 0 , 单位: 度 指南针设置:setCompassMargin(int x, int y) ,坐标系原点为MapView左上顶点 ,指南针在3D模式下自动显现,注意了,旋转式才出现。 以一个点为中心旋转: 基于一条线旋转(overlooking俯视) ————————————————————————————— 代码如下: @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // 缩放、旋转、移动 switch (keyCode) { case KeyEvent.KEYCODE_1: // 放大(一级级) controller.zoomIn(); break; case KeyEvent.KEYCODE_2: // 缩小(一级级) controller.zoomOut(); break; case KeyEvent.KEYCODE_3: // 以一个点为中心旋转 // 获取到地图当前的角度 // -180~180 int rotation = mapView.getMapRotation(); controller.setRotation(rotation + 30); Log.i(TAG, "rotation:" + rotation); break; case KeyEvent.KEYCODE_4: // 俯瞰,以一条线旋转overlooking ————————————————————————————— // -45~0 int overlooking = mapView.getMapOverlooking(); controller.setOverlooking(overlooking - 5); Log.i(TAG, "overlooking:" + overlooking); break; case KeyEvent.KEYCODE_5: // 移动 controller.animateTo(new GeoPoint(40065796, 116349868)); break; } return super.onKeyDown(keyCode, event); } 演示看效果以及旋转日志。 05、百度地图高级应用 高级功能简介 地图图层 覆盖物 搜索 离线地图 地图图层-(20) 什么是地图图层 地图可以包含一个或多个图层,每个图层在每个级别都是由若干个图块组成的,它们覆盖了地图的整个表面。例如您所看到包括街道、兴趣点、学校、公园等内容的地图展现就是一个图层,另外交通流量的展现也是通过图层来实现的。 ————————————————————————————— 图层分类 底图 基本的地图图层,包括若干个缩放级别,显示基本的地图信息,包括道路、街道、学校、 公园等内容。 实时交通信息图:MapView.setTraffic(true) 卫星图:MapView.setSatellite(true) 卫星地图是卫星拍摄的真实的地理面貌,所以卫星地图可用来检测地面的信息,你可以了解到地理位置,地形等。 1、创建图层页面LayerDemo /** * *底层,交通实时图,卫星图 * */ public class LayerDemo extends Activity { private BMapManager manager; private MapController controller; private MapView mapView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initManager(); setContentView(R.layout.common); init(); } ————————————————————————————— @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // 底层,交通实时图,卫星图 switch (keyCode) { case KeyEvent.KEYCODE_1: // 底图 mapView.setTraffic(false); mapView.setSatellite(false); break; case KeyEvent.KEYCODE_2: // 交通实时图 mapView.setTraffic(true); mapView.setSatellite(false); break; case KeyEvent.KEYCODE_3: // 卫星图 mapView.setSatellite(true); mapView.setTraffic(false); break; } return super.onKeyDown(keyCode, event); } private void init() { mapView = (MapView) findViewById(R.id.map_view); controller = mapView.getController(); controller.setZoom(12); mapView.setBuiltInZoomControls(true); } private void initManager() { manager = new BMapManager(this); manager.init(ConfigValues.key, null); } @Override protected void onResume() { super.onResume(); ————————————————————————————— mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mapView.destroy(); } } 2、主页面完善代码和布局文件 代码如下: public class MainActivity extends Activity { private static String[] objects = new String[] { "hello world", "图层", "几何图形元素", "展示文字", "多条目绘制","矩形区域内搜索", "圆形区域内搜索", "全城搜索", "驾车路线", "步行路线", "公交换乘", "我的位置" }; private static Class[] clazzs = new Class[] { HelloWorld.class, LayerDemo.class, GraphicsOverlayDemo.class, TextOverlayDemo.class, ItemizedOverlayDemo.class, PoiSearchNearByDemo.class, PoiSearchInCityDemo.class, DrivingSearchDemo.class, WalkingSearchDemo.class, TransitOverlayDemo.class, MyLocationOverlayDemo.class }; private ListView list; private ArrayAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.il_in); list = (ListView) findViewById(R.id.list); ————————————————————————————— adapter = new ArrayAdapter(getApplicationContext(), R.layout.item, objects); list.setAdapter(adapter); list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Intent intent = new Intent(getApplicationContext(), clazzs[position]); startActivity(intent); } }); } } 布局文件: Item布局文件就是一个TextView: 实时交通图: 绿色:交通畅通;黄色:车辆有些多,稍微有些堵车;红色:就堵车了。 怎么知道堵车呢?需要在交通道路上铺设设备(这个设备一般是第三方公司做,比例:南京城际在线信息技术有限公司 )。把数据传给服务器,百度再传给开发者。 卫星: 是卫星走过拍过的图像。 覆盖物 所有叠加或覆盖到地图的内容,我们统称为地图覆盖物。如标注、矢量图形元素(包括:折线和多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的处理。 覆盖物包括: 覆盖物的抽象基类:Overlay(核心类),第四个核心类 几何图形绘制覆盖物:GraphicsOverlay 文字绘制覆盖物:TextOverlay 分条目覆盖物:ItemizedOverlay 本地搜索覆盖物:PoiOverlay 路线规划覆盖物:RouteOverlay 换乘路线覆盖物:TransitOverlay 我的位置覆盖物:MyLocationOverlay ————————————————————————————— Overlay是一个基类,它表示可以显示在地图上方的覆盖物。 从2.0.0开始,SDK不支持直接继承Overlay , 用户可通过继承ItemizedOverlay来添加覆盖物。 关于Overlay的使用,即在MapView上显示Overlay的步骤 1、需要获取到MapView中保存Overlay的集合 2、在其中添加需要显示的内容 3、然后刷新界面 注意:所不同的是如何给不同的Overlay设置数据,这也是重点。 覆盖物-GraphicsOverlay-(25) 自定义绘制几何图形需要以下几个类的支持: Geometry:这是一个几何图形类,利用此类,可以构建待绘制的各种基本几何元素; Symbol:样式类,如果只构建几何图形类而没有样式的话,该几何图形是无意义的; Graphic:图形类,利用几何图形加上样式,这样就可以构建一个图形类,Graphic就是这样一个类,用于管理所添加的图形; GraphicsOverlay:这是一个用于绘制图形的overlay,和其他的各种overlay用法相同。 绘制步骤 创建自绘图形:Geometry,Geometry表示一个用于绘图的几何图形,目前绘图api提供五种几何图形:点,线,圆、矩形和凸多边形。 为自绘图形选择合适的样式:Symbol,Symbol表示绘图样式,如点颜色,线宽,填充色等。 构建绘图对象:Graphic,通过几何元素(Geometry)和相对应的样式(Symbol)就可以组合成Graphic, Graphic表示SDK可直接用于绘制的一个绘图对象,用户通过操纵Graphic对象向地图添加/移除自绘图形。 GraphicsOverlay:将自绘图形添加到地图中。Graphic对象可通过GraphicsOvelay添加到MapView中。 ————————————————————————————— 把地图公共功能抽取到BaseActivity,代码如下: public class BaseActivity extends Activity { protected static final String TAG = "BaseActivity"; protected BMapManager manager; protected MapView mapView; protected MapController controller; protected int latitude = (int) (40.051 * 1E6);// 纬度 protected int longitude = (int) (116.303 * 1E6);// 经度 protected GeoPoint point = new GeoPoint(latitude, longitude);// 尚硅谷 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // key验证等 initManager(); setContentView(R.layout.common); init(); } @Override protected void onResume() { super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mapView.destroy(); } private void init() { // MapController管理某个MapView:缩放、旋转、移动 mapView = (MapView) findViewById(R.id.map_view); ————————————————————————————— controller = mapView.getController(); // 设置地图的缩放级别,这个参数取值范围3--19 controller.setZoom(12); // 需要在mapview添加一组按钮,mapview.addView(view) mapView.setBuiltInZoomControls(true); // 设置中心点 controller.setCenter(point); // controller.setCompassMargin(100, 100); } /** * 初始化地图引擎 */ private void initManager() { // 地图引擎 manager = new BMapManager(this); /** * strKey - 申请的授权验证码 listener - 注册回调事件 */ manager.init(ConfigValues.key, new MKGeneralListener() { // MKEvent // 授权验证 @Override public void onGetPermissionState(int iError) { // if (iError == MKEvent.ERROR_PERMISSION_DENIED) { Toast.makeText(getApplicationContext(), "授权失败", 1).show(); } } // 网络状态 @Override public void onGetNetworkState(int iError) { if (iError == MKEvent.ERROR_NETWORK_CONNECT) { Toast.makeText(getApplicationContext(), "网络连接失败", 1).show(); } ————————————————————————————— } }); } } 举例: // 故宫左上角 GeoPoint geoPointLT = new GeoPoint((int) (39.929 * 1E6), (int) (116.397 * 1E6)); // 故宫右下角 GeoPoint geoPointRB = new GeoPoint((int) (39.920 * 1E6), (int) (116.408 * 1E6)); color.red = 255; color.green = 0; color.blue = 0; color.alpha = 100; 代码如下: public class GraphicsOverlayActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); draw(); } /** * 绘制几何图形 */ private void draw() { //1.得到所有的覆盖物的集合mapview; List overlays = mapView.getOverlays(); //2.创建自己的覆盖物,添加到集合中 GraphicsOverlay overlay = new GraphicsOverlay(mapView); //关于集合图形的设置 setData(overlay); overlays.add(overlay); ————————————————————————————— //3.刷新页面 mapView.refresh(); } /** * 绘制一个圆 * @param overlay */ private void setData(GraphicsOverlay overlay) { //1.定义几何图形:圆心和半径 //几何 Geometry geometry = new Geometry(); /** * geoPoint - 地理坐标 radius - 圆的半径,单位:米 */ geometry.setCircle(point, 1000); //2.样式:颜色、是否填充、绘制圆形是的线条的粗心 //符号 Symbol symbol = new Symbol(); /** * color - 颜色 status - 填充状态,0表示不填充,1表示填充 linewidth - 线宽,当填充状态为填充时线宽无意义 */ Symbol.Color color =symbol.new Color(); color.red = 255; color.green = 0; color.blue = 0; color.alpha = 100; symbol.setSurface(color, 1, 5); //图形 Graphic graphic = new Graphic(geometry, symbol); overlay.setData(graphic); } ————————————————————————————— } 覆盖物-TextOverlay-(12) 简单介绍Geometry的方法,就是支持的图形。 文字绘制的方法与几何图形绘制的方法类似,它也需要几个类的功能支持才能完成最终绘制: Symbol:样式类,主要负责为所绘制的文字提供颜色属性; TextItem:文字类,包含文字对齐方式、颜色、字号、绘制位置、字体等基本信息; TextOverlay:这是一个用于绘制文字的overlay,和其他的各种overlay用法相同。 绘制步骤 定义并初始化两个Symbol.Color对象,用于设置文字的颜色和其背景的颜色; 定义并初始化TextItem对象,用于所绘制文字的基本属性信息; 基本信息设置:大小、对齐方式等 /** * 文字展示 * */ public class TextOverlayDemo extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); draw(); } /** * 绘制文字 */ private void draw() { List overlays = mapView.getOverlays(); TextOverlay textOverlay = new TextOverlay(mapView); setData(textOverlay); overlays.add(textOverlay); mapView.refresh();// 刷新 ————————————————————————————— } /** * 设置数据 * * @param textOverlay */ private void setData(TextOverlay textOverlay) { // int align // 文字对齐方式 ,为 ALIGN_TOP,ALIGN_CENTER, ALIGN_BOTTOM中的一个值 // static int ALIGN_BOTTOM // 文字对齐参数,下边中点对齐 // static int ALIGN_CENTER // 文字对齐参数,中心对齐 // static int ALIGN_TOP // 文字对齐参数,上边中点对齐 // Symbol.Color bgColor // 文字背景色, 默认为透明 // Symbol.Color fontColor // 文字颜色 // int fontSize // 字号大小 // GeoPoint pt // 文字显示的位置,用经纬度坐标表示 // String text // 要显示的文字内容 // Typeface typeface // 文字字体, android 字体表示,为空则用系统默认字体. TextItem textItem = new TextItem(); textItem.align = TextItem.ALIGN_CENTER; textItem.fontColor = getColor(); textItem.fontSize = 20; textItem.pt = point; textItem.text = "尚硅谷"; ————————————————————————————— textItem.typeface = Typeface.SERIF; textOverlay.addText(textItem); } private Color getColor() { // 符号 Symbol symbol = new Symbol(); /** * color - 颜色 status - 填充状态,0表示不填充,1表示填充 linewidth - 线宽,当填充状态为填充时线宽无意义 */ Symbol.Color color = symbol.new Color(); color.red = 255; color.green = 0; color.blue = 0; color.alpha = 100; return color; } } 覆盖物-多条目的绘制-ItemizedOverlay-(13) 1、某个类型的覆盖物,包含多个类型相同、显示方式相同、处理方式相同的项时,使用此类。 2、开发步骤 继承ItemizedOverlay 创建OverlayItem,准备overlay数据; 创建ItemizedOverlay实例,调用 addItem(OverlayItem)} 接口添加overlay。 调用MapView.getOverlays().add()方法添加overlay到mapview中。 调用MapView.refresh() 使Overlay生效 3、 显示一个“泡泡窗口” 案例代码: OverlayItem item=new OverlayItem(ithmPos, "尚硅谷", "牛"); overlay.addItem(item); item = new OverlayItem(new GeoPoint(latitude + 1000, longitude), "向北", "增加纬度"); overlay.addItem(item); ————————————————————————————— item = new OverlayItem(new GeoPoint(latitude, longitude + 1000), "向东", "增加经度"); overlay.addItem(item); item = new OverlayItem(new GeoPoint(latitude - 1000, longitude - 1000), "向西南", "减少经纬度"); overlay.addItem(item); 代码如下: /** * 多条条目绘制 * */ public class ItemizedOverlayDemo extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initPop(); draw(); controller.setZoom(16); } /** * 画多条和泡泡 */ private void draw() { ItemizedOverlay overlay = new ItemizedOverlay( getResources().getDrawable(R.drawable.eat_icon), mapView); setData(overlay); mapView.getOverlays().add(overlay); } private void setData(ItemizedOverlay overlay) { // protected GeoPoint mPoint // 该item的位置 // protected String mSnippet // 该item的文字片段 // protected String mTitle ————————————————————————————— // 该item的标题文本 OverlayItem item = new OverlayItem(point, "尚硅谷", "不6k不就业"); overlay.addItem(item); item = new OverlayItem(new GeoPoint(latitude + 1000, longitude), "向北", "增加纬度"); overlay.addItem(item); item = new OverlayItem(new GeoPoint(latitude, longitude + 1000), "向东", "增加经度"); overlay.addItem(item); item = new OverlayItem(new GeoPoint(latitude - 1000, longitude - 1000), "向西南", "减少经纬度"); overlay.addItem(item); } } 运行演示。 显示一个“泡泡窗口”-(15) 1、 准备好泡泡的layout 2、在MapView中添加该泡泡 addView(View child, LayoutParams params) LayoutParams:MapView.LayoutParams ————————————————————————————— MapView.LayoutParams(int width, int height, GeoPoint point, int alignment),其中alignment为对其方式,采用BOTTOM_CENTER 在处理onTap时更新Layout,利用LayoutParams传递点位信息,同时可以获取标题信息,设置给TextView 添加泡泡代码如下红色部分: /** * 多条绘制 * */ public class ItemizedOverlayDemo extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initPop(); draw(); controller.setZoom(16); } /** * 画多条和泡泡 */ private void draw() { ItemizedOverlay overlay = new ItemizedOverlay( getResources().getDrawable(R.drawable.eat_icon), mapView) { @Override protected boolean onTap(int index) { OverlayItem item = getItem(index); MapView.LayoutParams params = new MapView.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, item.getPoint(), MapView.LayoutParams.BOTTOM_CENTER); pop.setVisibility(View.VISIBLE); title.setText(item.getTitle()); mapView.updateViewLayout(pop, params); return super.onTap(index); } }; ————————————————————————————— setData(overlay); mapView.getOverlays().add(overlay); } private void setData(ItemizedOverlay overlay) { // protected GeoPoint mPoint // 该item的位置 // protected String mSnippet // 该item的文字片段 // protected String mTitle // 该item的标题文本 OverlayItem item = new OverlayItem(point, "尚硅谷", "不4k不就业"); overlay.addItem(item); item = new OverlayItem(new GeoPoint(latitude + 1000, longitude), "向北", "增加纬度"); overlay.addItem(item); item = new OverlayItem(new GeoPoint(latitude, longitude + 1000), "向东", "增加经度"); overlay.addItem(item); item = new OverlayItem(new GeoPoint(latitude - 1000, longitude - 1000), "向西南", "减少经纬度"); overlay.addItem(item); } private View pop; private TextView title; // 添加泡泡 // 单击某一条具体的Item的时候其上方显示 // 加载pop // 添加到mapview中,不这种坐标,pop隐藏 // 当点击时,显示泡泡,位置更新 private void initPop() { pop = View.inflate(this, R.layout.pop, null); title = (TextView) pop.findViewById(R.id.title); // MapView.LayoutParams(int width, int height, GeoPoint point, int // alignment) // 创建自定义布局参数,按地理坐标布局 ————————————————————————————— MapView.LayoutParams params = new MapView.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, null, MapView.LayoutParams.BOTTOM_CENTER); mapView.addView(pop, params); pop.setVisibility(View.INVISIBLE); } } 搜索 1、百度地图移动版API集成搜索服务包括 位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索。 2、核心类: MKSearch和MKSearchListener 3、实现思路 初始化MKSearch类,通过init方法注册搜索结果的监听对象MKSearchListener,实现异步搜索服务。 通过自定义MySearchListener实现类,处理不同的回调方法,获得搜索结果。 注意,MKSearchListener只支持一个,以最后一次设置为准 4、结合覆盖物展示搜索 本地搜索覆盖物:PoiOverlay-圆形区域的、矩形区域、全城范围内搜索。 路线覆盖物:RouteOverlay 换乘路线覆盖物:TransitOverlay ————————————————————————————— 本地搜索 1、POI(Point of Interest兴趣点)搜索有三种方式 根据范围和检索词发起范围检索PoiSearchInbounds 兴趣的界内搜索 周边检索poiSearchNearBy 城市poi检索poiSearchInCity poi详细信息检索 poiDetailSearch 2、 结果的展示: PoiOverlay 参数及案例: poiSearchInbounds:使用参数信息 左下:40.103148 116.368541 右上:40.112916 116.399012, GeoPoint ptLB = new GeoPoint((int) (40.103148 * 1E6), (int) (116.368541 * 1E6)); GeoPoint ptRT = new GeoPoint((int) (40.112916 * 1E6), (int) (116.399012 * 1E6)); //搜索 public int poiSearchInbounds(java.lang.String key, GeoPoint ptLB, GeoPoint ptRT) 根据范围和检索词发起范围检索.异步函数,返回结果在MKSearchListener里的onGetPoiResult方法通知 参数: key - 关键词 ptLB - 地理坐标,范围的左下角 ptRT - 地理坐标,范围的右上角 返回: 成功返回0,否则返回-1 //结果处理 void onGetPoiResult(MKPoiResult result, int type, int iError) 返回poi搜索结果 参数: result - 搜索结果 type - 返回结果类型: MKSearch.TYPE_POI_LIST, MKSearch.TYPE_AREA_POI_LIST, MKSearch.TYPE_AREA_MULTI_POI_LIST, MKSearch.TYPE_CITY_LIST iError - 错误号,0表示正确返回 对于poiSearchInbounds和poiSearchNearBy,type的值为MKSearch.TYPE_AREA_POI_LIST 对于poiSearchInCity,type的值为MKSearch.TYPE_POI_LIST 3、查询加油站信息 ————————————————————————————— 多种查询方法,但结果的处理都在MKSearchListener的onGetPoiResult方法中,在该方法中可以通过传递的type值来区分是范围搜索还是城市检索。 处理步骤: 判断服务器结果返回 创建poi覆盖物 将服务器返回数据添加到poi覆盖物中 添加覆盖物到MapView 刷新MapView 4、注意事项 POI检索结果每页容量默认情况下为10,可以通过setPoiPageCapacity设置,支持1-50(10) 翻页功能通过MKSearch类的goToPoiPage实现,该方法是异步函数,搜索成功后会调用注册的事件处理函数onGetPoiResult 返回查询页的结果。 支持分类搜索,例如mSearch.poiSearchInCity("北京", "娱乐") 矩形区域兴趣点搜索-(27) 创建PoiSearchInboundsDemo类继承BaseActivity并在功能清单文件注册 搜索监听BaseSearchListener 放在基类里面,BaseActivity代码如下: package com.atguigu.baidumap; public class BaseActivity extends Activity { protected static final String TAG = "BaseActivity"; protected BMapManager manager; protected MapView mapView; protected MapController controller; protected int latitude = (int) (40.051 * 1E6);// 纬度 protected int longitude = (int) (116.303 * 1E6);// 经度 protected GeoPoint point = new GeoPoint(latitude, longitude);// 尚硅谷 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // key验证等 ————————————————————————————— initManager(); setContentView(R.layout.common); init(); } @Override protected void onResume() { super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mapView.destroy(); } private void init() { // MapController管理某个MapView:缩放、旋转、移动 mapView = (MapView) findViewById(R.id.map_view); controller = mapView.getController(); // 设置地图的缩放级别,这个参数取值范围3--19 controller.setZoom(12); // 需要在mapview添加一组按钮,mapview.addView(view) mapView.setBuiltInZoomControls(true); // 设置中心点 controller.setCenter(point); // controller.setCompassMargin(100, 100); } /** ————————————————————————————— * 初始化地图引擎 */ private void initManager() { // 地图引擎 manager = new BMapManager(this); /** * strKey - 申请的授权验证码 listener - 注册回调事件 */ manager.init(ConfigValues.key, new MKGeneralListener() { // MKEvent // 授权验证 @Override public void onGetPermissionState(int iError) { // if (iError == MKEvent.ERROR_PERMISSION_DENIED) { Toast.makeText(getApplicationContext(), "授权失败", 1).show(); } } // 网络状态 @Override public void onGetNetworkState(int iError) { if (iError == MKEvent.ERROR_NETWORK_CONNECT) { Toast.makeText(getApplicationContext(), "网络连接失败", 1).show(); } } }); } protected class BaseSearchListener implements MKSearchListener { @Override public void onGetAddrResult(MKAddrInfo result, int iError) { } @Override public void onGetBusDetailResult(MKBusLineResult result, int iError) { } ————————————————————————————— @Override public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) { } @Override public void onGetPoiDetailSearchResult(int result, int iError) { } @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { } @Override public void onGetSuggestionResult(MKSuggestionResult result, int iError) { } @Override public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) { } @Override public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) { } } } 矩形区域内搜索兴趣点 /** * 在矩形区域内搜索 */ public class PoiSearchInboundsDemo extends BaseActivity { private MKSearch search; private MKSearchListener listener; @Override protected void onCreate(Bundle savedInstanceState) { ————————————————————————————— super.onCreate(savedInstanceState); initSearch(); } /** * 初始化搜索引擎和回调 */ private void initSearch() { search = new MKSearch(); listener = new MyMKSearchListener(); // boolean init(BMapManager bmapMan, MKSearchListener listener) search.init(manager, listener); // // 参数: // key - 关键词 // ptLB - 地理坐标,范围的左下角 // ptRT - 地理坐标,范围的右上角 // 返回: // 成功返回0,否则返回-1 GeoPoint ptLB = new GeoPoint((int) (40.103148 * 1E6), (int) (116.368541 * 1E6)); GeoPoint ptRT = new GeoPoint((int) (40.112916 * 1E6), (int) (116.399012 * 1E6)); //search.poiSearchInbounds("加油站", ptLB, ptRT);//发起搜索 search.poiSearchInbounds("洗浴", ptLB, ptRT);//发起搜索 } private class MyMKSearchListener extends BaseSearchListener { @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { // 1.判断是否请求成功 if (result != null && iError == 0) { // 2.创建兴趣的类并设置数据 PoiOverlay overlay = new PoiOverlay(PoiSearchInboundsDemo.this, mapView); overlay.setData(result.getAllPoi()); //3.添加兴趣点 mapView.getOverlays().add(overlay); // 4.刷新mapView ————————————————————————————— mapView.refresh(); } else { Toast.makeText(getApplicationContext(), "未搜索到结果", 1).show(); } super.onGetPoiResult(result, type, iError); } } } 设置可以点击兴趣点 在BaseActiviy设置 controller.enableClick(true); 设置后就有土司效果。 圆形(附近)区域搜索-(16) /** * 在圆形区域内搜索 */ public class PoiSearchNearByDemo extends BaseActivity { private MKSearch search; private MKSearchListener listener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initSearch(); } /** * 初始化搜索引擎和回调 */ private void initSearch() { ————————————————————————————— search = new MKSearch(); listener = new MyMKSearchListener(); // boolean init(BMapManager bmapMan, MKSearchListener listener) search.init(manager, listener); // 参数: // key - 关键词 // pt - 中心点地理坐标 // radius - 半径,单位:米 // 返回: // 成功返回0,否则返回-1 search.poiSearchNearBy("加油站", point, 1000); } private class MyMKSearchListener extends BaseSearchListener { @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { // 1.判断是否请求成功 if (result != null && iError == 0) { // 2.创建兴趣的类并设置数据 PoiOverlay overlay = new PoiOverlay(PoiSearchNearByDemo.this, mapView); overlay.setData(result.getAllPoi()); //3.添加兴趣点 mapView.getOverlays().add(overlay); // 4.刷新mapView mapView.refresh(); } else { Toast.makeText(getApplicationContext(), "未搜索到结果", 1).show(); } super.onGetPoiResult(result, type, iError); } } ————————————————————————————— } 7、 全城搜索,红色部分就是本次实现的功能 /** * 在城市区域内搜索 */ public class PoiSearchInCityDemo extends BaseActivity { private MKSearch search; private MKSearchListener listener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initSearch(); } /** * 初始化搜索引擎和回调 */ private void initSearch() { search = new MKSearch(); listener = new MyMKSearchListener(); // boolean init(BMapManager bmapMan, MKSearchListener listener) search.init(manager, listener); search.poiSearchInCity("北京", "加油站"); } private class MyMKSearchListener extends BaseSearchListener { @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { // 1.判断是否请求成功 if (result != null && iError == 0) { //处理分页 //总页数、总条数、当前页、每页显示数量10 ————————————————————————————— // int getCurrentNumPois() // 获取当前页的poi结果数 // int getNumPages() // 获取本次poi搜索的总页数 // int getNumPois() // 获取本次poi搜索的总结果数 // int getPageIndex() // 返回当前页的索引 index = result.getPageIndex(); String info = "当页总个数"+result.getCurrentNumPois()+",总页数:"+result.getNumPages()+ ",总结果数"+result.getNumPois()+",当前页:"+result.getPageIndex(); Toast.makeText(getApplicationContext(), info, 1).show(); // 2.创建兴趣的类并设置数据 PoiOverlay overlay = new PoiOverlay(PoiSearchInCityDemo.this, mapView); overlay.setData(result.getAllPoi());//当前页的 //3.添加兴趣点 mapView.getOverlays().add(overlay); // 4.刷新mapView mapView.refresh(); } else { Toast.makeText(getApplicationContext(), "未搜索到结果", 1).show(); } super.onGetPoiResult(result, type, iError); } } private int index = 0; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode ==KeyEvent.KEYCODE_1){ index++; search.goToPoiPage(index); } ————————————————————————————— // TODO Auto-generated method stub return super.onKeyDown(keyCode, event); } } 解决bug private class MyMKSearchListener extends BaseSearchListener { @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { // 1.判断是否请求成功 if (result != null && iError == 0) { //处理分页 //总页数、总条数、当前页、每页显示数量10 // int getCurrentNumPois() // 获取当前页的poi结果数 // int getNumPages() // 获取本次poi搜索的总页数 // int getNumPois() // 获取本次poi搜索的总结果数 // int getPageIndex() // 返回当前页的索引 index = result.getPageIndex(); String info = "当页总个数"+result.getCurrentNumPois()+",总页数:"+result.getNumPages()+ ",总结果数"+result.getNumPois()+",当前页:"+result.getPageIndex(); Toast.makeText(getApplicationContext(), info, 1).show(); // 2.创建兴趣的类并设置数据 PoiOverlay overlay = new PoiOverlay(PoiSearchInCityDemo.this, mapView); overlay.setData(result.getAllPoi());//当前页的 //3.添加兴趣点 ————————————————————————————— mapView.getOverlays().clear(); mapView.getOverlays().add(overlay); // 4.刷新mapView mapView.refresh(); } else { Toast.makeText(getApplicationContext(), "未搜索到结果", 1).show(); } super.onGetPoiResult(result, type, iError); } } 路线检索-驾车路线-(20) 1、可以进行驾车和步行路线查询 结果展示: RouteOverlay 2、案例:从尚硅谷到北京大学路线查询 3、驾车路线查询 查询:MKSearch.drivingSearch(java.lang.String startCity, MKPlanNode start, java.lang.String endCity, MKPlanNode end)驾乘路线搜索,或者增加途经点. MKPlanNode内容的设置:可以使用经纬度和地名,但不支持模糊查询,需要输入准确的名称 可以通过setDrivingPolicy(int policy) 来设置驾车路线规划策略 结果处理:MKSearchListener.onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) 参数案例: 尚硅谷办公楼:40107218,116385178 ECAR_DIS_FIRST 最短距离 ECAR_FEE_FIRST 较少费用 ECAR_TIME_FIRST 时间优先 代码如下: /** * * 驾车路线 * */ public class DrivingSearchDemo extends BaseActivity { ————————————————————————————— private MyListener listener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initSearch(); } private void initSearch() { listener = new MyListener(); search.init(manager, listener); // 检索策略 // static int ECAR_DIS_FIRST // 驾乘检索策略常量:最短距离 // static int ECAR_FEE_FIRST // 驾乘检索策略常量:较少费用 // static int ECAR_TIME_FIRST // 驾乘检索策略常量:时间优先 search.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST); // 参数: // startCity - 起点所在城市,起点为坐标时可不填 // start - 搜索的起点,可以为坐标,名称任一种 // endCity - 终点所在城市,终点为坐标时可不填 // end - 搜索的终点,可以为坐标,名称任一种 // 返回: // 成功返回0,否则返回-1 MKPlanNode start = new MKPlanNode(); start.pt = point; MKPlanNode end = new MKPlanNode(); end.name = "天安门"; // 搜索 search.drivingSearch("北京", start, "北京", end); } private class MyListener extends BaseSearchListener { @Override public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) { if (result != null && iError == 0) { ————————————————————————————— RouteOverlay overlay = new RouteOverlay(DrivingSearchDemo.this, mapView); if (result.getNumPlan() > 0) { MKRoutePlan plan = result.getPlan(0); MKRoute route=plan.getRoute(0); overlay.setData(route); mapView.getOverlays().add(overlay); mapView.refresh(); }else{ Toast.makeText(getApplicationContext(), "没有方案", 1).show(); } } else { Toast.makeText(getApplicationContext(), "搜索失败", 1).show(); } super.onGetDrivingRouteResult(result, iError); } } } 文档中驾车第二个方法: private void initSearch() { listener = new MyListener(); search.init(manager, listener); // 检索策略 // static int ECAR_DIS_FIRST // 驾乘检索策略常量:最短距离 // static int ECAR_FEE_FIRST // 驾乘检索策略常量:较少费用 // static int ECAR_TIME_FIRST // 驾乘检索策略常量:时间优先 search.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST); // 参数: ————————————————————————————— // startCity - 起点所在城市,起点为坐标时可不填 // start - 搜索的起点,可以为坐标,名称任一种 // endCity - 终点所在城市,终点为坐标时可不填 // end - 搜索的终点,可以为坐标,名称任一种 //wpNodes - 途经点数据 // 返回: // 成功返回0,否则返回-1 MKPlanNode start = new MKPlanNode(); start.pt = point; // MKPlanNode end = new MKPlanNode(); // end.name = "天安门"; MKPlanNode end = new MKPlanNode(); end.pt = new GeoPoint(40065796,116349868); // 搜索 // search.drivingSearch("北京", start, "北京", end); //途径点 ArrayList arrayList = new ArrayList(); MKWpNode mkWpNode = new MKWpNode(); mkWpNode.city = "北京"; mkWpNode.name = "天安门"; arrayList.add(mkWpNode); search.drivingSearch("北京", start, "北京", end,arrayList); } 路线检索-步行检索-(13) MKSearch.walkingSearch(java.lang.String startCity, MKPlanNode start, java.lang.String endCity, MKPlanNode end)步行路线搜索. 结果处理:MKSearchListener.onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) 代码如下: ————————————————————————————— /** * 步行 * */ public class WalkingSearchDemo extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initSearch(); } private void initSearch() { search.init(manager, new BaseSearchListener() { @Override public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) { if (result != null && iError == 0) { RouteOverlay overlay = new RouteOverlay( WalkingSearchDemo.this, mapView); if (result.getNumPlan() > 0) { MKRoutePlan plan = result.getPlan(0); MKRoute route = plan.getRoute(0); overlay.setData(route); mapView.getOverlays().add(overlay); mapView.refresh(); } else { Toast.makeText(getApplicationContext(), "没有方案", 1) .show(); } } else { Toast.makeText(getApplicationContext(), "搜索失败", 1).show(); } super.onGetWalkingRouteResult(result, iError); } }); MKPlanNode start = new MKPlanNode(); start.pt = point; ————————————————————————————— // MKPlanNode end = new MKPlanNode(); // end.name = "天安门"; MKPlanNode end = new MKPlanNode(); end.pt = new GeoPoint(40065796, 116349868); // startCity - 起点所在城市,起点为坐标时可不填 // start - 搜索的起点,可以为坐标,名称任一种 // endCity - 终点所在城市,终点为坐标时可不填 // end - 搜索的终点,可以为坐标,名称任一种 search.walkingSearch("北京", start, "北京", end); } 路线检索-换乘路线-(12) 仅公交路线搜索 结果展示:TransitOverlay 检索:MKSearch.transitSearch(java.lang.String city, MKPlanNode start, MKPlanNode end) 通过setTransitPolicy(int policy) 设置路线规划策略 结果处理:MKSearchListener.onGetTransitRouteResult(MKTransitRouteResult result, int iError) 注意: MKPlanNode可以使用name进行搜索 EBUS_NO_SUBWAY 不含地铁 EBUS_TIME_FIRST 时间优先 EBUS_TRANSFER_FIRST 最少换乘 EBUS_WALK_FIRST 最少步行距离 代码如下: /** * 公交换乘 * */ public class TransitSearchDemo extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ————————————————————————————— initSeach(); } private void initSeach() { search.init(manager, new BaseSearchListener() { @Override public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) { if(result != null&& iError ==0){ TransitOverlay overlay = new TransitOverlay(TransitSearchDemo.this, mapView); if(result.getNumPlan()>0){ MKTransitRoutePlan plan = result.getPlan(0); overlay.setData(plan); mapView.getOverlays().clear(); mapView.getOverlays().add(overlay); mapView.refresh(); } }else{ Toast.makeText(getApplicationContext(), "搜索失败", 1).show(); } super.onGetTransitRouteResult(result, iError); } }); //1.设置策略 search.setTransitPolicy(MKSearch.EBUS_WALK_FIRST); //尚硅谷 MKPlanNode start = new MKPlanNode(); start.pt = point; MKPlanNode end = new MKPlanNode(); //北京大学 end.pt = new GeoPoint(39912725, 116404008 ); //2.搜索 search.transitSearch("北京", start, end); } ————————————————————————————— } 定位--MyLocationOverlay-(30) 一个负责显示用户当前位置的Overlay。 在百度地图移动版API中,提供一个重要的特色功能:定位,通过这个功能,能获取到用户当前所在位置。 在程序中,如果使用此功能,必须注册GPS和网络的使用权限。 在获取用户位置时,优先使用GPS进行定位;如果GPS定位没有打开或者没有可用位置信息,则会通过判断网络是否连接(即确认手机是否能上网,不论是连接2G/3G或Wi-Fi网络),如果是,则通过请求百度网络定位服务,返回网络定位结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。 目前系统自带的网络定位服务精度低,且服务不稳定、精度低,并且从未来的趋势看,基站定位是不可控的(移动公司随时可能更改基站编号以垄断定位服务),而Wi-Fi定位则不然,它是一种精度更高、不受管制的定位方法。国内其它使用Wi-Fi定位的地图软件,Wi-Fi定位基本不可用,百度的定位服务量化指标优秀,网络接口返回速度快(服务端每次定位响应时间50毫秒以内),平均精度70米,其中Wi-Fi精度40米左右,基站定位精度200米左右,覆盖率98%,在国内处于一枝独秀的地位。 自2.0.0版本开始,MyLocationOverlay只负责显示我的位置,位置数据请使用百度定位SDK获取,将获取的位置数据放在一个LocationData结构中并用该结构设置MyLcationOverlay的数据源,即可创建MyLocationOverlay。 LocationData数据获取 创建监听器:当获取到位置信息时,将信息添加到LocationData中,监听器需要实现BDLocationListener接口, 两个方法需要实现: 1.接收异步返回的定位结果,参数是BDLocation类型参数。 2.接收异步返回的POI查询结果,参数是BDLocation类型参数。 监听的设置: 创建LocationClient对象,注册监听registerLocationListener 设置定位参数(LocationClientOption):定位模式(单次定位,定时定位),返回坐标类型,是否打开GPS等等。 通过LocationClient的start、stop控制定位信息获取,在做中间可以手动发起定位的请求requestLocation ————————————————————————————— 注意 关于经纬度的说明:该经纬度信息是经过加密处理,所以在其它地图工具中测得的经纬度 信息不适合百度的坐标系统。 使用百度经纬度坐标,可以通过http://api.map.baidu.com/lbsapi/getpoint/index.html查询地理坐标如果需要在百度地图上显示使用其他坐标系统的位置,请发邮件至mapapi@baidu.com申请坐标转换接口 http://developer.baidu.com/map/geosdk-android-developv3.3.htm option.setOpenGps(true); option.setAddrType("all");//返回的定位结果包含地址信息 option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02 option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms option.disableCache(true);//禁止启用缓存定位 option.setPoiNumber(5); //最多返回POI个数 option.setPoiDistance(1000); //poi查询距离 option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信 /** * 定位 * */ public class MyLocationOverlayDeom extends BaseActivity { public LocationClient mLocationClient = null; public BDLocationListener myListener = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initLocation(); } @Override protected void onResume() { mLocationClient.registerLocationListener(myListener); mLocationClient.requestLocation(); mLocationClient.start(); super.onResume(); } @Override ————————————————————————————— protected void onPause() { mLocationClient.unRegisterLocationListener(myListener); mLocationClient.stop(); super.onPause(); } private void initLocation() { //1.发起定位请求 mLocationClient = new LocationClient(this); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); option.setAddrType("all");//返回的定位结果包含地址信息 option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02 option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms option.disableCache(true);//禁止启用缓存定位 option.setPoiNumber(5); //最多返回POI个数 option.setPoiDistance(1000); //poi查询距离 option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息 mLocationClient.setLocOption(option); myListener = new MyListener(); mLocationClient.registerLocationListener(myListener); //2.显示结果 } class MyListener implements BDLocationListener{ @Override public void onReceiveLocation(BDLocation location) { if(location ==null) return; MyLocationOverlay locationOverlay = new MyLocationOverlay(mapView); LocationData arg0 = new LocationData(); arg0.longitude = location.getLongitude(); arg0.latitude = location.getLatitude(); locationOverlay.setData(arg0 ); ————————————————————————————— mapView.getOverlays().clear(); mapView.getOverlays().add(locationOverlay); mapView.refresh(); //地图移动 controller.animateTo(new GeoPoint((int)(arg0.longitude*1E6), (int)(arg0.latitude*1E6))); } @Override public void onReceivePoi(BDLocation poi) { } } } 离线地图 离线文件下载 http://shouji.baidu.com/map/map.html?from=3052,指定机型和城市下载对应的离线地图 2.0以上版本处理步骤 将下载好的离线地图包解压缩。 找到解压出的"BaiduMap"文件夹,把它放入手机存储卡根目录。在上述过程中如遇提示“是否需要覆盖文件”,点击确定即可。 断开与电脑连接,打开百度手机地图(如已打开请重启),系统会提示导入成功。 提示:下载多个城市包时,经解压后,这些城市数据都会被同时解压到 ————————————————————————————— BaiduMap文件夹中,不同城市不会出现被覆盖的情况。 1.X版本处理步骤 将离线地图加压,把Mapdata文件夹拷入SD卡根目录下的BaiduMapSdk下 利用MKOfflineMap在初始化(init)后调用scan()扫描本地地图资源 范例代码: /** 离线地图初始化 **/ mOffline = new MKOfflineMap(); mOffline.init(mBMapMan, new MKOfflineMapListener() { public void onGetOfflineMapState(int type, int state) { switch (type) { case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: { MKOLUpdateElement update = mOffline.getUpdateInfo(state); //mText.setText(String.format("%s : %d%%", update.cityName, update.ratio)); } break; case MKOfflineMap.TYPE_NEW_OFFLINE: Log.d("OfflineDemo", String.format("add offlinemap num:%d", state)); break; case MKOfflineMap.TYPE_VER_UPDATE: Log.d("OfflineDemo", String.format("new offlinemap ver")); break; } } } ); /** 离线地图导入离线包 **/ ————————————————————————————— int num = mOffline.scan(); 其它内容检索 地址解析服务 公交路线详细信息搜索 联想词检索 MKMapViewListener:地图显示事件监听器 onClickMapPoi(MapPoi mapPoiInfo) 点击到地图可点标注时会回调此接口,需要通过MapController. enableClick(true)控制点击的开关 onGetCurrentMap(Bitmap b) 截图成功后会回调此接口,应用场景,搜索线路,截图。 onMapAnimationFinish() 动画结束时会回调此消息 onMapMoveFinish() 地图移动完成时会回调此接口 通过MapView的 regMapViewListener(BMapManager bmapMan, MKMapViewListener listener) 注册监听器 截图 调用MapView.getCurrentMap(),在onGetCurrentMap(Bitmap b) 处理截图返回内容 演示搜索MKMapViewListener,大概看一下。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档