百度地图定位到详细信息

大家好,我是一个新手,最近公司不忙自己写了一个基于百度定位的Demo,能获取到详细的小区信息,希望能帮助到和我一样的新手,写的不好请见谅

实现后的效果:


     


步骤如下:

1.申请一个百度地图的key
<meta-data android:
name="com.baidu.lbsapi.API_KEY"

android:value="key"/>

http://lbsyun.baidu.com/index.php?title=androidsdk

2.复制权限

3.复制一个服务
<service android:name="com.baidu.location.f" android:process=":remote" android:enabled="true"> </service>

4.在build.gradle中的adnroid下复制
sourceSets {
        main {
            jniLibs.srcDir 'libs'
        }
}


5.res下复制控件MapView 里面只有一个MapView控件


6直接复制代码:

package kunpeng.com.myapplication;

import android.database.DataSetObserver;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.location.Address;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.Poi;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
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.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.inner.GeoPoint;
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 java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private MapView mMapView = null;

    private BaiduMap baiduMap;
    private TextView tv;
    //方便后期获取到定位的数据
    private BDLocation location;

    GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //初始化地图第一步
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        //初始化百度地图
        initMap();
        //定位初始化
        initLocation();
        tv = (TextView) findViewById(R.id.tv);

    }
    public LocationClient mLocationClient = null;
    BDLocationListener myBDLocationListener = new MyBDLocationListener();
    private void initLocation() {
        // 开启定位图层
        baiduMap.setMyLocationEnabled(true);
        mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类
        mLocationClient.registerLocationListener(myBDLocationListener);            //注册监听函数

        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.setAddrType("all");//返回的定位结果包含地址信息
        option.setPriority(LocationClientOption.GpsFirst); // 设置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仿真结果,默认需要
        option.disableCache(false);//禁止启用缓存定位
        mLocationClient.setLocOption(option);
        mLocationClient.start();

    }
    private LatLng myLocation;
    private boolean isFirstLoc = true;

    public class MyBDLocationListener implements BDLocationListener {

        /**
         * 接收异步返回的定位结果,参数是BDLocation类型参数
         */
        @Override
        public void onReceiveLocation(BDLocation location) {
            if (location == null) {
                return;
            }

            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) {
                sb.append("\nspeed : ");
                sb.append(location.getSpeed());
                sb.append("\nsatellite : ");
                sb.append(location.getSatelliteNumber());
            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
                sb.append("\naddr : ");
                sb.append(location.getAddrStr());
            }

            Log.e("log", sb.toString());
            MainActivity.this.location = location;
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(100).latitude(location.getLatitude())
                    .longitude(location.getLongitude())
                    .build();
            baiduMap.setMyLocationData(locData);
            myLocation = new LatLng(location.getLatitude(), location.getLongitude());
            if (isFirstLoc) {
                isFirstLoc = false;
                MapStatus.Builder builder = new MapStatus.Builder();
                builder.target(myLocation).zoom(19.0f);
                baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
            }
            double latitude = location.getLatitude();
            double longitude = location.getLongitude();
          //  getLocal(latitude,longitude);       //可以获取到辅路,方法一
            //tv.setText(location.getAddrStr());  //可以获取到辅路 方法二
            getdata(location,myLocation);

        }
        public void onReceivePoi(BDLocation poiLocation) {
        }
    }



    //获取大厦具体的位置
    private void getdata(final BDLocation location, LatLng ll) {
        GeoCoder geoCoder = GeoCoder.newInstance();
        //
        OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
            // 反地理编码查询结果回调函数
            @Override
            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
                if (result == null
                        || result.error != SearchResult.ERRORNO.NO_ERROR) {
                    // 没有检测到结果
                    Toast.makeText(MainActivity.this, "抱歉,未能找到结果",
                            Toast.LENGTH_LONG).show();
                    return;
                }
                ArrayList<PoiInfo> poiInfos = (ArrayList<PoiInfo>) result.getPoiList();
                //可以获取到具体的大厦的位置
                PoiInfo poiInfo = poiInfos.get(0);
             //   tv.setText(location.getAddrStr()+poiInfo.name);  //北京市朝阳区朝阳路辅路东城国际公寓
                tv.setText(poiInfo.address);                     //北京市东四环慈云寺东区国际
                onClickLocation.getLocation(location.getAddrStr()+poiInfo.name);
            }

            // 地理编码查询结果回调函数
            @Override
            public void onGetGeoCodeResult(GeoCodeResult result) {
                if (result == null
                        || result.error != SearchResult.ERRORNO.NO_ERROR) {
                    // 没有检测到结果
                }
            }
        };
        // 设置地理编码检索监听者
        geoCoder.setOnGetGeoCodeResultListener(listener);
        //
        geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(ll));
    }
    //获取定位的具体信息,但是只能获取到辅路 地理编码可以单独获取不需要定位等代码
   /* public void getLocal(double latitude, double longitude) {
        mSearch = GeoCoder.newInstance();

        LatLng latLng = new LatLng(latitude,longitude);
        mSearch.reverseGeoCode(new ReverseGeoCodeOption()
                .location(latLng));

        mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
            @Override
            public void onGetGeoCodeResult(GeoCodeResult result) {
                if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                    Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
                            .show();
                    return;
                }
                baiduMap.clear();
                baiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
                        .icon(BitmapDescriptorFactory
                                .fromResource(R.drawable.icon_marka)));
                baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
                        .getLocation()));
                String strInfo = String.format("纬度:%f 经度:%f",
                        result.getLocation().latitude, result.getLocation().longitude);
                Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
                tv.setText(strInfo);
            }

            @Override
            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
                if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                    Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
                            .show();
                    return;
                }
                baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
                        .getLocation()));
                Toast.makeText(MainActivity.this, result.getAddress(),
                        Toast.LENGTH_LONG).show();
                tv.setText(result.getAddress());

            }
        });
    }*/

    private void initMap() {
        //初始化地图
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        //注意该方法要再setContentView方法之前实现

        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        baiduMap = mMapView.getMap();
        // 设置地图是默认样式的地图
        baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, null));
        baiduMap.setMyLocationEnabled(true);



}

    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 关闭定位图层
        baiduMap.setMyLocationEnabled(false);
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
    }

    //通过回调获取到地址
    public interface OnClickLocation {
        /**
         * String location: 获取到的地址
         * */
        void getLocation(String location);

    }
    public OnClickLocation onClickLocation ;

    public void setOnClickListener(OnClickLocation onClickLocation) {

        this.onClickLocation  = onClickLocation ;

    }

}

我也是一个新手,大家搜到我的文章,希望能给大家带来帮助; 微笑 微笑勿喷


大家有什么好的地址:源码地址,开源框架地址可以@到评论中

          

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值