基于百度地图SDK集成的一些功能

来源:互联网 发布:云计算设备公司 编辑:程序博客网 时间:2024/05/07 08:01
    最近开发的项目用到了地图,并在地图上显示某些坐标位置的标记图标,点击图标来显示此坐标处的一些信息,之后我从百度地图卡房平台下载了百度地图的SDK和Demo,并结合API总结了一下几点内容,实现了下面的几个功能:

(1)最基本功能,定位到当前位置 并获取当前的位置信息
(2)实现了打开地图显示自定义坐标点位置
(3)实现了为地图上的某个坐标点添加一个Marker图标
(4)在地图上标注多个覆盖点 并且有点击事件,点击每个点显示某点的自定义信息
(5)实现了在地图上画几何图形覆盖在一定的坐标区域内
下面我们来看下具体怎么集成实现的:
一 、首先在百度开放平台下载jar包和.so文件放到工程项目里面
二 、在AndroidManifest.xml里添加权限

    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />    <!-- 这个权限用于进行网络定位 -->    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />    <!-- 这个权限用于访问GPS定位 -->    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <!-- 用于读取手机当前的状态 -->    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <!-- 访问网络,网络定位需要上网 -->    <uses-permission android:name="android.permission.INTERNE" />//设置KEY<meta-data            android:name="com.baidu.lbsapi.API_KEY"            android:value="yplInAzbWE0uOBMxfSenlA9YXsjBZdfM" />

三 、定义一个Application类

public class TestApplication extends Application {    @Override    public void onCreate() {        super.onCreate();        // 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext        SDKInitializer.initialize(this);        //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.        //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。        SDKInitializer.setCoordType(CoordType.GCJ02);   }}

四 、MainActivit类实现具体功能

package com.junto.baidumaptest;import android.app.Activity;import android.content.Intent;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.CoordType;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.BitmapDescriptor;import com.baidu.mapapi.map.BitmapDescriptorFactory;import com.baidu.mapapi.map.MapStatus;import com.baidu.mapapi.map.MapStatusUpdate;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.Marker;import com.baidu.mapapi.map.MarkerOptions;import com.baidu.mapapi.map.MyLocationConfiguration;import com.baidu.mapapi.map.MyLocationData;import com.baidu.mapapi.map.OverlayOptions;import com.baidu.mapapi.map.PolygonOptions;import com.baidu.mapapi.map.Stroke;import com.baidu.mapapi.model.LatLng;import java.util.ArrayList;import java.util.List;public class MainActivity extends Activity {    private MapView mapView;    private BaiduMap mBaiduMap;    // 定位相关    LocationClient mlocationClient;    private BitmapDescriptor geo;    private Button btn_click;    private List<MarkerInfoUtil> infos;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();        center();//        setMarker1();//        setPolyline();//        locate();    }    private void initView() {        mapView = (MapView) findViewById(R.id.mapView);        mBaiduMap = mapView.getMap();        //普通地图        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);        // 开启定位图层        mBaiduMap.setMyLocationEnabled(true);        btn_click = (Button) findViewById(R.id.btn_click);        btn_click.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                locate();            }        });    }    @Override    protected void onPause() {        mapView.onPause();        super.onPause();    }    @Override    protected void onResume() {        mapView.onResume();        super.onResume();    }    @Override    protected void onDestroy() {        mapView.onDestroy();        super.onDestroy();        // 关闭定位图层        mBaiduMap.setMyLocationEnabled(false);    }    //打开地图显示自定义坐标点位置    private void center() {        Marker marker;        //设定中心点坐标         LatLng cenpt = new LatLng(39.142693, 117.216624);        //构建Marker图标        BitmapDescriptor bitmap = BitmapDescriptorFactory                .fromResource(R.mipmap.icon_gcoding);        //定义地图状态        MapStatus mMapStatus = new MapStatus.Builder()                .target(cenpt)                .zoom(18)                .build();        //定义MapStatusUpdate对象,以便描述地图状态将要发生的变化        MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);        //构建MarkerOption,用于在地图上添加Marker        OverlayOptions option = new MarkerOptions()                .position(cenpt)                .icon(bitmap);        //在地图上添加Marker,并显示        mBaiduMap.addOverlay(option);        //改变地图状态        mBaiduMap.setMapStatus(mMapStatusUpdate);    }    //为地图上的某个坐标点添加一个Marker图标    private void setMarker1() {        //定义Maker坐标点        LatLng point = new LatLng(39.142693, 117.216624);        //构建Marker图标        BitmapDescriptor bitmap = BitmapDescriptorFactory                .fromResource(R.mipmap.icon_gcoding);        Marker marker;        //构建MarkerOption,用于在地图上添加Marker        OverlayOptions option = new MarkerOptions()                .position(point)                .icon(bitmap);        //在地图上添加Marker,并显示        mBaiduMap.addOverlay(option);    }    //地图上标注多个覆盖点 并且有点击事件,点击每个点显示某点的自定义信息    private void setMarker() {        infos = new ArrayList<>();        MarkerInfoUtil markerInfoUtil1 = new MarkerInfoUtil();        markerInfoUtil1.setLatitude(39.93923);        markerInfoUtil1.setLongitude(116.357428);        markerInfoUtil1.setDescription("标志点1");        MarkerInfoUtil markerInfoUtil2 = new MarkerInfoUtil();        markerInfoUtil2.setLatitude(39.91923);        markerInfoUtil2.setLongitude(116.327428);        markerInfoUtil2.setDescription("标志点2");        MarkerInfoUtil markerInfoUtil3 = new MarkerInfoUtil();        markerInfoUtil3.setLatitude(39.89923);        markerInfoUtil3.setLongitude(116.347428);        markerInfoUtil3.setDescription("标志点3");        MarkerInfoUtil markerInfoUtil4 = new MarkerInfoUtil();        markerInfoUtil4.setLatitude(39.89923);        markerInfoUtil4.setLongitude(116.367428);        markerInfoUtil4.setDescription("标志点4");        MarkerInfoUtil markerInfoUtil5 = new MarkerInfoUtil();        markerInfoUtil5.setLatitude(39.91923);        markerInfoUtil5.setLongitude(116.387428);        markerInfoUtil5.setDescription("标志点5");        infos.add(markerInfoUtil1);        infos.add(markerInfoUtil2);        infos.add(markerInfoUtil3);        infos.add(markerInfoUtil4);        infos.add(markerInfoUtil5);        for (int i = 0; i < infos.size(); i++) {            LatLng point = new LatLng(infos.get(i).getLatitude(), infos.get(i).getLongitude());//        }            //定义Maker坐标点//        LatLng point = new LatLng(39.963175, 116.400244);            //构建Marker图标            BitmapDescriptor bitmap = BitmapDescriptorFactory                    .fromResource(R.mipmap.icon_gcoding);            Marker marker;            //构建MarkerOption,用于在地图上添加Marker            OverlayOptions option = new MarkerOptions()                    .position(point)                    .icon(bitmap);            //在地图上添加Marker,并显示            mBaiduMap.addOverlay(option);            //添加marker            marker = (Marker) mBaiduMap.addOverlay(option);            //使用marker携带info信息,当点击事件的时候可以通过marker获得info信息            Bundle bundle = new Bundle();            //info必须实现序列化接口            bundle.putSerializable("info", infos.get(i));            marker.setExtraInfo(bundle);        }        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {            @Override            public boolean onMarkerClick(Marker marker) {                //从marker中获取info信息                Bundle bundle = marker.getExtraInfo();                MarkerInfoUtil infoUtil = (MarkerInfoUtil) bundle.getSerializable("info");                Toast.makeText(MainActivity.this, infoUtil.getDescription(), Toast.LENGTH_SHORT).show();                Log.e("tag", "Description=" + infoUtil.getDescription());                return false;            }        });    }    //地图上几何覆盖物    private void setPolyline() {        //定义多边形的五个顶点        LatLng pt1 = new LatLng(39.93923, 116.357428);        LatLng pt2 = new LatLng(39.91923, 116.327428);        LatLng pt3 = new LatLng(39.89923, 116.347428);        LatLng pt4 = new LatLng(39.89923, 116.367428);        LatLng pt5 = new LatLng(39.91923, 116.387428);        List<LatLng> pts = new ArrayList<LatLng>();        pts.add(pt1);        pts.add(pt2);        pts.add(pt3);        pts.add(pt4);        pts.add(pt5);        //构建用户绘制多边形的Option对象        OverlayOptions polygonOption = new PolygonOptions()                .points(pts)                .stroke(new Stroke(5, 0xAA00FF00))                .fillColor(0xAAFFFF00);        //在地图上添加多边形Option,用于显示        mBaiduMap.addOverlay(polygonOption);    }    //定位到当前位置 并获取当前的位置信息    private void locate() {        // 定位初始化        mlocationClient = new LocationClient(getApplicationContext());        LocationClientOption option = new LocationClientOption();        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 设置定位模式  高精度        option.setOpenGps(true); // 打开GPRS        option.setCoorType(String.valueOf(CoordType.GCJ02));// 返回的定位结果是百度经纬度,默认值gcj02        option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms        option.disableCache(false);// 禁止启用缓存定位        option.setIsNeedAddress(true);// 返回的定位结果包含地址信息        option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向        mlocationClient.setLocOption(option);        mlocationClient.registerLocationListener(new BDLocationListener() {            @Override            public void onReceiveLocation(BDLocation result) {                Log.e("tag", "BuildingName=" + result.getBuildingName());                Log.e("tag", "Country=" + result.getCountry());                Log.e("tag", "City=" + result.getCity());                Log.e("tag", "AddrStr=" + result.getAddrStr());                Log.e("tag", "Street=" + result.getStreet());                Log.e("tag", "Latitude=" + result.getLatitude());//纬度                Log.e("tag", "Longitude=" + result.getLongitude());//经度                Log.e("tag", "Radius=" + result.getRadius());//获取定位精度                Log.e("tag", "Direction=" + result.getDirection());//获取手机当前方向                Log.e("tag", "District=" + result.getDistrict());//获取区/县信息                Log.e("tag", "Floor=" + result.getFloor());//获取楼层信息,仅室内定位有效                if (result != null) {                    MyLocationData data = new MyLocationData.Builder()                            .accuracy(100)//                            .accuracy(result.getRadius())                            .latitude(result.getLatitude())                            .longitude(result.getLongitude()).build();                    // 设置定位数据                    mBaiduMap.setMyLocationData(data);                    LatLng ll = new LatLng(result.getLatitude(),                            result.getLongitude());                    MapStatus.Builder builder = new MapStatus.Builder();                    //地图缩放比设置为18                    builder.target(ll).zoom(18.0f);                    mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));                }  nnrride            public void onConnectHotSpotMessage(String s, int i) {                Log.e("tag", "s=" + s + "i=" + i);            }        });        geo = BitmapDescriptorFactory.fromResource(R.mipmap.location_marker);        MyLocationConfiguration configuration = new MyLocationConfiguration(                MyLocationConfiguration.LocationMode.FOLLOWING, true, geo);        mBaiduMap.setMyLocationConfigeration(configuration);// 设置定位模式        mBaiduMap.setMyLocationEnabled(true);// 打开定位图层        mlocationClient.start();// 调用此方法开始定位    }}

五 、xml布局文件

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.junto.baidumaptest.MainActivity">    <com.baidu.mapapi.map.MapView        android:id="@+id/mapView"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:clickable="true"/>    <Button        android:id="@+id/btn_click"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentBottom="true"        android:layout_marginBottom="40dp"        android:text="获取当前位置"/></RelativeLayout>

此例子还用到了一个地图标注信息的实体类,代码如下:

package com.junto.baidumaptest;import java.io.Serializable;/** * Created by wangjinyong on 2017/8/11. * 地图标注信息实体类 */public class MarkerInfoUtil implements Serializable {    private double latitude;//纬度    private double longitude;//经度    private String name;//名字    private int imgId;//图片    private String description;//描述    //构造方法    public MarkerInfoUtil() {}    public MarkerInfoUtil(double latitude, double longitude, String name, int imgId, String description) {        super();        this.latitude = latitude;        this.longitude = longitude;        this.name = name;        this.imgId = imgId;        this.description = description;    }    //toString方法    @Override    public String toString() {        return "MarkerInfoUtil [latitude=" + latitude + ", longitude=" + longitude + ", name=" + name + ", imgId="                + imgId + ", description=" + description + "]";    }    //getter setter    public double getLatitude() {        return latitude;    }    public void setLatitude(double latitude) {        this.latitude = latitude;    }    public double getLongitude() {        return longitude;    }    public void setLongitude(double longitude) {        this.longitude = longitude;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getImgId() {        return imgId;    }    public void setImgId(int imgId) {        this.imgId = imgId;    }    public String getDescription() {        return description;    }    public void setDescription(String description) {        this.description = description;    }}

到这里基本功能就已经实现了,有不足之处欢迎大家提出意见
下面附上本例子源码下载地址供参考
Demo源码