课1
百度地图应用
- 百度地图.ppt
百度地图API:API文档
67个类:其中6大核心类
六大核心类
>1.MapView
com.baidu.mapapi.map 类 MapView java.lang.Object 继承者 ViewGroup 继承者 com.baidu.mapapi.map.MapView public class MapView extends ViewGroup 显示地图的View。 一个显示地图的视图,当被焦点选中时,它能捕获按键事件和触摸手势去平移和缩放地图。
2.MapController
com.baidu.mapapi.map 类 MapController java.lang.Object 继承者 com.baidu.mapapi.map.MapController public class MapController extends Object 地图控制器
3.BMapManager
java.lang.Object 继承者 com.baidu.mapapi.BMapManager public class BMapManagerextends Object 地图引擎管理类
4.Overlay
com.baidu.mapapi.map 类 Overlay java.lang.Object 继承者 com.baidu.platform.comapi.map.Overlay 继承者 com.baidu.mapapi.map.Overlay 直接已知子类: GraphicsOverlay, ItemizedOverlay, MyLocationOverlay, PoiOverlay, PopupOverlay, TextOverlay public abstract class Overlayextends Overlay Overlay是一个基类,它表示可以显示在地图上方的覆盖物。 从2.0.0开始,SDK不支持直接继承Overlay , 用户可通过继承ItemizedOverlay来添加覆盖物。
5.MKSearch
java.lang.Object 继承者 com.baidu.mapapi.search.MKSearch public class MKSearch extends Object 搜索服务. 用于位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索
6.MKSearchListener
接口 MKSearchListener
public interface MKSearchListener
搜索结果通知接口。
该接口返回poi搜索,公交搜索,驾乘路线,步行路线结果
百度地图入门步骤
>获取APIKey
- 建立工程
- 图案家地图引擎到Android工程中
- 添加权限
- 初始化地图引擎
引入布局(地图控件)
案例:HelloWorld工程
>1、申请百度地图key:
http://developer.baidu.com/map/android-mobile-apply-key.htm (首先百度开放者账号)
Values.java
package com.itheima.constait; public interface Values { String key= "BFE6DAE8B029E5A2B2082D6B08D1C7220952CD8C"; }
2、新建工程HelloWorld
把百度地图key放在Values接口里的key里
3、把地图引擎添加到工程下:即把百度地图的jar包和armeabi里的so文件拷贝到工程目录下 4、把权限加载到清单文件里
<!-- gps --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- wifi --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 网络的权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 存储数据 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 获取手机信息 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
以下两步顺序不能错
MapView:地图展示类 MapController:控制地图:旋转 缩放 平移 BMapManager:地图引擎管理类key校验 在MainActivity里的initManager方法里初始化
6、引入布局
activity_main.xml里引入全路径的布局 com.baidu.mapapi.map.mapView控件 MainActivity里给mapView控件初始化 initView()方法:布局控制的显示:加载布局
百度地图项目:BDMaphm47
><?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima.helloworld" android:versionCode="1" android:versionName="1.0" > <!-- gps --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- wifi --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 网络的权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 存储数据 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 获取手机信息 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
<service android:name=”com.baidu.location.f” android:enabled=”true” android:process=”:remote”> </service><application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.itheima.helloworld.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.itheima.helloworld.GpsActivity"></activity> <activity android:name="com.itheima.helloworld.WalkingSearch"></activity> <activity android:name="com.itheima.helloworld.DrivingSearchActivity"></activity> <activity android:name="com.itheima.helloworld.TransitSearchActivity"></activity> <activity android:name="com.itheima.helloworld.CitySearchActivity"></activity> <activity android:name="com.itheima.helloworld.SearchNearByActivity"></activity> <activity android:name="com.itheima.helloworld.ItemizedOverlayActivity"></activity> <activity android:name="com.itheima.helloworld.GraphicsOverlayActivity"></activity> <activity android:name="com.itheima.helloworld.TextOverlayActivity"></activity> <activity android:name="com.itheima.helloworld.MapControlerActitivity"></activity> <activity android:name="com.itheima.helloworld.MyLocationActivity"></activity> <activity android:name="com.itheima.helloworld.LayerActivity"></activity>
</manifest></application>
MainActivity.java
public class MainActivity extends ListActivity { private ListView lv_items; private String[] items = new String[]{"地图控制","地图图层","文字覆盖","图形覆盖","多条目覆盖","半径检索","全城搜索","公交换乘","驾驶检索","步行检索","gps定位"}; private Class[] actions = new Class[]{MapControlerActitivity.class,LayerActivity.class,TextOverlayActivity.class,GraphicsOverlayActivity.class,ItemizedOverlayActivity.class,SearchNearByActivity.class,CitySearchActivity.class,TransitSearchActivity.class,DrivingSearchActivity.class,WalkingSearch.class,MyLocationActivity.class}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
}lv_items = getListView(); //setData(); //给listview设置数据 setData(); //设置点击事件 setEvent(); } private void setEvent() { // TODO Auto-generated method stub lv_items.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub Intent intent = new Intent(MainActivity.this,actions[position]); startActivity(intent); } }); } private void setData() { // TODO Auto-generated method stub ArrayAdapter<String> datas = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items); lv_items.setAdapter(datas); }
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"
</RelativeLayout>tools:context=".MainActivity" > <com.baidu.mapapi.map.MapView android:id="@+id/mv_view" android:layout_width="match_parent" android:layout_height="match_parent" />
BaseActivity.java
public class BaseActivity extends Activity { //搜索服务类 protected MKSearch mksearch; //地图展示类 protected MapView mapView; //地图引擎管理类 key校验 protected BMapManager mapManager; //控制地图 旋转 缩放 平移 protected MapController mapController; //113.927322,22.582866 int latitude = (int)22.582866E6; int longitudeE6 = (int)113.927322E6; protected GeoPoint centerszhm = new GeoPoint(latitude, longitudeE6); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); //以下两步顺序不能乱 //5,初始化引擎 initManager(); //6,布局显示 initView();
}} private void initView() { setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.mv_view); //设置是否启用内置的缩放控件。 mapView.setBuiltInZoomControls(true); mapController = mapView.getController(); //在给定的中心点GeoPoint上设置地图视图。 mapController.setCenter(centerszhm); //设置地图的缩放级别。 mapController.setZoom(15); //搜索到的兴趣点 点击 mapController.enableClick(true); //初始化搜索服务 mksearch = new MKSearch(); } /** * 初始化地图引擎 */ private void initManager() { // TODO Auto-generated method stub mapManager = new BMapManager(this); mapManager.init(Values.key, new MKGeneralListener() {//该接口返回网络状态,授权验证等结果,用户需要实现该接口以处理相应事件 /** * 权限的返回结果 */ @Override public void onGetPermissionState(int state) { if (state == MKEvent.ERROR_PERMISSION_DENIED){//失败 Toast.makeText(getApplicationContext(), "key校验失败", 0).show(); } } /** * 网络连接返回结果 */ @Override public void onGetNetworkState(int state) { if (state == MKEvent.ERROR_NETWORK_CONNECT){ Toast.makeText(getApplicationContext(), "没有网络", 0).show(); } } }); } /** * 把百度地图的生命周期和Activity生命周期绑定 */ @Override protected void onDestroy() { // TODO Auto-generated method stub mapView.destroy(); super.onDestroy(); } /** * 把百度地图的生命周期和Activity生命周期绑定 */ @Override protected void onPause() { // TODO Auto-generated method stub mapView.onPause(); super.onPause(); } /** * 把百度地图的生命周期和Activity生命周期绑定 */ @Override protected void onResume() { // TODO Auto-generated method stub mapView.onResume(); super.onResume(); } protected abstract class MKSearchAdapter implements MKSearchListener{ @Override public void onGetAddrResult(MKAddrInfo arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetPoiDetailSearchResult(int arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) { // TODO Auto-generated method stub } }
百度地图:控制地图的平移、缩放和旋转
>在initView()方法里增加setBuiltInZoomControls
![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img0.ph.126.net/wCgo4xKNsbYMhRWjN09JIg==/6608558563655556255.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)运行工程:效果如下:默认是北京![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img1.ph.126.net/NOklc5q1ZlJNRg51gCyG6Q==/6619080889933250575.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)怎么查看我们现在所在的火星坐标呢? 去网站里查我们所需的火星坐标。 ![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img0.ph.126.net/-eBS7ZoMWJg2t6Db9owOGQ==/6619430534630880570.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”) 在mapController里去设置坐标setCenter(坐标参数)方法 在使用mapController前首先获取该类的对象。该类时单例模式,所以使用api来获取对象 GeoPoint类的对象加载坐标,然后赋给mapController.setCenter(GeoPoint类的对象) 测试:![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img1.ph.126.net/iTigwoX3C1LKL9VKoHP9Ig==/6608570658283460551.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)缩放级别
v1.x 3 – 18
MapControlerActivity.java
/**
- 控制地图 平移 缩放 旋转
-
- @author Administrator
*/
public class MapControlerActitivity extends BaseActivity {@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_1:// 1 放大地图
mapController.zoomIn();
break;
case KeyEvent.KEYCODE_2:// 2 缩小地图
mapController.zoomOut();
break;case KeyEvent.KEYCODE_3:// 3 平面旋转(0到360) int mapRotation = mapView.getMapRotation();//获取当前mapview的平面角度 System.out.println("mapRotation:" + mapRotation); mapController.setRotation(mapRotation + 30); break; case KeyEvent.KEYCODE_4:// 4俯视旋转(-45到0) int mapOverlooking = mapView.getMapOverlooking(); //获取当前mapview的俯视角度 System.out.println("mapOverlooking:" + mapOverlooking); mapController.setOverlooking(mapOverlooking - 5); break; case KeyEvent.KEYCODE_5:// 5 平移 //113.980861,22.540062 int latitude = (int)22.540062E6; int longitudeE6 = (int)113.980861E6; GeoPoint sjzc = new GeoPoint(latitude, longitudeE6); mapController.animateTo(sjzc); break; default: break; } return super.onKeyDown(keyCode, event);
}
地图的图层:交通图、卫星图
>交通图、卫星图
LayerActivity.java
public class LayerActivity extends BaseActivity {
}@Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub switch (keyCode) { case KeyEvent.KEYCODE_7:// 地图 mapView.setTraffic(false); mapView.setSatellite(false); break; case KeyEvent.KEYCODE_8:// 卫星地图 mapView.setTraffic(false); mapView.setSatellite(true); break; case KeyEvent.KEYCODE_9:// 交通地图 mapView.setTraffic(true); mapView.setSatellite(false); break; default: break; } return super.onKeyDown(keyCode, event); }
![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img1.ph.126.net/iTigwoX3C1LKL9VKoHP9Ig==/6608570658283460551.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)地图![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img2.ph.126.net/X2NOkIQKf2e2utv0VG49OA==/6608470602725333042.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)交通图![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img2.ph.126.net/spd8_EtexZlJRVwAGyidUg==/3362500071886556450.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)卫星图百度地图:覆盖物
> Overlay类来给百度地图增强显示效果com.baidu.mapapi.map
TextOverlayActivity.java使用TextOverLay类
TextOverlayActivity.java
/**
- 文字覆盖
-
- @author Administrator
*/
public class TextOverlayActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
// 文字覆盖
textOverlay();
}private void textOverlay() {
/*
* 添加文字标注的一般流程:
* 1. 用TextItem准备文字数据
* 2. 创建TextOverlay,调用 addText(TextItem)接口添加文字.
* 3. 调用MapView.getOverlays().add()方法添加overlay到mapview中。
* 4. 调用MapView.refresh() 使Overlay生效。
*/// 1. 用TextItem准备文字数据 TextItem textItem = new TextItem(); /* 字段摘要 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.align = TextItem.ALIGN_CENTER; Symbol.Color color = new Symbol().new Color(); color.red = 255; color.alpha = 255; color.blue = 0; color.green = 0; textItem.fontColor = color; textItem.fontSize = 20; textItem.pt = centerszhm;//文字显示的坐标位置 textItem.text = "黑马深圳中心"; //2. 创建TextOverlay,调用 addText(TextItem)接口添加文字. TextOverlay textOverlay = new TextOverlay(mapView); textOverlay.addText(textItem); //3 调用MapView.getOverlays().add()方法添加overlay到mapview中 mapView.getOverlays().add(textOverlay); //4 调用MapView.refresh() 使Overlay生效 mapView.refresh();
}
}
![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img1.ph.126.net/tiQFR3GgelMAdvu_PI6XZw==/980377343900660521.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)> 图形覆盖功能展示:GraphicsOverlay类GraphicsOverlayActivity.java使用GraphicsOverlay类
GraphicsOverlayActivity.java
/**
- 图形覆盖
@author Administrator
*
*/
public class GraphicsOverlayActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//初始化图形覆盖
wuStar();
//initGraphics();
}private void initGraphics() {
//1,数据 Graphic
Geometry g = new Geometry() ;
/*
* public void setCircle(GeoPoint geoPoint,
int radius)
设置图形为圆参数:geoPoint - 地理坐标radius - 圆的半径,单位:米 */ g.setCircle(centerszhm, 1000); Symbol s = new Symbol(); /* * public void setSurface(Symbol.Color color, int status, int linewidth) 设置面样式 参数:color - 颜色status - 填充状态,0表示不填充,1表示填充linewidth - 线宽,当填充状态为填充时线宽无意义 */ Symbol.Color color = new Symbol().new Color(); color.red = 255; color.alpha = 100; color.blue = 0; color.green = 0; s.setSurface(color, 1, 1); Graphic graphics = new Graphic(g, s) ; //2 给overlay设置数据 GraphicsOverlay overlay = new GraphicsOverlay(mapView); overlay.setData(graphics); //3 把overlay加到mapView中 mapView.getOverlays().add(overlay); //4,刷新 mapView.refresh();
}
/**
绘制图形为填充多边形 五角星
*/
private void wuStar() {
//1 创建Overlay
GraphicsOverlay overlay = new GraphicsOverlay(mapView);
Geometry geo = new Geometry();
int la = this.latitude;
int lg = this.longitudeE6;
GeoPoint[] points = new GeoPoint[10];
int R = 5000;//外圆半径
double r = (R*Math.sin(18*Math.PI/180)/Math.cos(36*Math.PI/180));//内圆半径
//确定五角星十个坐标点
points[9] = new GeoPoint(la + R, lg);
points[0] = new GeoPoint((int) (la + r*Math.cos(36*Math.PI/180)), (int) (lg + r*Math.sin(36*Math.PI/180)));
points[1] = new GeoPoint((int) (la + R*Math.sin(18*Math.PI/180)), (int) (lg + R*Math.cos(18*Math.PI/180)));
points[2] = new GeoPoint((int) (la - r*Math.sin(18*Math.PI/180)), (int) (lg + r*Math.cos(18*Math.PI/180)));
points[3] = new GeoPoint((int) (la - R*Math.sin(54*Math.PI/180)), (int) (lg + R*Math.cos(54*Math.PI/180)));
points[4] = new GeoPoint((int) (la - r), lg);
points[5] = new GeoPoint((int) (la - R*Math.sin(54*Math.PI/180)), (int) (lg - R*Math.cos(54*Math.PI/180)));
points[6] = new GeoPoint((int) (la - r*Math.sin(18*Math.PI/180)), (int) (lg - r*Math.cos(18*Math.PI/180)));
points[7] = new GeoPoint((int) (la + R*Math.sin(18*Math.PI/180)), (int) (lg - R*Math.cos(18*Math.PI/180)));
points[8] = new GeoPoint((int) (la + r*Math.cos(36*Math.PI/180)), (int) (lg - r*Math.sin(36*Math.PI/180)));
geo.setPolygon(points);Symbol symbol = new Symbol();
Symbol.Color color = new Symbol().new Color();
color.red = 255;
color.green = 0;
color.blue = 0;
color.alpha = 100;
symbol.setSurface(color, 1, 1);
Graphic g = new Graphic(geo, symbol) ;
overlay.setData(g);
//2,加覆盖物
mapView.getOverlays().add(overlay);
//3,刷新
mapView.refresh();
}
![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img0.ph.126.net/mFvm9rAd7DggP-Cs7frdDA==/6608449712004404133.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)/**
- 多条目覆盖
@author Administrator
*
*/
public class ItemizedOverlayActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//初始化数据
itemizedData();
} private TextView tv_title; private View view; private void addPop() { // TODO Auto-generated method stub view = View.inflate(this, R.layout.items, null); tv_title = (TextView) view.findViewById(R.id.title); //MapView.LayoutParams(int width, int height, GeoPoint point, int alignment) MapView.LayoutParams params = new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, com.baidu.mapapi.map.MapView.LayoutParams.WRAP_CONTENT,centerszhm,com.baidu.mapapi.map.MapView.LayoutParams.BOTTOM_CENTER); mapView.addView(view, params); view.setVisibility(View.INVISIBLE); } private void itemizedData() { /*添加覆盖物的一般流程: 1. 用OverlayItem 准备overlay数据。 2. 创建ItemizedOverlay实例,调用 addItem(OverlayItem) 接口添加overlay. 3. 若一次性添加的overlay数据较多,可以使用 addItem(List) 接口. 3. 调用MapView.getOverlays().add()方法添加overlay到mapview中。 4. 调用MapView.refresh() 使Overlay生效。*/ //1. 用OverlayItem 准备overlay数据。 final List<OverlayItem> items = new ArrayList<OverlayItem>();//显示泡泡 addPop();
} }{ GeoPoint center = new GeoPoint(latitude, longitudeE6); OverlayItem item = new OverlayItem(center, "深圳黑马", "高薪就业,满足愿望,找个好对象"); items.add(item); } { GeoPoint center = new GeoPoint(latitude + 3000, longitudeE6 + 3000); OverlayItem item = new OverlayItem(center, "深圳黑马东北", "高薪就业,满足愿望,找个好对象"); items.add(item); } { GeoPoint center = new GeoPoint(latitude + 3000, longitudeE6 - 3000); OverlayItem item = new OverlayItem(center, "深圳黑马西北", "高薪就业,满足愿望,找个好对象"); items.add(item); } { GeoPoint center = new GeoPoint(latitude - 3000, longitudeE6 + 3000); OverlayItem item = new OverlayItem(center, "深圳黑马东南", "高薪就业,满足愿望,找个好对象"); items.add(item); } { GeoPoint center = new GeoPoint(latitude - 3000, longitudeE6 - 3000);; OverlayItem item = new OverlayItem(center, "深圳黑马西南", "高薪就业,满足愿望,找个好对象"); items.add(item); } // 2. 创建ItemizedOverlay实例,调用 addItem(OverlayItem) 接口添加overlay. ItemizedOverlay overlay = new ItemizedOverlay(getResources().getDrawable(R.drawable.eat_icon), mapView){ @Override public boolean onTap(int index) { System.out.println("index:" + index); OverlayItem item = items.get(index); tv_title.setText(item.getTitle()); GeoPoint point = item.getPoint(); MapView.LayoutParams params = new MapView.LayoutParams(LayoutParams.WRAP_CONTENT, com.baidu.mapapi.map.MapView.LayoutParams.WRAP_CONTENT,point,com.baidu.mapapi.map.MapView.LayoutParams.BOTTOM_CENTER); mapView.updateViewLayout(view, params); view.setVisibility(View.VISIBLE); return super.onTap(index); } }; overlay.addItem(items); //3. 调用MapView.getOverlays().add()方法添加overlay到mapview中 mapView.getOverlays().add(overlay); //4. mapView.refresh();
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingBottom="0dip" ></LinearLayout><LinearLayout android:id="@+id/user_info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/popupmap" android:orientation="horizontal" android:gravity="center_vertical" android:layout_marginBottom="20dip" > <ImageView android:id="@+id/round" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="2dip" android:src="@drawable/round" /> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="end" android:text="标题" android:textSize="20sp" /> <ImageView android:id="@+id/roads" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/roads" /> </LinearLayout>
百度地图:搜索
>
MKSearch类来给百度地图实现搜索服务,配合第六大核心类MKSearchListener类(监听回调),还有在搜索的返回结果里结合覆盖物类overLay的子类集去展示搜索结果,并加上分页(分页显示搜索结果) 搜索服务的使用攻略,在搜索服务类MKSearch 类里,其搜索服务涉及:
搜索服务. 用于位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索
每种服务所使用的方法都不一样:但是每种服务使用的流程都差不多:
1、使用具体服务的方法:> 半径搜索(兴趣点检索) BaseActivity.java里初始化MKSearch类,并在里面给mapController增加兴趣点覆盖物的点击事件 //该半径搜索类里的兴趣点检索实现了分页的查询! SearchNearByActivity.java2、然后为MKSearch 类的对象进行初始化,并给初始化init方法里的参数接口进行实现操作 (MKSearchListener),该接口的实现方法作用是:poiSearchNearBy(String key, GeoPoint pt, int radius) 根据中心点、半径与检索词发起周边检索.
3、实现接口里对应的方法去监听具体服务的方法的结果值,例如:搜索结果通知接口。 该接口返回poi搜索,公交搜索,驾乘路线,步行路线结果
onGetPoiResult(MKPoiResult result, int type, int iError) 返回poi搜索结果 该实现方法用于处理poiSearchNearBy(String key, GeoPoint pt, int radius)返回的结果值
/**
- 半径检索
@author Administrator
*
*/
public class SearchNearByActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
nearbySearch();
}private void nearbySearch() {
// 处理搜索结果
mksearch.init(mapManager, new MKSearchAdapter(){
@Override
public void onGetPoiResult(MKPoiResult result, int type,
int iError) {if (iError == 0 && result != null){//有搜索信息 // 1,result.数据 totalPage = result.getNumPages();//获取总页数 每页显示10条数据 System.out.println("totalPage:" + totalPage); currentPage = result.getPageIndex();//获取当前页 System.out.println("currentPage:" + currentPage); ArrayList<MKPoiInfo> allPoi = result.getAllPoi();// 10条 // 2. overlay PoiOverlay overlay = new PoiOverlay(SearchNearByActivity.this, mapView); overlay.setData(allPoi); // 3. mapview add overlay //把之前的分页结果清空 mapView.getOverlays().clear(); mapView.getOverlays().add(overlay); // 4. flash mapView.refresh(); } else { } } }); //发起搜索 mksearch.poiSearchNearBy("电影院", centerszhm, 20000);
}
int totalPage;
int currentPage;
//分页的操作@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
switch (keyCode) {
case KeyEvent.KEYCODE_5: // 下一页
currentPage = ++currentPage % totalPage;
//跳转到下一页
mksearch.goToPoiPage(currentPage);
break;
case KeyEvent.KEYCODE_6: // 上一页
currentPage – ;
if (currentPage < 0){
currentPage = 0;
Toast.makeText(getApplicationContext(), “已经第一页”, 0).show();
}
mksearch.goToPoiPage(currentPage);
break;default: break; } return super.onKeyDown(keyCode, event);
}
CitySearchActivity.java全城搜索(兴趣点检索)
/**
- 半径检索
@author Administrator
*
*/
public class CitySearchActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
nearbySearch();
}private void nearbySearch() {
// 处理搜索结果
mksearch.init(mapManager, new MKSearchAdapter(){
@Override
public void onGetPoiResult(MKPoiResult result, int type,
int iError) {if (iError == 0 && result != null){//有搜索信息 // 1,result.数据 totalPage = result.getNumPages();//获取总页数 每页显示10条数据 System.out.println("totalPage:" + totalPage); currentPage = result.getPageIndex();//获取当前页 System.out.println("currentPage:" + currentPage); ArrayList<MKPoiInfo> allPoi = result.getAllPoi();// 10条 // 2. overlay PoiOverlay overlay = new PoiOverlay(CitySearchActivity.this, mapView); overlay.setData(allPoi); // 3. mapview add overlay mapView.getOverlays().clear(); mapView.getOverlays().add(overlay); // 4. flash mapView.refresh(); } else { } } }); //发起搜索 mksearch.poiSearchInCity("深圳", "电影院");//("电影院", centerszhm, 20000);
}
int totalPage;
int currentPage;
//分页的操作@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
switch (keyCode) {
case KeyEvent.KEYCODE_5: // 下一页
currentPage = ++currentPage % totalPage;
//跳转到下一页
mksearch.goToPoiPage(currentPage);
break;
case KeyEvent.KEYCODE_6: // 上一页
currentPage – ;
if (currentPage < 0){
currentPage = 0;
Toast.makeText(getApplicationContext(), “已经第一页”, 0).show();
}
mksearch.goToPoiPage(currentPage);
break;default: break; } return super.onKeyDown(keyCode, event);
}
配合TransitOverlay类来显示搜索的结果 TransitSearchActivity.java公交路线的检索
/**
- 公交换乘
@author Administrator
*
*/
public class TransitSearchActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//公交换乘检索
transitsearch();
}private void transitsearch() {
mksearch.init(mapManager, new MKSearchAdapter() {
@Override
public void onGetTransitRouteResult(MKTransitRouteResult result,
int iError) {
//获取数据 显示在mapview上
if (iError == 0 && result != null) { //有搜索结果
//1,数据
MKTransitRoutePlan plan = result.getPlan(0);
//2,overlay
TransitOverlay overlay = new TransitOverlay(TransitSearchActivity.this ,mapView);
overlay.setData(plan);
//3 mapview add overlay
mapView.getOverlays().add(overlay);
//4 flush
mapView.refresh();
}} }); /* * city - 城市名,用于在哪个城市内进行检索(必须填写) * start - 检索的起点,可通过关键字,坐标,两种方式指定 * end - 检索的终点,可通过关键字,坐标,两种方式指定 */ MKPlanNode start = new MKPlanNode(); start.name = "罗湖火车站"; MKPlanNode end = new MKPlanNode(); end.name = "世界之窗"; //设置搜索策略 mksearch.setTransitPolicy(MKSearch.EBUS_NO_SUBWAY); mksearch.transitSearch("深圳", start, end);
}
配合RouteOverlay类来显示搜索的结果 DrivingSearchActivity.java驾车路线的搜索
/**
- 驾驶检索
@author Administrator
*
*/
public class DrivingSearchActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//驾驶
driver();
}private void driver() {
mksearch.init(mapManager, new MKSearchAdapter() {
@Override
public void onGetDrivingRouteResult(MKDrivingRouteResult result,
int iError) {
if (iError == 0 && result != null){//1 获取数据 MKRoutePlan plan = result.getPlan(0); //2 创建overlay 设置数据 RouteOverlay overlay = new RouteOverlay(DrivingSearchActivity.this,mapView); overlay.setData(plan.getRoute(0)); //3 mapview add overlay mapView.getOverlays().add(overlay); //4 flush mapView.refresh(); } } }); /** * startCity - 起点所在城市,起点为坐标时可不填 * start - 搜索的起点,可以为坐标,名称任一种 * endCity - 终点所在城市,终点为坐标时可不填 * end - 搜索的终点,可以为坐标,名称任一种 */ MKPlanNode start = new MKPlanNode(); start.pt = centerszhm; MKPlanNode end = new MKPlanNode(); end.name = "罗湖火车站"; ArrayList<MKWpNode> datas = new ArrayList<MKWpNode>(); MKWpNode node = new MKWpNode(); node.city = "深圳"; node.name = "红树林"; datas.add(node); mksearch.drivingSearch("深圳", start, "深圳", end,datas) ;
}
}
配合RouteOverlay类来显示搜索的结果 WalkingSearchActivity.java步行路线的检索
/**
- 步行路线检索
@author Administrator
*
*/
public class WalkingSearch extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
walk();
}
// 步行检索
private void walk() {
// TODO Auto-generated method stub
mksearch.init(mapManager, new MKSearchAdapter() {
@Override
public void onGetWalkingRouteResult(MKWalkingRouteResult result,
int iError) {
//1 数据
MKRoutePlan plan = result.getPlan(0);
//2 创建overlay 设置数据
RouteOverlay overlay = new RouteOverlay(WalkingSearch.this,mapView);overlay.setData(plan.getRoute(0)); //3 mapview add overlay mapView.getOverlays().add(overlay); //4 flush mapView.refresh(); } });
/* startCity - 起点所在城市,起点为坐标时可不填
- start - 搜索的起点,可以为坐标,名称任一种
- endCity - 终点所在城市,终点为坐标时可不填
- end - 搜索的终点,可以为坐标,名称任一种*/
MKPlanNode start = new MKPlanNode();
start.pt = centerszhm;
MKPlanNode end = new MKPlanNode();
end.name = “世界之窗”;
mksearch.walkingSearch(“深圳”, start, “深圳”, end);
}
}
百度地图:定位
>
定位技术的说明
在百度地图移动版API中,提供一个重要的特色功能:定位,通过这个功能,能获取到用户当前所在位置。 在程序中,如果使用此功能,必须注册GPS和网络的使用权限。 在获取用户位置时,优先使用GPS进行定位;如果GPS定位没有打开或者没有可用位置信息,则会通过判断网络是否连接(即确认手机是否能上网,不论是连接2G/3G或Wi-Fi网络),如果是,则通过请求百度网络定位服务,返回网络定位结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。 目前系统自带的网络定位服务精度低,且服务不稳定、精度低,并且从未来的趋势看,基站定位是不可控的(移动公司随时可能更改基站编号以垄断定位服务),而Wi-Fi定位则不然,它是一种精度更高、不受管制的定位方法。国内其它使用Wi-Fi定位的地图软件,Wi-Fi定位基本不可用,百度的定位服务量化指标优秀,网络接口返回速度快(服务端每次定位响应时间50毫秒以内),平均精度70米,其中Wi-Fi精度40米左右,基站定位精度200米左右,覆盖率98%,在国内处于一枝独秀的地位。 注意 关于经纬度的说明:该经纬度信息是经过加密处理,所以在其它地图工具中测得的经纬度 信息不适合百度的坐标系统。 使用百度经纬度坐标,可以通过http://api.map.baidu.com/lbsapi/getpoint/index.html查询地理坐标如果需要在百度地图上显示使用其他坐标系统的位置,请发邮件至mapapi@baidu.com申请坐标转换接口 http://developer.baidu.com/map/geosdk-android-developv3.3.htm
1、首先配置清单文件
2、MyLocationActivity.java
3、设置定位的图层MyLocationOverlay类
MyLocationActivity.java
public class MyLocationActivity extends BaseActivity { public LocationClient mLocationClient = null;public BDLocationListener myListener = new MyLocationListener(); private class MyLocationListener implements BDLocationListener{ //获取位置 @Override public void onReceiveLocation(BDLocation location) { double latitude = location.getLatitude();//纬度 double longitude = location.getLongitude();//经度 System.out.println("latitude:" + latitude); System.out.println("longitude:" + longitude); MyLocationOverlay overlay = new MyLocationOverlay(mapView); LocationData data = new LocationData(); data.latitude = latitude ; data.longitude = longitude; overlay.setData(data); mapView.getOverlays().add(overlay); mapView.refresh(); mapController.animateTo(new GeoPoint((int)(latitude*1E6), (int)(longitude*1E6))); } @Override public void onReceivePoi(BDLocation location) { // TODO Auto-generated method stub } } @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); startLocation(); } private void startLocation() { // TODO Auto-generated method stub mLocationClient = new LocationClient(this); mLocationClient.registerLocationListener( new BDLocationListener(){ //获取位置 @Override public void onReceiveLocation(BDLocation location) { double latitude = location.getLatitude();//纬度 double longitude = location.getLongitude();//经度 System.out.println("latitude:" + latitude); System.out.println("longitude:" + longitude); MyLocationOverlay overlay = new MyLocationOverlay(mapView); LocationData data = new LocationData(); data.latitude = latitude ; data.longitude = longitude; overlay.setData(data); mapView.getOverlays().add(overlay); mapView.refresh(); mapController.animateTo(new GeoPoint((int)(latitude*1E6), (int)(longitude*1E6))); } @Override public void onReceivePoi(BDLocation location) { // TODO Auto-generated method stub } } ); //设置参数 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); //发起定位请求 mLocationClient.requestLocation(); System.out.println("发起定位请求"); } @Override protected void onPause() { // TODO Auto-generated method stub mLocationClient.stop(); super.onPause(); } @Override protected void onResume() { // TODO Auto-generated method stub mLocationClient.start(); super.onResume(); }
}
![Android百度地图API使用教程 - faith_yee - faith_yee的博客](http://img2.ph.126.net/A2AxMbcZdj8s2lVwNIvEWA==/2452491472097397392.png “Android百度地图API使用教程 - faith_yee - faith_yee的博客”)