Android 百度地图用法
一、展示百度地图,并将一个指定的点(根据经纬度确定)展示在手机屏幕中心
1.下载百度地图移动版API(Android)开发包
要在Android应用中使用百度地图API,就要在工程中引入百度地图API开发包,这个开发宝宝含两个文件:baidumapapi.jar和libMapApiEngine.so
2.申请API KEY
3.创建一个Android工程
百度地图移动版api支持Android 1.5及以上系统,将baidumapapi.jar和libBMapApiEngine.so分别拷贝到工程的根目录及libs/armeabi目录下,并在工程属性->Java Build Path->Libraries中选择“Add JARs”,选定baidumapapi.jar,这样就可以在应用中使用百度地图API了。
4.在布局文件中添加地图控件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.baidu.mapapi.MapView
android:id="@+id/map_View" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </LinearLayout>
5.创建Activity继承com.baidu.mapapi.MapActivity
public class MainActivity extends MapActivity { private BMapManager mapManager; private MapView mapView; private MapController mapController; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 初始化MapActivity mapManager = new BMapManager(getApplication()); // init方法的第一个参数需填入申请的API Key mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null); super.initMapActivity(mapManager); mapView = (MapView) findViewById(R.id.map_View); // 设置地图模式为交通地图 mapView.setTraffic(true); // 设置启用内置的缩放控件 mapView.setBuiltInZoomControls(true); // 用给定的经纬度构造一个GeoPoint(纬度,经度) GeoPoint point = new GeoPoint((int) (47.118440 * 1E6), (int) (87.493147 * 1E6)); // 创建标记maker Drawable marker = this.getResources().getDrawable(R.drawable.iconmarka); // 为maker定义位置和边界 marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight()); // 取得地图控制器对象,用于控制MapView mapController = mapView.getController(); // 设置地图的中心 mapController.setCenter(point); // 设置地图默认的缩放级别 mapController.setZoom(12); } @Override protected boolean isRouteDisplayed() { return false; } @Override protected void onDestroy() { if (mapManager != null) { mapManager.destroy(); mapManager = null; } super.onDestroy(); } @Override protected void onPause() { if (mapManager != null) { mapManager.stop(); } super.onPause(); } @Override protected void onResume() { if (mapManager != null) { mapManager.start(); } super.onResume(); } }
6.在AndroidManifest.xml中设置
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.liufeng.baidumap" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".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> </application> <uses-sdk android:minSdkVersion="4" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> </manifest>
二、百度地图API之ItemizedOverlay的使用
Overlay简介
Overlay通常被译为“图层”或“覆盖物”,如标注、矢量图形元素(包括折现和多边形和圆)、定位图表等。覆盖物拥有自己的地理坐标,当拖动会所方地图时,他们会相应移动。
百度地图API提供了以下几种Overlay:
(1)Overlay:它是所有覆盖物的抽象基类,所有的覆盖物均继承此类的方法,实现用户自定义图层显示
(2)MyLocationOverlay:一个只负责显示用户当前位置的Overlay
(3)ItemizedOverlay:它包含了一个OverlayItem列表,相当于一组分条的Overlay,通过继承此类,将一组性缺点显示在地图上
(4)PoiOverlay:本地搜索图层,提供某一特定地区的搜索服务。例:在一个城市搜索“公园”,通过此图层将公园显示在图层上。
(5)RouteOverlay:步行、驾车导航线路图层。将步行、驾车出行方案的路线及关键点显示在地图上
(6)TransitOverlay:公交换乘线路图层
ItemizedOverlay的使用示例
ItemizedOverlay提供了一种快捷的方法,可以把标记图片和相关的文本分配给特定的地理位置。ItemizedOverlay实例可以处理每一个OverlayItem标记的绘制、放置、单击处理、焦点控制和布局优化。
res/layout/main_activity.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.baidu.mapapi.MapView android:id="@+id/map_View" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </LinearLayout>
MainActivity.java
public class MainActivity extends MapActivity { private BMapManager mapManager; private MapView mapView; private MapController mapController; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /** * 初始化MapActivity */ mapManager = new BMapManager(getApplication()); // init方法的第一个参数需填入申请的API Key mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null); super.initMapActivity(mapManager); mapView = (MapView) findViewById(R.id.map_View); // 设置地图模式为交通地图 mapView.setTraffic(true); // 设置启用内置的缩放控件 mapView.setBuiltInZoomControls(true); /** * 创建图标资源(用于显示在overlayItem所标记的位置) */ Drawable marker = this.getResources().getDrawable(R.drawable.ic_balloon); // 为maker定义位置和边界 marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight()); /** * 创建自定义的ItemizedOverlay */ CustomItemizedOverlay overlay = new CustomItemizedOverlay(marker, this); /** * 创建并添加第一个标记:地址(经度:80.235641 纬度:120.493147) */ // 构造一个经纬度点 GeoPoint point = new GeoPoint((int) (80.235641 * 1E6), (int) (120.493147 * 1E6)); // 创建标记(地址描述) OverlayItem overlayItem = new OverlayItem(point, "地址", "地址描述"); // 将标记添加到图层中(可添加多个OverlayItem) overlay.addOverlay(overlayItem); /** * 创建并添加第二个标记:地址1(经度:120.125648 纬度:80.123215) */ point = new GeoPoint((int) (120.125648 * 1E6), (int) (80.123215 * 1E6)); // 创建标记地址1 overlayItem = new OverlayItem(point, "地址1", "地址1描述"); // 将标记添加到图层中(可添加多个OverlayItem) overlay.addOverlay(overlayItem); /** * 往地图上添加自定义的ItemizedOverlay */ List<Overlay> mapOverlays = mapView.getOverlays(); mapOverlays.add(overlay); /** * 取得地图控制器对象,用于控制MapView */ mapController = mapView.getController(); // 设置地图的中心 mapController.setCenter(point); // 设置地图默认的缩放级别 mapController.setZoom(9); } @Override protected boolean isRouteDisplayed() { return false; } @Override protected void onDestroy() { if (mapManager != null) { mapManager.destroy(); mapManager = null; } super.onDestroy(); } @Override protected void onPause() { if (mapManager != null) { mapManager.stop(); } super.onPause(); } @Override protected void onResume() { if (mapManager != null) { mapManager.start(); } super.onResume(); } }
自定义ItemizedOverlay
public class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem> { private ArrayList<OverlayItem> overlayItemList = new ArrayList<OverlayItem>(); private Context context; public CustomItemizedOverlay(Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); } public CustomItemizedOverlay(Drawable marker, Context context) { super(boundCenterBottom(marker)); this.context = context; } @Override protected OverlayItem createItem(int i) { return overlayItemList.get(i); } @Override public int size() { return overlayItemList.size(); } public void addOverlay(OverlayItem overlayItem) { overlayItemList.add(overlayItem); this.populate(); } @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { super.draw(canvas, mapView, shadow); // Projection接口用于屏幕像素点坐标系统和地球表面经纬度点坐标系统之间的变换 Projection projection = mapView.getProjection(); // 遍历所有的OverlayItem for (int index = this.size() - 1; index >= 0; index--) { // 得到给定索引的item OverlayItem overLayItem = getItem(index); // 把经纬度变换到相对于MapView左上角的屏幕像素坐标 Point point = projection.toPixels(overLayItem.getPoint(), null); Paint paintText = new Paint(); paintText.setColor(Color.RED); paintText.setTextSize(13); // 绘制文本 canvas.drawText(overLayItem.getTitle(), point.x + 10, point.y - 15, paintText); } } @Override // 处理点击事件 protected boolean onTap(int i) { setFocus(overlayItemList.get(i)); Toast.makeText(this.context, overlayItemList.get(i).getSnippet(), Toast.LENGTH_SHORT).show(); return true; } }