zoukankan      html  css  js  c++  java
  • 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;  
        }  
    } 
  • 相关阅读:
    诺基亚e71收不到彩信的解决办法
    calloc(), malloc(), realloc(), free(),alloca()
    win7下移动硬盘不能安全删除的解决方法
    C语言指针总结
    复制和剪切到底谁快?
    IC设计流程
    请用真正的原版电驴(eMule)!VeryCD是假电驴!
    [置顶] 图片检索,船,古代, 三桅, 三角帆船,侧滑浆
    [置顶] "在证书存储区中找不到清单签名证书"问题分析以及解决方案
    [置顶] sql2008 用户映射问题
  • 原文地址:https://www.cnblogs.com/chhom/p/5311298.html
Copyright © 2011-2022 走看看