Android开发之百度地图定位以及简单覆盖物的实现
生活随笔
收集整理的這篇文章主要介紹了
Android开发之百度地图定位以及简单覆盖物的实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
直接上代碼:
先看下效果圖:
?
我這里主要做了三個功能:
1.一秒鐘實時定位功能;
2.添加任意經緯度地點到地圖上;
3.判斷朝陽門是否在本人定位范圍1000米內;
百度地圖初始化方法:
DemoApplication.java
package com.qfy.qfymap;import android.app.Application;import com.baidu.mapapi.CoordType; import com.baidu.mapapi.SDKInitializer;public class DemoApplication extends Application {@Overridepublic void onCreate() {super.onCreate();// 在使用 SDK 各組間之前初始化 context 信息,傳入 ApplicationContextSDKInitializer.initialize(this);//自4.3.0起,百度地圖SDK所有接口均支持百度坐標和國測局坐標,用此方法設置您使用的坐標類型.//包括BD09LL和GCJ02兩種坐標,默認是BD09LL坐標。SDKInitializer.setCoordType(CoordType.BD09LL);} }mainactivity.java
package com.qfy.qfymap;import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; 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.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.MyLocationConfiguration.LocationMode; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.utils.SpatialRelationUtil;/*** 此demo用來展示如何結合定位SDK實現定位,并使用MyLocationOverlay繪制定位位置 同時展示如何使用自定義圖標繪制并點擊時彈出泡泡*/ public class MainActivity extends Activity implements SensorEventListener {// 定位相關LocationClient mLocClient;public MyLocationListenner myListener = new MyLocationListenner();private LocationMode mCurrentMode;BitmapDescriptor mCurrentMarker;private static final int accuracyCircleFillColor = 0xAAFFFF88;private static final int accuracyCircleStrokeColor = 0xAA00FF00;private SensorManager mSensorManager;private Double lastX = 0.0;private int mCurrentDirection = 0;private double mCurrentLat = 0.0;private double mCurrentLon = 0.0;private float mCurrentAccracy;MapView mMapView;BaiduMap mBaiduMap;// 初始化全局 bitmap 信息,不用時及時 recycleBitmapDescriptor bdA = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);BitmapDescriptor bdB = BitmapDescriptorFactory.fromResource(R.drawable.icon_markb);// UI相關OnCheckedChangeListener radioButtonListener;Button requestLocButton;boolean isFirstLoc = true; // 是否首次定位private MyLocationData locData;private float direction;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);requestLocButton = (Button) findViewById(R.id.button1);mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);//獲取傳感器管理服務mCurrentMode = LocationMode.NORMAL;requestLocButton.setText("普通");OnClickListener btnClickListener = new OnClickListener() {public void onClick(View v) {switch (mCurrentMode) {case NORMAL:requestLocButton.setText("跟隨");mCurrentMode = LocationMode.FOLLOWING;mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));MapStatus.Builder builder = new MapStatus.Builder();builder.overlook(0);mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));break;case COMPASS:requestLocButton.setText("普通");mCurrentMode = LocationMode.NORMAL;mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));MapStatus.Builder builder1 = new MapStatus.Builder();builder1.overlook(0);mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder1.build()));break;case FOLLOWING:requestLocButton.setText("羅盤");mCurrentMode = LocationMode.COMPASS;mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));break;default:break;}}};requestLocButton.setOnClickListener(btnClickListener);RadioGroup group = (RadioGroup) this.findViewById(R.id.radioGroup);radioButtonListener = new OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {if (checkedId == R.id.defaulticon) {// 傳入null則,恢復默認圖標mCurrentMarker = null;mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, null));}if (checkedId == R.id.customicon) {// 修改為自定義markermCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker,accuracyCircleFillColor, accuracyCircleStrokeColor));}}};group.setOnCheckedChangeListener(radioButtonListener);// 地圖初始化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); // 打開gpsoption.setCoorType("bd09ll"); // 設置坐標類型option.setScanSpan(1000);mLocClient.setLocOption(option);mLocClient.start();mBaiduMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {@Overridepublic void onMapLoaded() {initOverlay();}});}/*** 初始化Overlay*/public void initOverlay() {// add marker overlay // LatLng llA = new LatLng(39.94019, 116.43876);LatLng llA = new LatLng(40.123798,116.28088);LatLng llB = new LatLng(39.940398, 116.438944);MarkerOptions ooA = new MarkerOptions().position(llA).icon(bdA);Marker mMarkerA = (Marker) (mBaiduMap.addOverlay(ooA));MarkerOptions ooB = new MarkerOptions().position(llB).icon(bdB);Marker mMarkerB = (Marker) (mBaiduMap.addOverlay(ooB));MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(18.0f);mBaiduMap.setMapStatus(msu);}@Overridepublic void onSensorChanged(SensorEvent sensorEvent) {double x = sensorEvent.values[SensorManager.DATA_X];if (Math.abs(x - lastX) > 1.0) {mCurrentDirection = (int) x;locData = new MyLocationData.Builder().accuracy(mCurrentAccracy)// 此處設置開發者獲取到的方向信息,順時針0-360.direction(mCurrentDirection).latitude(mCurrentLat).longitude(mCurrentLon).build();mBaiduMap.setMyLocationData(locData);}lastX = x;}@Overridepublic void onAccuracyChanged(Sensor sensor, int i) {}/*** 定位SDK監聽函數*/public class MyLocationListenner implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {// map view 銷毀后不在處理新接收的位置if (location == null || mMapView == null) {return;}mCurrentLat = location.getLatitude();mCurrentLon = location.getLongitude();mCurrentAccracy = location.getRadius();Log.e("打印半徑", mCurrentAccracy + "==");locData = new MyLocationData.Builder().accuracy(location.getRadius())// 此處設置開發者獲取到的方向信息,順時針0-360.direction(mCurrentDirection).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()));}//定位成功后取到經緯度信息MyLocationData locationData = mBaiduMap.getLocationData();double lt = locationData.latitude;double li = locationData.longitude;Log.e("打印經緯度1", li + "," + lt);Log.e("打印經緯度2", mCurrentLon + "," + mCurrentLat); // Toast.makeText(MainActivity.this, "朝陽門是否在融寶打卡范圍內?" + SpatialRelationUtil.isCircleContainsPoint(new LatLng(116.440149,39.939851), 30, new LatLng(116.440108, 39.93058)), Toast.LENGTH_LONG).show();Toast.makeText(MainActivity.this, "朝陽門是否在公司打卡范圍內?" + SpatialRelationUtil.isCircleContainsPoint(new LatLng(lt, li), 1000, new LatLng(39.93058, 116.440108)), Toast.LENGTH_LONG).show();}public void onReceivePoi(BDLocation poiLocation) {}}@Overrideprotected void onPause() {mMapView.onPause();super.onPause();}@Overrideprotected void onResume() {mMapView.onResume();super.onResume();//為系統的方向傳感器注冊監聽器mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_UI);}@Overrideprotected void onStop() {//取消注冊傳感器監聽mSensorManager.unregisterListener(this);super.onStop();}@Overrideprotected void onDestroy() {// 退出時銷毀定位mLocClient.stop();// 關閉定位圖層mBaiduMap.setMyLocationEnabled(false);mMapView.onDestroy();mMapView = null;super.onDestroy();}}百度地圖相關jar包庫文件請下載源碼查看:
如果看不懂可以下載源碼:
源碼下載
?
總結
以上是生活随笔為你收集整理的Android开发之百度地图定位以及简单覆盖物的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpaceX 全新猎鹰九号将 Crew-
- 下一篇: 四大系列齐发!索尼2023 BRAVIA