百度地图的简单应用
“`ruby
package com.huawei.mybaidu;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
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.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.DotOptions;
import com.baidu.mapapi.map.GroundOverlayOptions;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.ItemizedOverlay;
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.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import com.baidu.mapapi.model.inner.GeoPoint;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
// private BMapManager mapManager;
private MapView bmapsView;
private BaiduMap mBaiduMap;
private boolean flag = false;
private String provider;
private LocationManager manger;
private Button saltelite;
private Button general;
private Button traffic_map_btn;
private Button heat_map_btn;
private BDLocation location;
private LocationClient mLocationClient;
private BitmapDescriptor mCurrentMarker,bdGround;
private Button locationbt,overlay_btn;
private Marker mMarkerA ;
private Marker mMarkerB ;
private Marker mMarkerC ;
// 初始化全局 bitmap 信息,不用时及时 recycle
BitmapDescriptor bdA = null;
BitmapDescriptor bdB = null;
BitmapDescriptor bdC = null;
BitmapDescriptor bd = null;
// private Button sateliteMap,generalMap;
// private BaiduMap mBaiduMap;
private Drawable drawable;
private ArrayList mOverlayList = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
init();
initOverlay();
//这个是百度地图的覆盖物监听事件
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
public boolean onMarkerClick(final Marker marker) {
Button button = new Button(getApplicationContext());
button.setBackgroundResource(R.drawable.loca);
InfoWindow.OnInfoWindowClickListener listener = null;
if (marker == mMarkerA) {
Toast.makeText(MainActivity.this, “点击成功”,Toast.LENGTH_LONG).show();
} else if (marker == mMarkerB) {
Toast.makeText(MainActivity.this, “拖拽结束,新位置:”, Toast.LENGTH_LONG).show();
} else if (marker == mMarkerC) {
Toast.makeText(MainActivity.this, "拖拽结束,新位置:", Toast.LENGTH_LONG).show();
}
return true;
}
});
}
/**
* 初始化方法
*/
private void init() {
bdGround = BitmapDescriptorFactory
.fromResource(R.drawable.icon_mapgeo);
// 初始化全局 bitmap 信息,不用时及时 recycle
bdA = BitmapDescriptorFactory.fromResource(R.drawable.add);
bdB = BitmapDescriptorFactory.fromResource(R.drawable.add);
bdC = BitmapDescriptorFactory.fromResource(R.drawable.add);
drawable = this.getResources().getDrawable(R.drawable.add);
manger = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);;
// 获取位置
location = new BDLocation();
bmapsView = (MapView) findViewById(R.id.bmapview);
saltelite = (Button) findViewById(R.id.saltelite);
heat_map_btn = (Button) findViewById(R.id.heat_map_btn);
traffic_map_btn = (Button) findViewById(R.id.traffic_map_btn);
overlay_btn = (Button) findViewById(R.id.overlay_btn);
locationbt = (Button) findViewById(R.id.locationbt);
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
mBaiduMap = bmapsView.getMap();
saltelite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
}
});
general = (Button) findViewById(R.id.general);
general.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
}
});
traffic_map_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!flag) {
//开启交通图
mBaiduMap.setTrafficEnabled(true);
flag = true;
}else {
mBaiduMap.setTrafficEnabled(false);
flag = false;
}
}
});
heat_map_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!flag) {
//开启交通图
mBaiduMap.setBaiduHeatMapEnabled(true);
flag = true;
}else {
mBaiduMap.setBaiduHeatMapEnabled(false);
flag = false;
}
}
});
locationbt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
initMapLocation();
setMapLocFollow();
// // 开启定位图层
// LatLng point3 = new LatLng(33.99444722222222, 118.17191944444444);
// LatLng point4 = new LatLng(33.96950277777778, 118.17419722222222);
// LatLng point5 = new LatLng(33.97700555555556, 118.15641944444444);
// LatLng point6 = new LatLng(33.973, 118.14905277777778);
// LatLng point7 = new LatLng(33.996719444444444, 118.16251944444444);
// LatLng point8 = new LatLng(33.997883333333334, 118.14164444444444);
//
//
// BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_mapgeo);
// OverlayOptions options = new MarkerOptions().position(point3)
// .icon(bitmap);
// mBaiduMap.addOverlay(options);
// // 开启定位图层
// mBaiduMap.setMyLocationEnabled(true);
// //画起始点
// mapAddDotItem(point3, Color.RED, 11);
// mapAddDotItem(point4, Color.RED, 11);
// mapAddDotItem(point5, Color.RED, 11);
// mapAddDotItem(point6, Color.RED, 11);
// mapAddDotItem(point7, Color.RED, 11);
// mapAddDotItem(point8, Color.RED, 11);
}
});
overlay_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// LatLng point3 = new LatLng(33.99444722222222, 118.17191944444444);
// LatLng point4 = new LatLng(33.96950277777778, 118.17419722222222);
// LatLng point5 = new LatLng(33.97700555555556, 118.15641944444444);
// LatLng point6 = new LatLng(33.973, 118.14905277777778);
// LatLng point7 = new LatLng(33.996719444444444, 118.16251944444444);
LatLng point8 = new LatLng(33.997883333333334, 118.14164444444444);
//画起始点
mapAddDotItem(point8, Color.RED, 11);
}
});
}
public class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation bdLocation) {
if (location.getLocType()==BDLocation.TypeGpsLocation||location.getLocType()==BDLocation.TypeNetWorkLocation){
navigate(bdLocation);
}
}
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
}
private void navigate(BDLocation bdLocation) {
LatLng ll = new LatLng(location.getLatitude(),location.getAltitude());
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
mBaiduMap.animateMapStatus(update);
update = MapStatusUpdateFactory.zoomTo(16f);
mBaiduMap.animateMapStatus(update);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
bmapsView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
bmapsView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
bmapsView.onPause();
}
private void getProvider(){
// 构建位置查询条件
Criteria criteria = new Criteria();
// 查询精度:高
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 是否查询海拨:否
criteria.setAltitudeRequired(false);
// 是否查询方位角:否
criteria.setBearingRequired(false);
// 是否允许付费:是
criteria.setCostAllowed(true);
// 电量要求:低
criteria.setPowerRequirement(Criteria.POWER_LOW);
// 返回最合适的符合条件的provider,第2个参数为true说明,如果只有一个provider是有效的,则返回当前provider
provider = manger.getBestProvider(criteria,true);
}
class OverlayItem{
public GeoPoint geoPoint1;
public double mLat1;//纬度
public double mLon1 ;//经度
public OverlayItem(GeoPoint geoPoint1, double mLat1, double mLon1) {
this.geoPoint1 = geoPoint1;
this.mLon1 = mLon1;
this.mLat1 = mLat1;
}
public GeoPoint getPoints() {
return geoPoint1;
}
public void setPoints(GeoPoint geoPoint1) {
this.geoPoint1 = geoPoint1;
}
public double getmLat1() {
return mLat1;
}
public void setmLat1(double mLat1) {
this.mLat1 = mLat1;
}
public double getmLon1() {
return mLon1;
}
public void setmLon1(double mLon1) {
this.mLon1 = mLon1;
}
}
// final class MyOverlayItem extends ItemizedOverlay {
//
// /*覆盖物列表集合/
// private ArrayList mOverlayList = new ArrayList();
//
// // 声明double类型的变量存储北京天安门的纬度、经度值
// private double mLat1 = 39.915; // point1纬度
//
// private double mLon1 = 116.404; // point1经度
//
// // 传进来的Drawable对象用于在地图上标注一个地理坐标点
// public MyOverlayItem(Drawable drawable) {
// super(drawable);
//
// // 将GPS纬度经度值转换成以微度的整数形式存储的地理坐标点
//
// /* 注:GeoPoint对象构造方法的参数列表:第一个是参数表示纬度,第二个是经度
// (我们平时都是经纬度这么叫的,想着应该是经度在前的,呵呵。)
// 在网上查了下,GPS的值官方给的就是纬度经度,也就是说纬度是在前的,以前一直没太注意。*/
// GeoPoint geoPoint1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));
//
// // 构造OverlayItem对象并添加到mOverlayList集合里
// mOverlayList.add(new OverlayItem(geoPoint1, mLat1, mLon1));
//
// /*
// * 官方的解释:在一个新ItemizedOverlay上执行所有操作的工具方法。
// * 没搞明白啥意思,但是必须的调用这个方法,否则程序运行报错*/
// populate();
// }
//
// /*
// * 返回的是从指定List集合中,取出的一个OverlayItem对象。
// * mOverlayList集合里一旦有了数据,在调用其之前,
// * 一定的在MyOverlayItem的构造函数里调用这个方法populate();
// */
// @Override
// protected OverlayItem createItem(int index) {
// return mOverlayList.get(index);
// }
//
// @Override
// public int size() {
// return mOverlayList.size();
// }
//
// }
/**
* 定位图层初始化
*/
public void initMapLocation() {
//三种定位模式,跟随,普通,icon_base_compass,LocationMode.FOLLOWING, LocationMode.NORMAL,LocationMode.COMPASS;
MyLocationConfiguration.LocationMode mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;
// 修改为自定义marker,设置定位自定义图标
mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_mapgeo);
mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, null));//null为使用百度地图默认图案
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
}
/**
* 自己封装,百度地图画点函数
*/
public void mapAddDotItem(LatLng lat, int color, int radius) {
//画点
LatLng llDot = new LatLng(lat.latitude, lat.longitude);
OverlayOptions ooDot = new DotOptions().center(llDot).radius(radius)
.color(color);
mBaiduMap.addOverlay(ooDot);
}
private void setMapLocFollow() {
//设定中心点坐标
LatLng cenpt = new LatLng(33.983626,118.163161);
//定义地图状态
MapStatus mMapStatus = new MapStatus.Builder()
//要移动的点
.target(cenpt)
//放大地图到20倍
.zoom(13)
.build();
//定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
//改变地图状态
mBaiduMap.setMapStatus(mMapStatusUpdate);
}
public void initOverlay() {
// 添加覆盖物的坐标
LatLng llA = new LatLng(36.05, 103.83);
LatLng llB = new LatLng(36.15, 103.78);
LatLng llC = new LatLng(36.20, 103.65);
LatLng llD = new LatLng(36.25, 103.32);
OverlayOptions ooA = new MarkerOptions().position(llA).icon(bdA)
.zIndex(9).draggable(true);
mMarkerA = (Marker) (mBaiduMap.addOverlay(ooA));
OverlayOptions ooB = new MarkerOptions().position(llB).icon(bdB)
.zIndex(5);
mMarkerB = (Marker) (mBaiduMap.addOverlay(ooB));
OverlayOptions ooC = new MarkerOptions().position(llC).icon(bdC)
.perspective(false).anchor(0.5f, 0.5f).rotate(30).zIndex(7);
mMarkerC = (Marker) (mBaiduMap.addOverlay(ooC));
// ArrayList<BitmapDescriptor> giflist = new
// ArrayList<BitmapDescriptor>();
// giflist.add(bdA);
// giflist.add(bdB);
// giflist.add(bdC);
// OverlayOptions ooD = new MarkerOptions().position(llD).icons(giflist)
// .zIndex(0).period(10);
// mMarkerD = (Marker) (mBaiduMap.addOverlay(ooD));
// // 添加弹出窗覆盖物的区域
// LatLng southwest = new LatLng(36.05, 103.83);
// LatLng northeast = new LatLng(36.20, 103.65);
// LatLngBounds bounds = new LatLngBounds.Builder().include(northeast)
// .include(southwest).build();
//
// OverlayOptions ooGround = new GroundOverlayOptions()
// .positionFromBounds(bounds).image(bdGround).transparency(0.8f);
// mBaiduMap.addOverlay(ooGround);
// //
// // MapStatusUpdate u = MapStatusUpdateFactory
// // .newLatLng(bounds.getCenter());
// // mBaiduMap.setMapStatus(u);
//
// mBaiduMap.setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() {
// public void onMarkerDrag(Marker marker) {
// }
//
// public void onMarkerDragEnd(Marker marker) {
// Toast.makeText(
// MainActivity.this,
// “拖拽结束,新位置:” + marker.getPosition().latitude + “, ”
// + marker.getPosition().longitude,
// Toast.LENGTH_LONG).show();
// }
//
// public void onMarkerDragStart(Marker marker) {
// }
// });
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)