百度地图

转载请说明出处!

  • 开发工具:android studio 2.2.3
  • 测试手机:夜神模拟器,华为MT2
  • 百度地图版本:4.3.0

效果图:

Map.gif

Activity:

package com.wentong.zt.map;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.CardView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
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.location.LocationClientOption.LocationMode;
import com.baidu.location.Poi;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
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.MyLocationData;
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.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiDetailResult;
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 java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

/**
 * 我的位置
 */
private Button btn_myPosition;
/**
 * 地图
 */
private MapView mapView;
/**
 * 当前位置信息
 */
private TextView tv_myPosition;
/**
 * 卡片
 */
private CardView cardView;
/**
 * 定义 BaiduMap 地图对象的操作方法与接口
 */
private BaiduMap baiduMap;
/**
 * 定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动
 */
private LocationClient locationClient;
/**
 * 定位请求回调接口
 */
private BDLocationListener listener = new MyLocationListener();
/**
 * 是否第一次定位
 */
private boolean isFirstLogin = true;
/**
 * 纬度
 */
private double latitude;
/**
 * 经度
 */
private double longitude;
/**
 * POI检索接口
 */
PoiSearch poiSearch;
/**
 * 展示列表
 */
private RecyclerView recycler;
/**
 * RecyclerView适配器
 */
AdapterRecyclerView adapter;
/**
 * 地理编码查询接口
 */
GeoCoder geocode;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //在使用SDK各组件之前初始化context信息,传入ApplicationContext 注意该方法要再setContentView方法之前实现
    SDKInitializer.initialize(getApplicationContext());
    setContentView(R.layout.activity_main);

    initView();
}

/**
 * create at 2017/4/13 13:37
 * 方法名:initView
 * <p>
 * 方法说明: 初始化界面
 * <p>
 */
private void initView() {
    //绑定控件
    btn_myPosition = (Button) findViewById(R.id.act_main_btn_myPosition);
    mapView = (MapView) findViewById(R.id.act_main_mapView);
    recycler = (RecyclerView) findViewById(R.id.act_main_recycler);
    tv_myPosition = (TextView) findViewById(R.id.act_main_tv_myPosition);
    cardView = (CardView) findViewById(R.id.act_main_cardView);
    //recyclerView属性设置
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recycler.setLayoutManager(linearLayoutManager);
    //实例化定位服务的客户端
    locationClient = new LocationClient(getApplicationContext());
    //注册监听函数
    locationClient.registerLocationListener(listener);
    //配置定位SDK各配置参数,比如定位模式、定位时间间隔、坐标系类型等
    LocationClientOption option = new LocationClientOption();
    option.setLocationMode(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有效时按照1S/1次频率输出GPS结果
    option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
    option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
    option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
    option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
    option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
    //地图对象的操作方法与接口
    baiduMap = mapView.getMap();
    baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);//设置地图类型 MAP_TYPE_NORMAL 普通图; MAP_TYPE_SATELLITE 卫星图;MAP_TYPE_NONE 卫星图
    baiduMap.setBuildingsEnabled(true);//设置是否允许楼块效果
    baiduMap.setMyLocationEnabled(true);//设置是否允许定位图层
    locationClient.setLocOption(option);
    locationClient.start();//开始定位
    //实例化recyclerView适配器
    adapter = new AdapterRecyclerView(this);
    //地图移动监听
    baiduMap.setOnMapStatusChangeListener(onMapStatusChangeListener);
    //我的位置点击事件
    btn_myPosition.setOnClickListener(onClickListener);

}
//地图状态改变相关接口
BaiduMap.OnMapStatusChangeListener onMapStatusChangeListener = new BaiduMap.OnMapStatusChangeListener() {
    /**
     * 手势操作地图,设置地图状态等操作导致地图状态开始改变。
     * @param status 地图状态改变开始时的地图状态
     */
    @Override
    public void onMapStatusChangeStart(MapStatus mapStatus) {

    }
    /**
     * 地图状态变化中
     * @param status 当前地图状态
     */
    @Override
    public void onMapStatusChange(MapStatus mapStatus) {

    }
    /**
     * 地图状态改变结束
     * @param status 地图状态改变结束后的地图状态
     */
    @Override
    public void onMapStatusChangeFinish(MapStatus mapStatus) {
        LatLng latLng = baiduMap.getMapStatus().target;
        if (geocode == null) {//如果地理编码查询接口为空
            geocode = GeoCoder.newInstance();//获取其唯一实例化
        }
        geocode.setOnGetGeoCodeResultListener(onGetGeoCoderResultListener);//设置查询结果监听者
        geocode.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));//发起反地理编码请求(经纬度->地址信息)
        retrieval(latLng);
    }
} ;
//点击事件
View.OnClickListener onClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.act_main_btn_myPosition:
                LatLng latLng = new LatLng(latitude, longitude);//地理坐标基本数据结构
                MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng, 16f);//描述地图状态将要发生的变化
                baiduMap.animateMapStatus(mapStatusUpdate);//以动画方式更新地图状态,动画耗时 300 ms
                break;
        }
    }
} ;
//地理编码/反地理编码结果
OnGetGeoCoderResultListener onGetGeoCoderResultListener = new OnGetGeoCoderResultListener() {
    @Override
    public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
        if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {//没有检索到结果
            return;
        }
        Log.e("地理编码结果", geoCodeResult.getAddress().toString());
        Toast.makeText(MainActivity.this, geoCodeResult.getAddress().toString(), Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
        if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {//没有找到检索结果
            return;
        }
        Log.e("反 Geo Code 结果", reverseGeoCodeResult.getAddress().toString());
        if (cardView.getVisibility() == cardView.GONE) {
            cardView.setVisibility(cardView.VISIBLE);
        }
        //reverseGeoCodeResult.getAddress()简要地址信息
        tv_myPosition.setText(reverseGeoCodeResult.getAddress().toString());
    }
};
/**
 * create at 2017/4/12 11:23
 * 方法名:retrieval
 * <p>
 * 方法说明: 检索周边位置
 * <p>
 */
private void retrieval(LatLng latLng) {
    poiSearch = PoiSearch.newInstance();//创建POI检索实例
    poiSearch.setOnGetPoiSearchResultListener(poiListener);//设置POI检索监听者
    poiSearch.searchNearby(new PoiNearbySearchOption()
            .keyword("小")//检索关键字
            .radius(100)//设置检索的半径范围
            .location(latLng)//检索位置
            .pageNum(10)
            .pageCapacity(10));//发起检索请求
}

//创建POI检索监听者
OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
    @Override
    public void onGetPoiResult(PoiResult poiResult) {//获取POI检索结果
        Log.e("PoiResult", "城市:" + poiResult.getAllPoi().get(0).city + "/n名称:" + poiResult.getAllPoi().get(0).name + "/n地址:" + poiResult.getAllPoi().get(0).address);
        List<PoiInfo> list_poi = poiResult.getAllPoi(); //获取Poi检索结果
        for (PoiInfo p : list_poi) {
            Log.e("poi地址信息", p.address);
            Log.e("poi所在城市", p.city);
            Log.e("poi名称", p.name);
            Log.e("poi类型", p.type + "");
        }
        ArrayList<PoiInfo> arr = (ArrayList) poiResult.getAllPoi();
        adapter.setArrayList(arr);
        recycler.setAdapter(adapter);
    }

    @Override
    public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {//获取Place详情页检索结果
        Log.e("PoiDetailResult", "进入了PoiDetailResult方法");
    }

    @Override
    public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {//获取室内POI搜索结果
        Log.e("PoiIndoorResult", "进入了PoiIndoorResult方法");
    }
};

public class MyLocationListener implements BDLocationListener {

    @Override
    public void onReceiveLocation(BDLocation location) {
        //获取定位结果
        StringBuffer sb = new StringBuffer(256);
        sb.append("time : ");
        sb.append(location.getTime());    //获取定位时间
        sb.append("\nerror code : ");
        sb.append(location.getLocType());    //获取类型类型
        sb.append("\nlatitude : ");
        sb.append(location.getLatitude());    //获取纬度信息
        sb.append("\nlontitude : ");
        sb.append(location.getLongitude());    //获取经度信息
        sb.append("\nradius : ");
        sb.append(location.getRadius());    //获取定位精准度
        if (location.getLocType() == BDLocation.TypeGpsLocation) {
            // GPS定位结果
            sb.append("\nspeed : ");
            sb.append(location.getSpeed());    // 单位:公里每小时
            sb.append("\nsatellite : ");
            sb.append(location.getSatelliteNumber());    //获取卫星数
            sb.append("\nheight : ");
            sb.append(location.getAltitude());    //获取海拔高度信息,单位米
            sb.append("\ndirection : ");
            sb.append(location.getDirection());    //获取方向信息,单位度
            sb.append("\naddr : ");
            sb.append(location.getAddrStr());    //获取地址信息
            sb.append("\ndescribe : ");
            sb.append("gps定位成功");
        } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
            // 网络定位结果
            sb.append("\naddr : ");
            sb.append(location.getAddrStr());    //获取地址信息
            sb.append("\noperationers : ");
            sb.append(location.getOperators());    //获取运营商信息
            sb.append("\ndescribe : ");
            sb.append("网络定位成功");
        } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {
            // 离线定位结果
            sb.append("\ndescribe : ");
            sb.append("离线定位成功,离线定位结果也是有效的");
        } else if (location.getLocType() == BDLocation.TypeServerError) {
            sb.append("\ndescribe : ");
            sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
        } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
            sb.append("\ndescribe : ");
            sb.append("网络不同导致定位失败,请检查网络是否通畅");
        } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
            sb.append("\ndescribe : ");
            sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
        }
        sb.append("\nlocationdescribe : ");
        sb.append(location.getLocationDescribe());    //位置语义化信息
        List<Poi> list = location.getPoiList();    // POI数据
        if (list != null) {
            sb.append("\npoilist size = : ");
            sb.append(list.size());
            for (Poi p : list) {
                sb.append("\npoi= : ");
                sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
            }
        }
        Log.i("BaiduLocationApiDem", sb.toString());

        latitude = location.getLatitude();
        longitude = location.getLongitude();
        // map view 销毁后不在处理新接收的位置
        if (location == null || mapView == null)
            return;
        MyLocationData locData = new MyLocationData.Builder()
                .accuracy(location.getRadius())
                .direction(100)// 此处设置开发者获取到的方向信息,顺时针0-360
                .latitude(location.getLatitude())
                .longitude(location.getLongitude())
                .build();
        baiduMap.setMyLocationData(locData);
        if (isFirstLogin) {//如果是第一次加载地图
            isFirstLogin = false;
            LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());//地理坐标基本数据结构
            MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll, 16.0f);//设置地图中心点以及缩放级别
            baiduMap.animateMapStatus(u);//以动画方式更新地图状态,动画耗时 300 ms
            retrieval(new LatLng(latitude, longitude));//检索周边信息
            geocode = GeoCoder.newInstance();//获取新建地理编码查询
            geocode.setOnGetGeoCodeResultListener(onGetGeoCoderResultListener);//设置查询结果监听者
            geocode.reverseGeoCode(new ReverseGeoCodeOption().location(ll));//发起反地理编码请求(经纬度->地址信息)
        }
    }

    @Override
    public void onConnectHotSpotMessage(String s, int i) {

    }
}

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

@Override
protected void onDestroy() {
    mapView.onDestroy();//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
    if (poiSearch != null) {
        poiSearch.destroy();
    }
    if (geocode != null) {
        geocode.destroy();
    }
    super.onDestroy();
}

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

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.wentong.zt.map.MainActivity">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="?actionBarSize"
    android:gravity="center_vertical">

    <Button
        android:id="@+id/act_main_btn_retrieval"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:text="返回" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="位置信息" />

    <Button
        android:id="@+id/act_main_btn_myPosition"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:text="我的位置" />

</RelativeLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

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

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:gravity="center"
                android:orientation="vertical">

                <android.support.v7.widget.CardView
                    android:id="@+id/act_main_cardView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:visibility="gone">

                    <TextView
                        android:id="@+id/act_main_tv_myPosition"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_margin="5dp"
                        android:textColor="#000000" />

                </android.support.v7.widget.CardView>

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/mark_normal" />

            </LinearLayout>

        </RelativeLayout>

  </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_weight="2">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/act_main_recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#ffffff">
        </android.support.v7.widget.RecyclerView>

    </LinearLayout>

</LinearLayout>

</LinearLayout>

AdapterRecyclerView:

package com.wentong.zt.map;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.baidu.mapapi.search.core.PoiInfo;
import java.util.ArrayList;
import static com.baidu.location.h.j.ar;
/**
 * Created by Administrator on 2017/4/12.
 */

public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.My>{


Context context ;
ArrayList<PoiInfo> arrayList ;

public AdapterRecyclerView(Context context) {
    this.context = context;
    arrayList = new ArrayList<>() ;
}

public ArrayList<PoiInfo> getArrayList() {
    return arrayList;
}

public void setArrayList(ArrayList<PoiInfo> arrayList) {
    this.arrayList = arrayList;
}

@Override
public My onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.adapter_recycler , parent , false) ;
    My my = new My(view) ;
    return my;
}

@Override
public void onBindViewHolder(My holder, int position) {
    holder.tv_city.setText(arrayList.get(position).address);
    holder.tv_name.setText(arrayList.get(position).name);
}

@Override
public int getItemCount() {
    return arrayList.size();
}

class My extends RecyclerView.ViewHolder{

    TextView tv_name , tv_city ;
    public My(View itemView) {
        super(itemView);
        tv_name = (TextView) itemView.findViewById(R.id.ada_recycler_tv_name) ;
        tv_city = (TextView) itemView.findViewById(R.id.ada_recycler_tv_city) ;
    }
}
 }

adapter_recycler XML:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:orientation="vertical">

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="10dp">

        <TextView
            android:id="@+id/ada_recycler_tv_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center" />

        <TextView
            android:id="@+id/ada_recycler_tv_city"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:gravity="center" />

    </LinearLayout>

</android.support.v7.widget.CardView>

</LinearLayout>

题外话:

  • 整理思路:
    1、我们要在手机上显示出百度地图:
    xml:
    <com.baidu.mapapi.map.MapView
    android:id="@+id/act_main_mapView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    </com.baidu.mapapi.map.MapView>
    在使用SDK各组件之前初始化context信息,传入ApplicationContext 注意该方法要再setContentView方法之前实现
    SDKInitializer.initialize(getApplicationContext());
    2、如何获取我们的位置

定位请求回调接口

private BDLocationListener listener = new MyLocationListener();

       public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
        //获取定位结果
        StringBuffer sb = new StringBuffer(256);
        sb.append("time : ");
        sb.append(location.getTime());    //获取定位时间
        sb.append("\nerror code : ");
        sb.append(location.getLocType());    //获取类型类型
        sb.append("\nlatitude : ");
        sb.append(location.getLatitude());    //获取纬度信息
        sb.append("\nlontitude : ");
        sb.append(location.getLongitude());    //获取经度信息
        sb.append("\nradius : ");
        sb.append(location.getRadius());    //获取定位精准度
        if (location.getLocType() == BDLocation.TypeGpsLocation) {
            // GPS定位结果
            sb.append("\nspeed : ");
            sb.append(location.getSpeed());    // 单位:公里每小时
            sb.append("\nsatellite : ");
            sb.append(location.getSatelliteNumber());    //获取卫星数
            sb.append("\nheight : ");
            sb.append(location.getAltitude());    //获取海拔高度信息,单位米
            sb.append("\ndirection : ");
            sb.append(location.getDirection());    //获取方向信息,单位度
            sb.append("\naddr : ");
            sb.append(location.getAddrStr());    //获取地址信息
            sb.append("\ndescribe : ");
            sb.append("gps定位成功");
        } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
            // 网络定位结果
            sb.append("\naddr : ");
            sb.append(location.getAddrStr());    //获取地址信息
            sb.append("\noperationers : ");
            sb.append(location.getOperators());    //获取运营商信息
            sb.append("\ndescribe : ");
            sb.append("网络定位成功");
        } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {
            // 离线定位结果
            sb.append("\ndescribe : ");
            sb.append("离线定位成功,离线定位结果也是有效的");
        } else if (location.getLocType() == BDLocation.TypeServerError) {
            sb.append("\ndescribe : ");
            sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
        } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
            sb.append("\ndescribe : ");
            sb.append("网络不同导致定位失败,请检查网络是否通畅");
        } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
            sb.append("\ndescribe : ");
            sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
        }
        sb.append("\nlocationdescribe : ");
        sb.append(location.getLocationDescribe());    //位置语义化信息
        List<Poi> list = location.getPoiList();    // POI数据
        if (list != null) {
            sb.append("\npoilist size = : ");
            sb.append(list.size());
            for (Poi p : list) {
                sb.append("\npoi= : ");
                sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
            }
        }
        Log.i("BaiduLocationApiDem", sb.toString());

        location.getLatitude();//纬度
        location.getLongitude();//经度

    @Override
    public void onConnectHotSpotMessage(String s, int i) {

    }
  }

我们的位置(经纬度)

location.getLatitude();//纬度
location.getLongitude();//经度

3、如何在屏幕中显示我们当前的位置:

LatLng latLng = new LatLng(纬度, 经度);
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng, 16f);
baiduMap.animateMapStatus(mapStatusUpdate);

4、滑动地图标注跟着一起动?

不得不说当时我也是懵逼状态,好在本少爷天资纵横。
这其实是我的一种错觉,根据初中物理所学,物体的运动是相互的。我看到的标注随着地图滑动而运动是错误的,其实那个标注从未移动,是我的眼睛欺骗了我。想明白这一点做这个就很简单了。我们在布局中的地图正中心钉死一张图片,然后我们获取在屏幕正中心的经纬度。根据经纬度获取地理位置信息,根据经纬度进行Poi检索。

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.wentong.zt.map.MainActivity">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

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

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:gravity="center"
                android:orientation="vertical">

                <android.support.v7.widget.CardView
                    android:id="@+id/act_main_cardView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:visibility="gone">

                    <TextView
                        android:id="@+id/act_main_tv_myPosition"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_margin="5dp"
                        android:textColor="#000000" />

                </android.support.v7.widget.CardView>


                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/mark_normal" />

            </LinearLayout>

        </RelativeLayout>

    </LinearLayout>
</LinearLayout>

5、地图移动监听:

地图对象的操作方法与接口

baiduMap = mapView.getMap();

地图移动监听

baiduMap.setOnMapStatusChangeListener(onMapStatusChangeListener);

地图状态改变相关接口

BaiduMap.OnMapStatusChangeListener onMapStatusChangeListener = new BaiduMap.OnMapStatusChangeListener() {
    /**
     * 手势操作地图,设置地图状态等操作导致地图状态开始改变。
     * @param status 地图状态改变开始时的地图状态
     */
    @Override
    public void onMapStatusChangeStart(MapStatus mapStatus) {

    }
    /**
     * 地图状态变化中
     * @param status 当前地图状态
     */
    @Override
    public void onMapStatusChange(MapStatus mapStatus) {

    }
    /**
     * 地图状态改变结束
     * @param status 地图状态改变结束后的地图状态
     */
    @Override
    public void onMapStatusChangeFinish(MapStatus mapStatus) {
        LatLng latLng = baiduMap.getMapStatus().target;//地图操作中心点在屏幕中的坐标
        if (geocode == null) {
            geocode = GeoCoder.newInstance();
        }
        //根据坐标获取地理位置信息,也就是百度官网所说的反Geo地理编码
        geocode.setOnGetGeoCodeResultListener(onGetGeoCoderResultListener);
        geocode.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));
        retrieval(latLng);//根据经纬度检索周边信息
    }
} ;

6、地理编码,反地理编码

通俗点讲 : 地理编码就是根据地理位置信息获取经纬度(例:广岛--(经度,纬度))
反地理编码就是根据经纬度获取地理位置信息(例:(经度,纬度)--长崎)

地理编码查询接口

GeoCoder geocode = GeoCoder.newInstance();
geocode.setOnGetGeoCodeResultListener(onGetGeoCoderResultListener);
geocode.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));

地理编码、反地理编码结果

OnGetGeoCoderResultListener onGetGeoCoderResultListener = new OnGetGeoCoderResultListener() {
    @Override
    public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
        if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {//没有检索到结果
            return;
        }
        Log.e("地理编码结果", geoCodeResult.getAddress().toString());

    }

    @Override
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
        if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {//没有找到检索结果
            return;
        }
        Log.e("反 Geo Code 结果", reverseGeoCodeResult.getAddress().toString());
    }
};

7、Poi之周边信息检索

PoiSearch poiSearch = PoiSearch.newInstance();//创建POI检索实例
poiSearch.setOnGetPoiSearchResultListener(poiListener);//设置POI检索监听者
poiSearch.searchNearby(new PoiNearbySearchOption()
            .keyword("小")//检索关键字
            .radius(100)//设置检索的半径范围
            .location(new LatLng(纬度, 经度))//检索位置
            .pageNum(10)//分页编号
            .pageCapacity(10));//发起检索请求

8、github地址:https://github.com/DingMr/Map

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容