安卓---项目中插入百度地图sdk

来源:互联网 发布:室内设计装修软件 编辑:程序博客网 时间:2024/06/05 05:04

百度地图

应用里面 自带地图 搜房网

  1. 下载百度地图的sdk 熟悉api 注册百度开发者的账号
  2. 2.12 只要有一个ak就可以 高版本需要提供应用程序的包名和签名返回开发者的序列号

使用百度地图步骤

  1. 申请api key
  2. 创建工程
  3. 引用函数库 armeabi 只能兼容arme cpu
  4. 联网权限
  5. 初始化地图引擎 (2.13 在代码中初始化, 高版本在清单文件中配置)
  6. 引用布局

MapView 显示地图 V

继承ViewGroup 自定义控件 专门用来显示地图

1. MapController    getController()   获取到地图的控制器 2.  让mapView的生命周期 必须和anctivity绑死在一起  onResume onPause destroy3.  setBuiltInZoomControls(boolean on)   设置是否启用内置的缩放控件回调 MKMapViewListener

BMapManager M

可以初始化地图引擎

1. destroy()  当程序退出的时候调用2. start()  当程序可见的时候调用3. stop()  当程序不可见的时候调用 4. init(String strKey, MKGeneralListener listener) 方法校验key信息, 回调

MapController 地图控制器 C

专门控制地图的操作

1. animateTo(GeoPoint point)   移动到指定位置2. setCenter(GeoPoint point)  在给定的中心点GeoPoint上设置地图视图。3. setZoom(float zoomLevel)  设置地图的缩放级别4.  缩放5.  旋转6.  修改俯视角度

图层

1. 卫星图层 mapView.setSatellite(true); 2. 交通图层 mapView.setTraffic(true);

覆盖物

覆盖物包括:    覆盖物的抽象基类: Overlay(核心类)    几何图形: GraphicsOverlay    文字: TextOverlay    分类条目: ItemizedOverlay    本地搜索: PoiOverlay    路线规划: RouteOverlay    换成路线: TransitOverlay    我的位置: MyLocationOverlay步骤:    * 1.获取到地图上的覆盖物        List<Overlay> overlays = mapView.getOverlays();    * 2.创建新的覆盖物           几何GraphicsOverlay, 文字TextOverlay, 多条目(下面具体实现)    * 3.拿到地图上的覆盖物 添加新的覆盖物        overlays.add(overlay);    * 4.刷新地图         mapView.refresh();* GraphicsOverlay:    GraphicsOverlay  overlay = new GraphicsOverlay(mapView);    // 描述一个集合图形    Geometry arg0=new Geometry();  // 图形的形状      arg0.setCircle(point, 1000);  //参数1,圆心  参数2,半径 单位(米)    Symbol arg1 = new Symbol();  //图形的样式    Symbol.Color color = new Symbol().new Color();    color.alpha=155;    color.red=100;    color.blue=200;    color.green=0;    //  设置图形的样式    arg1.setSurface(color, 1, 1);    Graphic graphic=new Graphic(arg0, arg1);    // 绘制    overlay.setData(graphic);* TextOverlay     TextOverlay overlay=new TextOverlay(mapView);    // 绘制    TextItem item=new TextItem();    item.align=TextItem.ALIGN_CENTER;// 居中对齐    item.pt=point;// 让文字显示在黑马这个位置     item.fontSize=14;    item.fontColor=getColor();    item.text="黑马程序员";    overlay.addText(item);* ItemizedOverlay    ItemizedOverlay<OverlayItem> itemizedOverlay = new ItemizedOverlay<OverlayItem>(                getResources().getDrawable(R.drawable.eat_icon), mapView) {        //条目的点击事件!!!        @Override        protected boolean onTap(int index) {            OverlayItem item = getItem(index);            GeoPoint point = item.getPoint();            //更新view气泡的的位置(之前已经初始化)            mapView.updateViewLayout(pop, new MapView.LayoutParams(                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,                    point, MapView.LayoutParams.BOTTOM_CENTER));            pop.setVisibility(View.VISIBLE);// 让气泡显示出来            TextView tv=(TextView) pop.findViewById(R.id.title);            tv.setText(item.getTitle());                // String snippet = item.getSnippet();//得到描述信息                // Toast.makeText(getApplicationContext(), snippet, 0).show();            return true;//表示消费掉了        }    };    OverlayItem item = new OverlayItem(point, "黑马程序员", "不10000就业不交一分钱学费");// 1坐标点 2 标题 3 描述    itemizedOverlay.addItem(item);    item = new OverlayItem(new GeoPoint(latitude + 1000, longitude), "向北",            "增加纬度");    itemizedOverlay.addItem(item);    item = new OverlayItem(new GeoPoint(latitude, longitude + 1000), "向东",            "增加经度");    itemizedOverlay.addItem(item);    item = new OverlayItem(new GeoPoint(latitude - 1000, longitude - 1000),            "向西南", "减少经纬度");    itemizedOverlay.addItem(item);    // 步骤3    overlays.add(itemizedOverlay);    // 步骤4    mapView.refresh();* PoiOverlay: 搜索后显示本地覆盖物, 如下.* RouteOverlay: 驾车路线搜索后显示路线, 如下.* TransitOverlay: 公交换乘路线显示, 如下.* MyLocationOverlay: 我的位置覆盖物, 如下.

搜索

* 核心类: MKSearch和MKSearchListener    1. MKSearch  搜索的api  用于位置检索/周边检索/公交检索/范围检索/驾乘检索/步行检索    2. MKSearchListener 搜素结构 会回调到该接口里的方法 * 矩形/圆形/全城区域内 搜索比较兴趣点    MKSearch search = new MKSearch();    search.init(manager,MKSearchListener)//由于此接口的方法特别多, 此处可以使用适配器设计模式    //第一个参数:关键字(如宾馆)  第二个参数(左上角的点)    第三个参数(右下角的点)    1. search.poiSearchInbounds(String key, GeoPoint ptLB, GeoPoint ptRT)  矩形区域搜索    2. search.poiSearchNearBy(String key, GeoPoint pt, int radius)   圆形区域搜素    3. search.poiSearchInCity("北京", "麦当劳");        search.goToPoiPage(index);//显示下一页(一页显示10条)    在MKSearchListener里的onGetPoiResult()中回调.    public void onGetPoiResult(MKPoiResult result, int type, int iError) {        if(iError==0){            // 有结果            //  把结果绘制到手机屏幕(地图)上            // 步骤1  获取到所有的覆盖物            List<Overlay> overlays = mapView.getOverlays();            //步骤2 创建信的覆盖物            PoiOverlay overlay=new PoiOverlay(SearchInRectActivity.this, mapView);            ArrayList<MKPoiInfo> allPoi = result.getAllPoi();            overlay.setData(allPoi);            //  步骤3  把覆盖物添加到之前的覆盖物的集合上            overlays.add(overlay);            //步骤4  刷新界面             mapView.refresh();        }    }* 驾车/公交/步行路线搜索    // 1 开始的城市  2开始位置  3目的地城市  4目的地坐标    1.search.drivingSearch(String startCity, MKPlanNode start, String endCity, MKPlanNode end) //驾车    2.search.transitSearch(String startCity, MKPlanNode start, MKPlanNode end);//公交    3.search.walkingSearch(String startCity, MKPlanNode start, MKPlanNode end);//步行    //在MKSearchListener里的onGetDrivingRouteResult中回调.    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        MKSearch search=new MKSearch();        search.init(manager, new BusAdapter());        MKPlanNode start=new MKPlanNode();//地点: 包括位置和名字        start.pt=point;        MKPlanNode end=new MKPlanNode();        end.pt=new GeoPoint(40065796, 116349868);        search.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);// 设置开车的方案        search.drivingSearch("北京", start, "北京", end);//驾车(方式1)        search.setTransitPolicy(MKSearch.EBUS_WALK_FIRST);        search.transitSearch("北京", start, end);  //公交(方式2)        search.walkingSearch("北京", start, end); //步行(方式3)    }    private class BusAdapter  extends MKSearchAdapter{        @Override        public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {            if(iError==0){                //此处只显示了公交的回调, 驾车和步行没写, 详细见项目.                // 公交的方案                MKTransitRoutePlan plan = result.getPlan(0);                List<Overlay> overlays = mapView.getOverlays();                TransitOverlay overlay=new TransitOverlay(BusActivity.this, mapView);                overlay.setData(plan);                overlays.add(overlay);                mapView.refresh();            }        }    }

定位:

* 定位的方式      1. gps    2. wifi    3. 基站 * 系统原生定位:    //调用的是谷歌的API, 火星坐标, 不准确.    LocationManager lm = (LocationManager)getSystemService(LOCATION_SERVICE);* 百度地图定位:    需要: liblocSDK.so    locSDK.jar    核心API: LocationClient(LocationClientOption)    BDLocationListener    public class MyLocationActivity 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); // 注册监听函数            LocationClientOption option = new LocationClientOption();            option.setOpenGps(true); // 打开GPS            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);        }        @Override        protected void onStart() {            super.onStart();            mLocationClient.start();            if(mLocationClient!=null &&mLocationClient.isStarted()){                mLocationClient.requestLocation();// 请求定位的位置            }        }        @Override        protected void onStop() {            super.onStop();            mLocationClient.stop();        }        public class MyLocationListener implements BDLocationListener {            // 接受到了定位的位置            @Override            public void onReceiveLocation(BDLocation location) {                double latitude2 = location.getLatitude();                double longitude2 = location.getLongitude();                Toast.makeText(getApplicationContext(), latitude2+"..."+longitude2, 0).show();                MyLocationOverlay overlay=new MyLocationOverlay(mapView);                LocationData data=new LocationData();                data.latitude=latitude2;                data.longitude=longitude2;                overlay.setData(data);                mapView.getOverlays().add(overlay);                mapView.refresh();            }            // 接受到了 周围的兴趣点            @Override            public void onReceivePoi(BDLocation arg0) {            }        }    }
3 0