百度地图《笔记,以后修改》

百度地图:
1:找地方
2:规划路线
3:定位,上报位置;
4: 轨迹


developer.baidu.com
点击LBS
http://developer.baidu.com/map/




第三方的SDK的使用方式:
1:文档,
2:SDK
3:案例
4:申请Key


BaiduMapDemo


周边雷达,可以搜索使用相同app的


Key的申请地址为:http://lbsyun.baidu.com/apiconsole/key 




新版本KEY
安全码:很重要======================================
C:\Documents and Settings\Administrator\.android
注意目录是C:\Documents and Settings\Administrator\.android


SHA1:
包名:
1:准备包名。Gradle 可以同时支持多个不同的包名,
   需要为每一个包名进行注册申请的;
包名:模块下面build.gradle中包含的applicationId
//
applicationId "com.kodulf.baidumapdemo"
2:数字签名:获取,百度地图,通过一台电脑中特有的数字签名文件,(Android的密码文件)
来进行唯一电脑的识别:每一台电脑,默认的密码存储文件是不一样的,
通过获取密码存储文件中的数字签名信息,进行注册就能够实现特有的一台电脑才可以
打包生成baidu地图的程序。除了这台电脑,其他电脑打出来的包就不行,显示不了地图。
只有这台电脑打包出来的文件,才可以使用百度地图功能。

拷贝key.store的文件。


keystore 文件。
1:用户目录是C:\Documents and Settings\Administrator\.android
debug.keystore 这个文件是一台电脑在进行Android 程序调试的时候,使用密码文件,
这个文件打开密码“android”实际上就是用于调试的;
2:如果需要实现多人单独调试,建议奖注册者的debug.keystore复制给团队其他人。
3:真正开发时候是不用这样做的。对于Gradle而言,最好的手段是为每一个项目单独生成keyStore文件。
把这个文件放在工程目录下面。--------------------------------------------
------------------------------------------------------------------------
?????????????????????????????????????




关于.android文件夹,凡是配置了ANDROID_SDK_HOME的变量的,
.android文件的文件夹位置就是配置的变量的位置。






C:\Documents and Settings\Administrator\.android>keytool -list -v -keystore debug.keystore


输入keystore密码:


Keystore 类型: JKS
Keystore 提供者: SUN


您的 keystore 包含 1 输入


别名名称: androiddebugkey
创建日期: 2015-10-21
项类型: PrivateKeyEntry
认证链长度: 1
认证 [1]:
所有者:CN=Android Debug, O=Android, C=US
签发人:CN=Android Debug, O=Android, C=US
序列号:5626e634
有效期: Wed Oct 21 09:11:16 CST 2015 至Fri Oct 13 09:11:16 CST 2045
证书指纹:
         MD5:57:04:03:9E:FE:8C:F6:DD:C3:45:9A:27:23:27:D0:23
         SHA1:61:E6:03:08:2F:02:7C:DE:CF:40:0B:54:AE:88:C9:EF:2D:6D:97:12
         签名算法名称:SHA1withRSA
         版本: 3




把SHA1放到申请里面:
得到AK:
EZnt3mkL94jEx6WlLQ0jEi4f


Baidu SDK 的 libs代表标准android工程的代码,里面的jar和我们之前手动的拷贝v4包一样。 
里面的.so是c语言写的。
这样的包android studio里面是没法用的。
---------------------------------------
android 的libs里面脂肪jar 包。
将jar包放到libs 里面
然后再main 的文件夹下新建jniLibs。
将除了jar文件的文件夹放到jniLibs里面了。
点击rebuild,或者右边栏的gradle的刷新按钮。
--------------------------------------


参考:
Android Studio工程配置方法
第一步:在工程app/libs目录下放入baidumapapi_vX_X_X.jar包,在src/main/目录下新建jniLibs目录,放入libBaiduMapSDK_vX_X_X_X.so如下图所示,注意jar和so的前3位版本号必须一致,并且保证使用一次下载的文件夹中的两个文件,不能不同功能组件的jar或so交叉使用。 


第二步:导入jar包。菜单栏选择File->Project Structor->Modules->Dependencies,点击+号,选择File dependency,选择jar包导入。 


通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了。 
---------------------------------------------------------------------------------------
<!--baidu的整合和配置
        注册的AK,对饮本台的.android/debug.keystore.如果没有配置AK,那么百度地图不可用
        -->
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="EZnt3mkL94jEx6WlLQ0jEi4f" />








<!--访问网络状态 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!--联网-->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!--获取用户的配置-->
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <!--进制锁屏-->
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <!--修改wifi设置-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!--访问wifi设置-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--可以检测当前执行的进程有哪些-->
    <uses-permission android:name="android.permission.GET_TASKS" />
    <!--写存储卡-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!--修改设置--> 
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />


    <com.baidu.mapapi.map.MapView
        android:id="@+id/map_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />


baidu地图必须要初始化:
而且要在setContentView之前执行。




//初始化百度map的内部使用的数据。
        SDKInitializer.initialize(getApplicationContext());
        //因为在布局中定义的MapView,在加载的时候,就需要使用这个数据了。
       // 所以才要调用初始化方法,
        setContentView(R.layout.activity_main);






<!--应用程序启动之后,第一个执行的java代码,在application 中
默认情况,application不指定name属性的情况下,android就会在程序启动的时候,
创建一个默认的application 类对象,作为整个应用的全局入口
如果有一些代码,需要在整个应用程序启动的时候,在Activity 启动之前,或者service启动之前,也就是说四大
组件启动之前,(其实是三大组件,不包含contentProvider)执行自定义的初始化代码,那么就需要指定自己的applicaiton类。
Application 子类,有时候也作为全局的,唯一的数据存储区,每一个组件都可以直接方法这个存储区


-->




新建一个MainApplication 继承Application


onCreate方法
public class MainApplication extends Application {
    /**
     * 在所有的应用程序组件启动之前,程序刚刚启动的时候,回调这个方法,
     * 
     */
    @Override
    public void onCreate() {
        super.onCreate();
        SDKInitializer.initialize(getApplicationContext());
    }
}


然后删除掉mainActivity 里面的onCreate 里面的那句话




清单文件里面添加:
android:name=".MainApplication"




mapView = (MapView)findViewById(R.id.map_view);
        //百度地图,核心: 内部的各宗操作,配置,都是通过BaiduMap来完成的。
        BaiduMap map = mapView.getMap();
        //设置地图类型:普通2D,卫星图
        map.setMapType(BaiduMap.MAP_TYPE_SATELLITE);


分享:
wamp,wordpress


draw9patch
保存的命名必须是.9


自v2.3.5 版本开始,地图才开始支持Fragment的框架。
注意已经要注意




实施交通图,
//2.是否显示交通路况
        map.setTrafficEnabled(true);


<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="btnAddMarker"
        android:text="添加一个机器人"/>


覆盖物需要通过覆盖物参数对象来设置信息




public void btnAddMarker(View view) {
        //在地图上添加一个图片显示的标记(Marker)
        //用于地图上显示图像(场景:地图上标记用户头像,搜索结果大头钉。)
        //添加的步骤,1:准备覆盖物参数,只能通过参数来添加。
        //2:通过baidumap 来添加参数,生成真正的覆盖物对象
        //3. 设置覆盖物的参数,实现动态的处理:
        MarkerOptions options = new MarkerOptions();
        //覆盖物是与地图绑定的,内部采用仅为度作为位置定义
        LatLng position = new LatLng(39.963175,116.400244);
        options.position(position);
        //latitue 维度
        //longitute 经度
        //参数一:维度
        //参数二:进度
        //所有的覆盖物都是与地图相关的


        //!!!Marker 必须设置图片,否则抛出异常
        BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
        options.icon(descriptor);


        //通过Options 来添加Marker
        //Overlay 代表覆盖物的意思,我们的mark 就是覆盖物


        map.addOverlay(options);
        //marker的特点是地图缩小,机器人还不缩小。
    }


=================================================================
Marker 叫做标记标记,Overlay 才叫做覆盖物========================
=================================================================


如果想要覆盖物可以移动,


//添加Marker 可以设置是否可以拖拽
        options.draggable(true);


覆盖物的继承关系:
OverlayOptions 父类
MarkerOptions 是子类


map.addOverlay(options)的返回值是一个Overlay
Overlay 是父类
Marker 是子类。




        Marker marker = (Marker)map.addOverlay(options);
        //marker的特点是地图缩小,机器人还不缩小。
//        覆盖物的继承关系:
//        OverlayOptions 父类
//        MarkerOptions 是子类
//
//        map.addOverlay(options)的返回值是一个Overlay
//        Overlay 是父类
//        Marker 是子类。


        //3.设置Marker的拖拽处理
        //所有关于地图中的额股改无的师傅支持,都是由BaiduMap类对象来实际完成的
        //设置拖拽监听也是由BaiduMap 来完成的。
        map.setOnMarkerDragListener(this);




实现接口:


    //百度地图 内部Marker覆盖物拖拽的事件处理方法;


    /**
     * 移动中回调
     * @param marker
     */
    @Override
    public void onMarkerDrag(Marker marker) {


    }


    /**
     * 拖拽移动完成时候回调
     * @param marker
     */
    @Override
    public void onMarkerDragEnd(Marker marker) {
        //获取当前Marker的位置
        //获取的就是经纬度。
        LatLng latLng = marker.getPosition();
        Toast.makeText(this,latLng.toString(),Toast.LENGTH_LONG).show();
    }


    /**
     * 拖着开始的时候回调
     * @param marker
     */
    @Override
    public void onMarkerDragStart(Marker marker) {


    }






下午第二课:
添加附加属性:


在btn的方法里面:
 //添加附加属性:
        //通过Bundle 可以传递附加的特定与当前Mark的信息
        Bundle info = new Bundle();
        info.putString("name","天安门"+System.currentTimeMillis());
        options.extraInfo(info);//为了实现点击不同的处理和显示;






在onMarkerClick 方法里面添加:
public boolean onMarkerClick(Marker marker) {
        //通过marker 中的extraInfo 可以来区分和显示不同的内容
        Bundle extraInfo = marker.getExtraInfo();
        String name="无名称";
        if(extraInfo !=null){
            if(extraInfo.containsKey("name")){
                name = extraInfo.getString("name");
            }
        }
        Toast.makeText(this,"点击了一个"+name,Toast.LENGTH_LONG).show();


        //Toast.makeText(this,"点击了一个"+marker.getPosition(),Toast.LENGTH_LONG).show();
        return false;
    }




定位。POI检索,路劲规划,
http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0


定位和地图到底是一个什么关系。
通过GPS,手机,网络来进行当前手机位置的定位,最终通过回调接口获取当前的维经度位置
定位的使用:
申请Key,只要地图申请了Key ,定位一样使用;
关于SDK的下载,1:如果只用到白的的定位ie,那么值下载百度的定位的SDK就好了
2:如果需要定位和地图两个功能,那么一次下载全部选择,不要单独下载


1:关于定位的整合,
在application标签中生命service 组件,每个app拥有自己的
<!-- 百度定位服务,不写这个服务,定位无法操作,名称固定不变
        process 属性代表,当前指定的Service 运行在哪一个进程中
        属性值代表进程的名称,凡是以“:”开头的名称,都代表在当前程序中执行的时候创建一个私有的进程
        也就是说一个程序可以同时包含两个进程,
        service运行在独立的进程中;
        -->
        <service android:name="com.baidu.location.f"/>






2:权限:
完整的拷贝过来。


<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>




3://百度定位部分
    //用于定位操作的主要的工具类:
    private LocationClient mLocationClient;




mLocationClient = new LocationClient(getApplicationContext());
        //定位功能需要设置定位结果回调接口,不论定位成功还是失败,
        mLocationClient.registerLocationListener(this);




    //---------------------------------------
    //定位结果回调
    @Override
    public void onReceiveLocation(BDLocation bdLocation) {
            //TODO: 利用BDLoacation.getLocType()来判断成功和失败,以及定位类型
        int locType = bdLocation.getLocType();
        //可以通过BDLocation.TypeXxxxXxxx来判断类型代表的内容
        double latitute =bdLocation.getLatitude();
        double longtitute=bdLocation.getLongitude();


        Log.d("Location", "" + latitute + " " + longtitute);
    }




    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="btnCheckLocation"
        android:text="定位当前位置"/>




如果使用百度定位,然后定位的信息显示在高德地图上,那么需要使用gcj02


    /**
     * 手动定位一次
     * @param view
     */
    public void btnCheckLocation(View view) {
            //准备参数
        LocationClientOption option = new LocationClientOption();
        //设置定位的模式,最要在于定位的精度,高精度,低功耗,仅设备


//        LocationClientOption.LocationMode.Hight_Accuracy;
//        LocationClientOption.LocationMode.Battery_Saving;
//        LocationClientOption.LocationMode.Device_Sensors;
        option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);


        //默认的情况下,百度定位返回的坐标系百度地图使用的时候会有偏差。
        //使用bd09ll 代表百度地图自身使用的经纬度latitue longtitue,我们就是使用这个bd09ll
        //使用“gcj02” 代表“国家测绘局”使用的坐标系数据。
        //使用“bd09”墨卡托投影
        //如果使用百度定位,然后定位的信息显示在高德地图上,那么需要使用gcj02.
        //-----------------
        option.setCoorType("bd09ll");//注意后面的是字母l,而不是1
        //设置定位的扫描间隔,如果小于1000,代表执行一次;对于只执行一次的而言,不设置更好
        //如果大于1000,代表每间隔多少毫米,进行一次定位刷新,
        option.setScanSpan(5000);


        //设置是否返回当前的街道名称地址
        option.setIsNeedAddress(true);
        //是否打开Gps
        option.setOpenGps(true);


        //推荐使用的,但是没有意义,百度定位用于统计客户端信息的,可能以后会给开发者查看报表
        option.setProdName("xueziqiang");


        //给LocationClient 来设置参数,
        mLocationClient.setLocOption(option);


        //获取定位地址(一次or循环)
        mLocationClient.start();//start开始定位,如果setScanSpan()大于1000会重复定位,除非stop


        //如果想单独一次,请求一次定位就行了
        mLocationClient.requestLocation();


    }


在Destory 里面:
mLocationClient.unRegisterLocationListener(this);
mLocationClient.stop();


更新:
----------------------------------------------------------------




    //---------------------------------------
    //定位结果回调
    private void updateCurrentLocationMarker(BDLocation location){
        MarkerOptions options =new MarkerOptions();
        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
        options.position(latLng);
        BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
        options.icon(icon);
        map.addOverlay(options);
    }


    @Override
    public void onReceiveLocation(BDLocation bdLocation) {
            //TODO: 利用BDLoacation.getLocType()来判断成功和失败,以及定位类型
        int locType = bdLocation.getLocType();
        //可以通过BDLocation.TypeXxxxXxxx来判断类型代表的内容
        switch (locType){
            case BDLocation.TypeNetWorkLocation:
            case BDLocation.TypeCacheLocation:
            case BDLocation.TypeGpsLocation:
                double latitute =bdLocation.getLatitude();
                double longtitute=bdLocation.getLongitude();
                bdLocation.getCountry();//国家
                bdLocation.getProvince();//省
                bdLocation.getCity();//市
                bdLocation.getDistrict();//区
                bdLocation.getStreet();//街道
                bdLocation.getStreetNumber();//街道号
                bdLocation.getAddrStr();


                Log.d("Location", "" + latitute + " " + longtitute);
                updateCurrentLocationMarker(bdLocation);
                break;
            default:
                //定位失败
                break;
        }




    }


----------------------------------------------------------------


这个时候会有很多的Marker
设置一个成员变量Marker




    //---------------------------------------
    //定位结果回调
    private Marker currentLocationMarker;
    private void updateCurrentLocationMarker(BDLocation location){


        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
        if(currentLocationMarker==null) {
            MarkerOptions options = new MarkerOptions();
            options.position(latLng);
            BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
            options.icon(icon);
            //map.addOverlay(options);
            currentLocationMarker=(Marker)map.addOverlay(options);
        }else{
            currentLocationMarker.setPosition(latLng);
        }
    }


------------------------------------------------------------------
百度地图怎么跟着中心位置移动呢?
百度地图状态更新:包括缩放级别。
1:状态
2:当前显示的地图中心位置设置
3:设置地图的缩放级别




//动态的切换当前的地图位置以定位的坐标为中心点;
        //需要动态的更新地图状态,
        MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLng(latLng);//设置中心点
        map.setMapStatus(mapStatusUpdate);


完整的就是:


    //---------------------------------------
    //定位结果回调
    private Marker currentLocationMarker;
    private void updateCurrentLocationMarker(BDLocation location){


        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());


        //更新当前位置的图标:
        if(currentLocationMarker==null) {
            MarkerOptions options = new MarkerOptions();
            options.position(latLng);
            BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
            options.icon(icon);
            //map.addOverlay(options);
            currentLocationMarker=(Marker)map.addOverlay(options);
        }else{
            currentLocationMarker.setPosition(latLng);
        }


        //动态的切换当前的地图位置以定位的坐标为中心点;
        //需要动态的更新地图状态,
        MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLng(latLng);//设置中心点
        map.setMapStatus(mapStatusUpdate);
    }






-------------------------------------------------------------------------
如果我要查询当前500米以内的美食,公交站台。


定位里面的:Poi point of interesting。
地图里面的:的Poi,http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v3_6_1/
PoiSearch


修改Scan为0,就是只执行一次。






    //用于搜索周边信息的
    private PoiSearch poiSearch;


onCreate()-->poiSearch = PoiSearch.newInstance();
onDestory()--> poiSearch.destroy();




public void btnFindFoodNearby(View view) {
        //TODO: 查找周边的美食
        //需要使用PoiSearch引擎,最好是一个成员变量,onCreate 去初始化。onDestory销毁


        //查找周边
        if(currentLocationMarker!=null) {
            PoiNearbySearchOption option = new PoiNearbySearchOption();
            option.location(currentLocationMarker.getPosition());
            option.keyword("美食").radius(1000);//半径500,1000,2000
            poiSearch.searchNearby(option);
        }
    }


onCreat 里面设置poiSearch.setOnGetPoiSearchResultListener(this);
继承


    //poi结果回调
    @Override
    public void onGetPoiResult(PoiResult poiResult) {
        //结果包含在poi中
        List<PoiInfo> allPoi = poiResult.getAllPoi();
        if (allPoi != null) {
            for(PoiInfo poi:allPoi){
                LatLng location = poi.location;
                String name = poi.name;
                String address = poi.address;
                MarkerOptions options = new MarkerOptions();
                options.position(location).title(name);
                //BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
                BitmapDescriptor icon = BitmapDescriptorFactory.fromAsset("Icon_mark1.png");
                options.icon(icon);
                Bundle bundle = new Bundle();
                bundle.putString("address",address);
                options.extraInfo(bundle);


                map.addOverlay(options);
            }
        }


    }




缩放级别:


使用MapController 类的setZoom方法。 
Eg:mapView.getController().setZoom(13);支持缩放级别范围为3-18


mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(15).build()));//设置缩放级别


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值