0922Android基础百度地图

生成自己工程的秘钥

  Build —Genrate Signed APK,创建成功后即有签名的apk
  
这里写图片描述

这里写图片描述

  生成key值的集合
  
这里写图片描述

  生成的key
  
这里写图片描述

申请秘钥

  http://developer.baidu.com/map/index.php?title=androidsdk/guide/key

配置环境

  一个是java的jar包,放置在libs文件夹下,然后导入进去

这里写图片描述

  导入,右键项目选择Open Module Settings选中该mudule,选中该对话框顶栏中的dependences,然后点击“+”选择File dependence

这里写图片描述

  一类是.so库,so库时C语言写的一些逻辑,不需要关注。需要用到一种机制 JNI java native interface。这些库需要放置到jniLibs文件夹中(选中project在main底下新建src/main/jniLibs)。

这里写图片描述

加载地图

  http://developer.baidu.com/map/index.php?title=androidsdk/guide/hellobaidumap

定位

  http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0

地图中点给某一个点标记并且连线

标记某一个点

  建立全局变量

private GeoCoder mSearch;

  首先初始化搜索模块,注册事件监听

// 初始化搜索模块,注册事件监听
        mSearch = GeoCoder.newInstance();
        mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
            //            通过地点确定经纬度
            @Override
            public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
                if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
                    Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
                            .show();
                    return;
                }
//                mBaiduMap.clear();
                mBaiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation())
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.mipmap.ic_launcher)));
                mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult
                        .getLocation()));
                String strInfo = String.format("纬度:%f 经度:%f",
                        geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);
//                Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
//                画线
                Log.d("北京的经度为:", "onGetGeoCodeResult " + geoCodeResult.getLocation().longitude);
                Log.d("北京的纬度为:", "onGetGeoCodeResult " + geoCodeResult.getLocation().latitude);
                LatLng p1 = new LatLng(geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);//纬度,精度
                points.add(p1);
                Log.d("数组里面储存的 数据", "onGetGeoCodeResult " + points.toString());
            }

            //            通过经纬度确定地点
            @Override
            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
                if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
                    Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
                            .show();
                    return;
                }
                mBaiduMap.clear();
                mBaiduMap.addOverlay(new MarkerOptions().position(reverseGeoCodeResult.getLocation())
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.mipmap.ic_launcher)));
                mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(reverseGeoCodeResult
                        .getLocation()));
//                Toast.makeText(MainActivity.this, reverseGeoCodeResult.getAddress(),
//                        Toast.LENGTH_LONG).show();
            }
        });

  然后在button监听器中加入Geo搜索

                mSearch.geocode(new GeoCodeOption().city(
                        "北京").address(
                        "海淀区中关村海龙大厦"));

    定位的时候要将不成功的情况排除

 @Override
        public void onReceiveLocation(BDLocation location) {
//      定位成功后在将点添加进去,将不成功的情况排除出去
            if (location.getLocType() == BDLocation.TypeServerError) {

            } else if (location.getLocType() == BDLocation.TypeNetWorkException) {

            } else if (location.getLocType() == BDLocation.TypeCriteriaException) {


            } else {
                LatLng p1 = new LatLng(location.getLatitude(), location.getLongitude());
                points.add(p1);
                mBaiduMap.addOverlay(new MarkerOptions().position(p1)
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.mipmap.ic_launcher)));
                mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(p1));
                mLocationClient.stop();
            }
        }
    }

将多个点连线

  新建全局变量

   private List<LatLng> points;

  将上面代码中获得的经纬度放在一个数组中

                LatLng p1 = new LatLng(geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);//纬度,精度
                points.add(p1);

  放在这个位置
  
这里写图片描述

  然后多定位几个点,在一个Button中加入画折现的方法

        case R.id.button_location1:
//                Geo搜索
                mSearch.geocode(new GeoCodeOption().city(
                        "北京").address(
                        "海淀区中关村海龙大厦"));

                break;
            case R.id.button_location2:
                mSearch.geocode(new GeoCodeOption().city(
                        "济南").address(
                        "章丘"));
                break;
            case R.id.button_location3:
                mSearch.geocode(new GeoCodeOption().city(
                        "山东").address(
                        "青岛市经济技术开发区山东科技大学"));
                break;
            case R.id.button_connection:
//              将point数组中的经纬度点代表的位置以折线的方式连接
                OverlayOptions ooPolyline = new PolylineOptions().width(10)
                        .color(0xAAFF0000).points(points);
                mBaiduMap.addOverlay(ooPolyline);
                break;

达成效果
这里写图片描述

全部代码

  参考百度地图API网站给的代码Demo,将代码修改如下(将定位的点也添加到point数组中,连线的时候也讲定位的点连在一起)

package com.example.laowang.mylocationapplication;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeOption;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity implements View.OnClickListener {
    private MapView mMapView;
    private GeoCoder mSearch;
    private BaiduMap mBaiduMap;
    private Button mBtnLocate1;
    private Button mBtnLocate2;
    private Button mBtnLocate3;
    private Button mBtnLocate;
    private Button mBtnConnect;
    private List<LatLng> points;

    //  定位当前位置
    public LocationClient mLocationClient = null;
    public BDLocationListener myListener = new MyLocationListener();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        //注意该方法要再setContentView方法之前实现
        SDKInitializer.initialize(getApplicationContext());
        mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类
        mLocationClient.registerLocationListener(myListener);    //注册监听函数
        setContentView(R.layout.activity_main);

        mMapView = (MapView) findViewById(R.id.bmapView);
        mBtnLocate1 = (Button) findViewById(R.id.button_location1);
        mBtnLocate2 = (Button) findViewById(R.id.button_location2);
        mBtnLocate3 = (Button) findViewById(R.id.button_location3);
        mBtnLocate = (Button) findViewById(R.id.button_location);
        mBtnConnect = (Button) findViewById(R.id.button_connection);
        mBaiduMap = mMapView.getMap();


//      初始化数组来添加经纬度
        points = new ArrayList<LatLng>();

//       点击按钮,定位固定位置
        mBtnLocate1.setOnClickListener(this);
        mBtnLocate2.setOnClickListener(this);
        mBtnLocate3.setOnClickListener(this);
        mBtnLocate.setOnClickListener(this);
        mBtnConnect.setOnClickListener(this);
        // 初始化搜索模块,注册事件监听
        mSearch = GeoCoder.newInstance();
        mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
            //            通过地点确定经纬度
            @Override
            public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
                if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
                    Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
                            .show();
                    return;
                }
//                mBaiduMap.clear();
                mBaiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation())
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.mipmap.ic_launcher)));
                mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult
                        .getLocation()));
                String strInfo = String.format("纬度:%f 经度:%f",
                        geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);
//                Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
//                画线
                Log.d("北京的经度为:", "onGetGeoCodeResult " + geoCodeResult.getLocation().longitude);
                Log.d("北京的纬度为:", "onGetGeoCodeResult " + geoCodeResult.getLocation().latitude);
                LatLng p1 = new LatLng(geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);//纬度,精度
                points.add(p1);
                Log.d("数组里面储存的 数据", "onGetGeoCodeResult " + points.toString());
            }

            //            通过经纬度确定地点
            @Override
            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
                if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
                    Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
                            .show();
                    return;
                }
                mBaiduMap.clear();
                mBaiduMap.addOverlay(new MarkerOptions().position(reverseGeoCodeResult.getLocation())
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.mipmap.ic_launcher)));
                mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(reverseGeoCodeResult
                        .getLocation()));
//                Toast.makeText(MainActivity.this, reverseGeoCodeResult.getAddress(),
//                        Toast.LENGTH_LONG).show();
            }
        });


    }

    //     设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),
//     返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。
//     LocationClientOption类,该类用来设置定位SDK的定位方式
    private void initLocation() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
        option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
        int span = 1000;
        option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
        option.setOpenGps(true);//可选,默认false,设置是否使用gps
        option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
        option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死
        option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
        option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
        mLocationClient.setLocOption(option);
    }

    //    BDLocationListener接口有1个方法需要实现: 1.接收异步返回的定位结果,参数是BDLocation类型参数。
//    BDLocation类,封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取。
//  通过该类用户可以获取error code,位置的坐标,精度半径等信息
    public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
//      定位成功后在将点添加进去,将不成功的情况排除出去
            if (location.getLocType() == BDLocation.TypeServerError) {

            } else if (location.getLocType() == BDLocation.TypeNetWorkException) {

            } else if (location.getLocType() == BDLocation.TypeCriteriaException) {


            } else {
                LatLng p1 = new LatLng(location.getLatitude(), location.getLongitude());
                points.add(p1);
                mBaiduMap.addOverlay(new MarkerOptions().position(p1)
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.mipmap.ic_launcher)));
                mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(p1));
                mLocationClient.stop();
            }
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button_location1:
//                Geo搜索
                mSearch.geocode(new GeoCodeOption().city(
                        "北京").address(
                        "海淀区中关村海龙大厦"));

                break;
            case R.id.button_location2:
                mSearch.geocode(new GeoCodeOption().city(
                        "济南").address(
                        "章丘"));
                break;
            case R.id.button_location3:
                mSearch.geocode(new GeoCodeOption().city(
                        "山东").address(
                        "青岛市经济技术开发区山东科技大学"));
                break;
            case R.id.button_connection:
//              将point数组中的经纬度点代表的位置以折线的方式连接
                OverlayOptions ooPolyline = new PolylineOptions().width(10)
                        .color(0xAAFF0000).points(points);
                mBaiduMap.addOverlay(ooPolyline);
                break;
            case R.id.button_location:
                mLocationClient.start();

                break;
            default:
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值