zoukankan      html  css  js  c++  java
  • 百度地图实现普通地图、定位、周边搜索功能

    注意:此Demo是用Android Studio实现的

    //--------------一下是普通地图的实现-----------------------------------

    1:打开百度地图APi进去,如果没有注册过的需要注册,注册过的登录进入

    2:点击开发——Android地图SDk——点击获取密钥——点击创建应用——然后你就创建一个新的项目
    3:打开你项目下的res——values——string.xml把项目名:比如BaiDuMap复制到应用名称中去
    4:应用类型选择:Android SDK
    5:发布版SHA1 的获取:打开你电脑的c盘——用户——你的用户名——.android 下面有一个debug.keystore  
       点击键盘Windows+R 进入黑窗口 输入  keytool -list -v -keystore 把keytool -list -v -keystore拖进去(注意:-keystore后面要有一个空格)点击键盘的回车键

    6:输入密钥库口令:android (注意都是英文小写)回车键
    7:把下面显示的证书指纹中的:SHA1复制到 发布版SHA1
    8:打开你项目的清单文件 把包名复制到 包名
    9:点击下面的提交
    10:就生成了一个Key
    11:点击开发指南下的相关下载,下载相关的demo
    12:把demo中libs下的除了android-support-v4  全部复制到你的工程的libs下
     点击Android Studio工具栏中的有多个小方块的那个图标
     点击APP再点击Dependencies ——点击加号 ——选择File dependency
    把libs下的jar包都添加进去



    13:进入百度地图Api的Android定位Sdk 中开发指南中的配置环境 找到
    sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
    }
    复制到 工程下的build.gradle中
    如:buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
    }

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.4.0'
    }

    点击右上角的Sync Now 同步一下

    14:进入开发指南中的 Hello BaiduMap中 (注意:key值就是刚才我们申请的那个)

     (1)在application中添加开发密钥
    <application>  
        <meta-data  
            android:name="com.baidu.lbsapi.API_KEY"  
            android:value="开发者 key" />  
    </application>
    2)添加所需权限
    <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"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <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" />
    第三步,在布局xml文件中添加地图控件;
    <com.baidu.mapapi.map.MapView  
        android:id="@+id/bmapView"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:clickable="true" />

    第四步,在应用程序创建时初始化 SDK引用的Context 全局变量:
    public class MainActivity extends Activity {  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);   
            //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
            //注意该方法要再setContentView方法之前实现  
            SDKInitializer.initialize(getApplicationContext());  
            setContentView(R.layout.activity_main);  
        }  
    }
    注意:在SDK各功能组件使用之前都需要调用
    SDKInitializer.initialize(getApplicationContext());,因此我们建议该方法放在Application的初始化方法中


    第四步我是这么做的:新建一个application包,在这个包下新创建一个BaseApplication类并继承Application,实现onCreate的方法
    在onCreate中复制 SDKInitializer.initialize(getApplicationContext());进去
    如下:

    public class BaseApplication extends Application{
        @Override
        public void onCreate() {
            super.onCreate();
            SDKInitializer.initialize(getApplicationContext());
        }
    }


    然后在清单文件中配置:<application下:
    <application
            android:name=".application.BaseApplication"//包名


    第五步,创建地图Activity,管理地图生命周期;
    public class MainActivity extends Activity {  
        MapView mMapView = null;  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);   
            //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
            //注意该方法要再setContentView方法之前实现  
            SDKInitializer.initialize(getApplicationContext());  
            setContentView(R.layout.activity_main);  
            //获取地图控件引用  
            mMapView = (MapView) findViewById(R.id.bmapView);  
        }  
        @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();  
            }  
        }
    完成以上步骤后,运行程序,即可在您的应用中显示

    //-------------------以上是普通地图的实现---------------------------------------------------------

    //===============以下是定位功能的实现==========================

    一:
    1:配置环境 进入Android定位SDK的开发指南中点击配置环境
     
    使用AndroidStutio的开发者除了上述操作外,还需要在build.gradle中配置SO文件的使用,如下所示:
    sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
    }

    2:
    设置AndroidManifest.xml

    在Application标签中声明SERVICE组件,每个APP拥有自己单独的定位SERVICE
    <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote">
    </service>

      3:声明使用权限
    <!-- 这个权限用于进行网络定位-->
    <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>

    4:
    设置AcessKey

    Android定位SDK4.2及之后版本需要在Mainfest.xml正确设置Accesskey(AK),如果设置错误将会导致定位和地理围栏服务无法正常使用。
    设置AK,在Application标签中加入
    <meta-data
                android:name="com.baidu.lbsapi.API_KEY"
                android:value="AK" />       //key:开发者申请的Key

    //-------------------Activity2-------------------复制一下代码即可-------------代码来源下载的Demo中src下的baidumapsdk下的demo下的map下的LocationDemo------------------------

    package com.example.baidumap.activity;

    import com.baidu.location.BDLocation;
    import com.baidu.location.BDLocationListener;
    import com.baidu.location.LocationClient;
    import com.baidu.location.LocationClientOption;
    import com.baidu.mapapi.map.BaiduMap;
    import com.baidu.mapapi.map.MapStatus;
    import com.baidu.mapapi.map.MapStatusUpdateFactory;
    import com.baidu.mapapi.map.MapView;
    import com.baidu.mapapi.map.MyLocationData;
    import com.baidu.mapapi.model.LatLng;
    import com.example.baidumap.R;

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Window;

    public class Activity2 extends Activity{
        MapView mMapView = null;  
        // 定位相关
        LocationClient mLocClient;
        public MyLocationListenner myListener = new MyLocationListenner();
        BaiduMap mBaiduMap;
        boolean isFirstLoc = true; // 是否首次定位
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
            setContentView(R.layout.activity_main);
            //获取地图控件引用  
            mMapView = (MapView) findViewById(R.id.bmapView);  
            
            
            mBaiduMap = mMapView.getMap();
            // 开启定位图层
            mBaiduMap.setMyLocationEnabled(true);
            // 定位初始化
            mLocClient = new LocationClient(this);
            mLocClient.registerLocationListener(myListener);
            LocationClientOption option = new LocationClientOption();
            option.setOpenGps(true); // 打开gps
            option.setCoorType("bd09ll"); // 设置坐标类型
            option.setScanSpan(1000);
            mLocClient.setLocOption(option);
            mLocClient.start();
            
        }

          /**
         * 定位SDK监听函数
         */
        public class MyLocationListenner implements BDLocationListener {

            @Override
            public void onReceiveLocation(BDLocation location) {
                // map view 销毁后不在处理新接收的位置
                if (location == null || mMapView == null) {
                    return;
                }
                MyLocationData locData = new MyLocationData.Builder()
                        .accuracy(location.getRadius())
                                // 此处设置开发者获取到的方向信息,顺时针0-360
                        .direction(100).latitude(location.getLatitude())
                        .longitude(location.getLongitude()).build();
                mBaiduMap.setMyLocationData(locData);
                if (isFirstLoc) {
                    isFirstLoc = false;
                    LatLng ll = new LatLng(location.getLatitude(),
                            location.getLongitude());
                    MapStatus.Builder builder = new MapStatus.Builder();
                    builder.target(ll).zoom(18.0f);
                    mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
                }
            }

            public void onReceivePoi(BDLocation poiLocation) {
            }
        }
        
        
          @Override  
            protected void onDestroy() {  
                super.onDestroy();  
                // 退出时销毁定位
                mLocClient.stop();
                // 关闭定位图层
                mBaiduMap.setMyLocationEnabled(false);
                mMapView.onDestroy();
                mMapView = null;
            }  
            @Override  
            protected void onResume() {  
                super.onResume();  
                //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
                mMapView.onResume();  
                }  
            @Override  
            protected void onPause() {  
                super.onPause();  
                //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
                mMapView.onPause();  
                }  

    }

     //--------------以上是定位--------------------------------

    //================以下是周边搜索功能===========================

    注意:实现此功能时,导入了两个类文件,分别是src下的com下的baidu下的mapapi下的overlayutil下的 OverlayManager PoiOverlay

    //---------------------Activity3中           完成以下就可做一个简单的周边搜索了--------------------------------------------------

    package com.example.baidumap.activity;

    import com.baidu.location.BDLocation;
    import com.baidu.location.BDLocationListener;
    import com.baidu.location.LocationClient;
    import com.baidu.location.LocationClientOption;
    import com.baidu.mapapi.map.BaiduMap;
    import com.baidu.mapapi.map.BitmapDescriptor;
    import com.baidu.mapapi.map.BitmapDescriptorFactory;
    import com.baidu.mapapi.map.CircleOptions;
    import com.baidu.mapapi.map.MapStatus;
    import com.baidu.mapapi.map.MapStatusUpdateFactory;
    import com.baidu.mapapi.map.MapView;
    import com.baidu.mapapi.map.MarkerOptions;
    import com.baidu.mapapi.map.MyLocationData;
    import com.baidu.mapapi.map.OverlayOptions;
    import com.baidu.mapapi.map.Stroke;
    import com.baidu.mapapi.model.LatLng;
    import com.baidu.mapapi.search.core.PoiInfo;
    import com.baidu.mapapi.search.core.SearchResult;
    import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
    import com.baidu.mapapi.search.poi.PoiBoundSearchOption;
    import com.baidu.mapapi.search.poi.PoiDetailResult;
    import com.baidu.mapapi.search.poi.PoiDetailSearchOption;
    import com.baidu.mapapi.search.poi.PoiIndoorResult;
    import com.baidu.mapapi.search.poi.PoiNearbySearchOption;
    import com.baidu.mapapi.search.poi.PoiResult;
    import com.baidu.mapapi.search.poi.PoiSearch;
    import com.baidu.mapapi.search.poi.PoiSortType;
    import com.example.baidumap.R;
    import com.example.baidumap.activity.Activity2.MyLocationListenner;
    import com.example.baidumap.utils.PoiOverlay;

    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.Window;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;

    public class Activity3 extends Activity implements OnGetPoiSearchResultListener{
        MapView mMapView = null;  
        // 定位相关
        LocationClient mLocClient;
        public MyLocationListenner myListener = new MyLocationListenner();
        BaiduMap mBaiduMap;
        boolean isFirstLoc = true; // 是否首次定位
        private EditText et_text;
        private Button bt_button;
        
         private PoiSearch mPoiSearch = null;
         LatLng center = null;
         int radius = 50000;
        
        
    //-----------------onCreate-------------------------
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
            setContentView(R.layout.activity_main);
            //找到控件
            et_text = (EditText) findViewById(R.id.et_text);
            bt_button = (Button) findViewById(R.id.bt_nutton);
            //获取地图控件引用  
            mMapView = (MapView) findViewById(R.id.bmapView);  
            
            
            mBaiduMap = mMapView.getMap();
            // 开启定位图层
            mBaiduMap.setMyLocationEnabled(true);
            // 定位初始化
            mLocClient = new LocationClient(this);
            mLocClient.registerLocationListener(myListener);
            LocationClientOption option = new LocationClientOption();
            option.setOpenGps(true); // 打开gps
            option.setCoorType("bd09ll"); // 设置坐标类型
            option.setScanSpan(1000);
            mLocClient.setLocOption(option);
            mLocClient.start();
           
            
            // 初始化搜索模块,注册搜索事件监听
            mPoiSearch = PoiSearch.newInstance();
            mPoiSearch.setOnGetPoiSearchResultListener(this);
            
            //点击搜索
            bt_button.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    //关闭输入框
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
                     PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption().keyword(et_text.getText()
                                .toString()).sortType(PoiSortType.distance_from_near_to_far).location(center)
                                .radius(radius).pageNum(10);//显示数据个数
                        mPoiSearch.searchNearby(nearbySearchOption);
                    
                }
            });
            
        }

          /**
         * 定位SDK监听函数
         */
        public class MyLocationListenner implements BDLocationListener {

            @Override
            public void onReceiveLocation(BDLocation location) {
                // map view 销毁后不在处理新接收的位置
                if (location == null || mMapView == null) {
                    return;
                }
                
                center=new LatLng(location.getLatitude(), location.getLongitude());
                
                MyLocationData locData = new MyLocationData.Builder()
                        .accuracy(location.getRadius())
                                // 此处设置开发者获取到的方向信息,顺时针0-360
                        .direction(100).latitude(location.getLatitude())
                        .longitude(location.getLongitude()).build();
                mBaiduMap.setMyLocationData(locData);
                if (isFirstLoc) {
                    isFirstLoc = false;
                    LatLng ll = new LatLng(location.getLatitude(),
                            location.getLongitude());
                    MapStatus.Builder builder = new MapStatus.Builder();
                    builder.target(ll).zoom(18.0f);
                    mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
                }
            }

            public void onReceivePoi(BDLocation poiLocation) {
            }
        }
        
        
          @Override  
            protected void onDestroy() {  
                super.onDestroy();  
                // 退出时销毁定位
                mLocClient.stop();
                // 关闭定位图层
                mBaiduMap.setMyLocationEnabled(false);
                mMapView.onDestroy();
                mMapView = null;
            }  
            @Override  
            protected void onResume() {  
                super.onResume();  
                //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
                mMapView.onResume();  
             }  
            
            @Override  
            protected void onPause() {  
                super.onPause();  
                //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
                mMapView.onPause();  
                
             }
            
            
            
            /**
             * 获取POI详情搜索结果,得到searchPoiDetail返回的搜索结果
             * @param result
             */
            @Override
            public void onGetPoiDetailResult(PoiDetailResult arg0) {
                 if (arg0.error != SearchResult.ERRORNO.NO_ERROR) {
                        Toast.makeText(Activity3.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(Activity3.this, arg0.getName() + ": " + arg0.getAddress(), Toast.LENGTH_SHORT).show();
                                
                    }            
            }
            
            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult arg0) {
                
                
            }
            
            /**
             * 获取POI搜索结果,包括searchInCity,searchNearby,searchInBound返回的搜索结果
             * @param result
             */
            @Override
            public void onGetPoiResult(PoiResult arg0) {
                 if (arg0 == null || arg0.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
                        Toast.makeText(Activity3.this, "未找到结果", Toast.LENGTH_LONG)
                                .show();
                        return;
                    }
                    if (arg0.error == SearchResult.ERRORNO.NO_ERROR) {
                        mBaiduMap.clear();
                        PoiOverlay overlay = new MyPoiOverlay(mBaiduMap);
                        mBaiduMap.setOnMarkerClickListener(overlay);
                        overlay.setData(arg0);
                        overlay.addToMap();
                        overlay.zoomToSpan();
                        
                        showNearbyArea(center, radius);
                            
                      
                        return;
                    }
                
            }
            
            
             private class MyPoiOverlay extends PoiOverlay {

                    public MyPoiOverlay(BaiduMap baiduMap) {
                        super(baiduMap);
                    }

                    @Override
                    public boolean onPoiClick(int index) {
                        super.onPoiClick(index);
                        PoiInfo poi = getPoiResult().getAllPoi().get(index);
                        // if (poi.hasCaterDetails) {
                        mPoiSearch.searchPoiDetail((new PoiDetailSearchOption())
                                .poiUid(poi.uid));
                        // }
                        return true;
                    }
                }
            
             /**
                 * 对周边检索的范围进行绘制
                 * @param center
                 * @param radius
                 */
                public void showNearbyArea( LatLng center, int radius) {
                    //设置中心点
                   /* BitmapDescriptor centerBitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
                    MarkerOptions ooMarker = new MarkerOptions().position(center).icon(centerBitmap);
                    mBaiduMap.addOverlay(ooMarker);*/

                    //显示图层
                   /* OverlayOptions ooCircle = new CircleOptions().fillColor( 0xCCCCCC00 ).center(center).stroke(new Stroke(5, 0xFFFF00FF )).radius(radius);
                    mBaiduMap.addOverlay(ooCircle);*/
                }


    }

    //===========以上是周边搜索功能==================

    //----------------以下是周边搜索的布局文件--------------------------

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <LinearLayout android:layout_width="fill_parent"        
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <EditText android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:id="@+id/et_text"
                android:hint="请输入搜索内容"/>
            <Button android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="周边搜索"
                android:id="@+id/bt_nutton"/>
            
        </LinearLayout>

        <com.baidu.mapapi.map.MapView  
        android:id="@+id/bmapView"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:clickable="true" />

    </LinearLayout>

  • 相关阅读:
    perl oneline
    perl修改镜像源地址
    pandas 模块
    django学习
    python- shutil 高级文件操作
    小爬虫爬一个贴吧网页的图片
    Python Tkinter的学习
    python的帮助信息的写法
    python3.5+tornado学习
    LinkedList,ArrayList,HashMap,TreeMap
  • 原文地址:https://www.cnblogs.com/changyiqiang/p/5967006.html
Copyright © 2011-2022 走看看