package book.project.my.book;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TextView;
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.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
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.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.utils.DistanceUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import book.project.my.MyTools.MyArrayList;
import book.project.my.been.User;
/**
* 此demo用来展示如何结合定位SDK实现定位,并使用MyLocationOverlay绘制定位位置 同时展示如何使用自定义图标绘制并点击时弹出泡泡
*/
public class MapActivity 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;
// UI相关
OnCheckedChangeListener radioButtonListener;
Button requestLocButton;
boolean isFirstLoc = true; // 是否首次定位
private MyLocationData locData;
private float direction;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
initView();
initIntent();
setPoint();
}
double d;
private void bijiaodian(LatLng l){
for(int i = 0;i < list.size();i++){
double juli;
try {
juli = DistanceUtil.getDistance(getJuLi(list.get(i)), l);
}catch (Exception e){
e.printStackTrace();
continue;
}
list.get(i).juli = juli;
if(i == 0)d = juli;
else{
if(d > juli)d = juli;
}
}
if(d == 0)return;
for(int i = 0;i < list.size();i++){
if (list.get(i).juli == d){
list.get(i).min = true;
break;
}
}
setPoint();
}
private void setPoint() {
mBaiduMap.clear();
options = new ArrayList<>();
for(int i = 0;i < list.size();i++){
try{
options.add(setPoint(list.get(i)));
}catch (Exception e){
e.printStackTrace();
}
}
setPoint(options);
}
List<OverlayOptions> options;
List<User> list;
private void initIntent() {
Serializable list = getIntent().getSerializableExtra("list");
this.list = (List<User>) list;
}
private void initView() {
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() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (checkedId == R.id.defaulticon) {
// 传入null则,恢复默认图标
mCurrentMarker = null;
mBaiduMap
.setMyLocationConfiguration(new MyLocationConfiguration(
mCurrentMode, true, null));
}
if (checkedId == R.id.customicon) {
// 修改为自定义marker
mCurrentMarker = BitmapDescriptorFactory
.fromResource(R.mipmap.ic_launcher);
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); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
mLocClient.setLocOption(option);
mLocClient.start();
}
@Override
public 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;
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
/**
* 定位SDK监听函数
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null) {
return;
}
mCurrentLat = location.getLatitude();
mCurrentLon = location.getLongitude();
mCurrentAccracy = location.getRadius();
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()));
bijiaodian(ll);
}
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
mMapView.onResume();
super.onResume();
//为系统的方向传感器注册监听器
mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_UI);
}
@Override
protected void onStop() {
//取消注册传感器监听
mSensorManager.unregisterListener(this);
super.onStop();
}
@Override
protected void onDestroy() {
// 退出时销毁定位
mLocClient.stop();
// 关闭定位图层
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
}
View view;
TextView tv;
public void setPoint(List<OverlayOptions> options) {
mBaiduMap.addOverlays(options);
}
public OverlayOptions setPoint(User user) throws NumberFormatException {
//创建OverlayOptions的集合
// List<OverlayOptions> options = new ArrayList<OverlayOptions>();
String[] split = user.getPosition().split("\\,");
double a = Double.valueOf(split[1]);
double b = Double.valueOf(split[0]);
//设置坐标点
LatLng point1 = new LatLng(a, b);
if (view == null) {
view = View.inflate(MapActivity.this, R.layout.map_scenic_maker, null);
tv = view.findViewById(R.id.tvs);
}
if(user.min = true){
tv.setText("最近:" + user.getName() + " 距离:" + user.juli + " 米");
}else {
tv.setText(user.getName() + " 距离:" + user.juli + " 米");
}
BitmapDescriptor bitmapDescriptor1 = BitmapDescriptorFactory.fromView(view);
OverlayOptions option1 = new MarkerOptions()
.position(point1)
.icon(bitmapDescriptor1);
return option1;
}
private LatLng getJuLi(User user){
String[] split = user.getPosition().split("\\,");
Double a = Double.valueOf(split[1]);
Double b = Double.valueOf(split[0]);
//设置坐标点
return new LatLng(a, b);
}
}
以上代码可以显示当前用户所在位置,如何设置当前用户与距离最近的用户路线规划?
求助 Android百度地图 如何添加两个最近距离点的路线规划
最新推荐文章于 2021-05-31 04:43:50 发布