19软件2班 百度地图
登录账号 申请应用
https://map.baidu.com
http://lbsyun.baidu.com/
将dubug.keystore文件直接复制一份 放在 java bin目录下面
keytool -list -v -keystore debug.keystore
拿到sha1
32:13:5C:4F:9F:D0:96:DE:7E:5F:98:AE:77:DB:53:16:C7:42:60:5F
下载sdk,将需要的so和jar放到libs
MapApplication.java 内容
package com.example.demo;
import android.app.Application;
import android.util.Log;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
public class MapApplication extends Application {
@Override
public void onCreate() {
Log.e("MapApplication", "onCreate");
super.onCreate();
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
SDKInitializer.initialize(this);
//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
SDKInitializer.setCoordType(CoordType.BD09LL);
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.baidu.mapapi.map.MapView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/bmap_view"/>
</LinearLayout>
MainActivity.java
package com.example.demo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.baidu.mapapi.map.MapView;
public class MainActivity extends AppCompatActivity {
private MapView bmap_view;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bmap_view = findViewById(R.id.bmap_view);
}
@Override
protected void onResume() {
super.onResume();
bmap_view.onResume();
}
@Override
protected void onPause() {
super.onPause();
bmap_view.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
bmap_view.onDestroy();
}
}
运行效果
切换地图类型
bmap_view = findViewById(R.id.bmap_view);
baiduMap = bmap_view.getMap();
baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
交通图
//开启交通图
mBaiduMap.setTrafficEnabled(true);
//开启热力图
mBaiduMap.setBaiduHeatMapEnabled(true);
显示定位
定义一个LocationListener
// 定义一个LocationListener
class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
Log.e("MyLocationListener", "onReceiveLocation location = " + location.toString());
//mapView 销毁后不在处理新接收的位置
if (bdLocation == null || bmap_view == null){
return;
}
// 使用新的经纬度构建一个update属性
LatLng latLng = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(latLng);
baiduMap.animateMapStatus(update);
// 调整缩放级别
update = MapStatusUpdateFactory.zoomTo(18);
baiduMap.animateMapStatus(update);
/** 这段代码 屏幕没有刷新 。。。
MyLocationData locData = new MyLocationData.Builder()
.accuracy(bdLocation.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(bdLocation.getDirection()).latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude()).build();
baiduMap.setMyLocationData(locData);
**/
}
}
使用客户端开启定位
// 开启百度定位
private void startLocate() {
locationClient = new LocationClient(MainActivity.this);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);
option.setCoorType("bd09ll");
option.setScanSpan(1000);
locationClient.setLocOption(option);
MyLocationListener listener = new MyLocationListener();
locationClient.registerLocationListener(listener);
locationClient.start();
}
设置定位图标
// 设置定位图标
MyLocationConfiguration myLocationConfiguration = new MyLocationConfiguration(
MyLocationConfiguration.LocationMode.NORMAL,
true,
BitmapDescriptorFactory.fromResource(R.drawable.location),
0xAAFFFF88,
0xAA00FF00
);
baiduMap.setMyLocationConfiguration(myLocationConfiguration);
事件交互
// 1.设置地图状态变化的listener
baiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {
@Override
public void onMapStatusChangeStart(MapStatus mapStatus) {
Log.e("onMapStatusChangeStart", mapStatus.toString());
// MapStatus@4324312
}
@Override
public void onMapStatusChangeStart(MapStatus mapStatus, int i) {
Log.e("onMapStatusChangeStart", mapStatus.toString() + "i = " + i);
}
@Override
public void onMapStatusChange(MapStatus mapStatus) {
Log.e("onMapStatusChange", mapStatus.toString());
}
@Override
public void onMapStatusChangeFinish(MapStatus mapStatus) {
Log.e("onMapStatusChangeFinish", mapStatus.toString());
}
});
// 2 地图单击事件
// Poi point of intrest
baiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
Log.e("onMapClick", latLng.toString());
}
@Override
public void onMapPoiClick(MapPoi mapPoi) {
Log.e("onMapClick", mapPoi.getName() + mapPoi.getPosition().toString());
}
});
// 3 地图双击事件
baiduMap.setOnMapDoubleClickListener(new BaiduMap.OnMapDoubleClickListener() {
@Override
public void onMapDoubleClick(LatLng latLng) {
Log.e("onMapDoubleClick", latLng.toString());
}
});
// 4 地图长按事件
baiduMap.setOnMapLongClickListener(new BaiduMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng latLng) {
Log.e("onMapLongClick", latLng.toString());
baiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());
}
});
// 5 地图触摸事件
baiduMap.setOnMapTouchListener(new BaiduMap.OnMapTouchListener() {
@Override
public void onTouch(MotionEvent motionEvent) {
Log.e("onTouch", motionEvent.toString());
}
});
// 6 地图加载完成
baiduMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {
@Override
public void onMapLoaded() {
Log.e("onMapLoaded","地图加载完成");
}
});
// 7 地图渲染完成
baiduMap.setOnMapRenderCallbadk(new BaiduMap.OnMapRenderCallback() {
@Override
public void onMapRenderFinished() {
Log.e("onMapRenderFinished","地图渲染完成");
}
});
// 8 地图截屏
baiduMap.snapshot(new BaiduMap.SnapshotReadyCallback() {
@Override
public void onSnapshotReady(Bitmap bitmap) {
Log.e("onSnapshotReady", "bitmap size = " + bitmap.getByteCount());
}
});
设定显示范围
LatLng latLng1 = new LatLng(37.441307881538215, 116.36555252193881);
LatLng latLng2 = new LatLng(39.09109951809685, 117.20809122585733);
LatLng latLng3 = new LatLng(38.310215424237924, 116.84558003730572);
LatLngBounds bounds = new LatLngBounds.Builder().
include(latLng1).include(latLng2).include(latLng3).build();
baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLngBounds(bounds));
绘制Marker
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory
.fromResource(R.drawable.marker);
OverlayOptions options = new MarkerOptions()
.icon(bitmapDescriptor)
.position(latLng);
baiduMap.addOverlay(options);
绘制方框
LatLng p1 = new LatLng(latLng.latitude+0.005, latLng.longitude-0.005);
LatLng p2 = new LatLng(latLng.latitude-0.005, latLng.longitude-0.005);
LatLng p3 = new LatLng(latLng.latitude-0.005, latLng.longitude+0.005);
LatLng p4 = new LatLng(latLng.latitude+0.005, latLng.longitude+0.005);
List<LatLng> points = new ArrayList<LatLng>();
points.add(p1);
points.add(p2);
points.add(p3);
points.add(p4);
points.add(p1);
OverlayOptions mOverlayOptions = new PolylineOptions()
.width(10)
.color(0xAAFF0000)
.points(points);
baiduMap.addOverlay(mOverlayOptions);
绘制弧形
/**
* 绘制弧线
* @param latLng
*/
private void drawArc(LatLng latLng) {
LatLng p1 = new LatLng(latLng.latitude-0.002, latLng.longitude-0.005);
LatLng p2 = latLng;
LatLng p3 = new LatLng(latLng.latitude-0.002, latLng.longitude+0.005);
OverlayOptions overlayOptions = new ArcOptions()
.color(Color.RED).width(10).points(p1, p2, p3);
baiduMap.addOverlay(overlayOptions);
}
绘制圆形
/**
* 绘制圆形
* @param latLng 圆心坐标
*/
private void drawCircle(LatLng latLng) {
//构造CircleOptions对象
CircleOptions mCircleOptions = new CircleOptions().center(latLng)
.radius(500)
.fillColor(0xAA0000FF) //填充颜色
.stroke(new Stroke(5, 0xAA00ff00)); //边框宽和边框颜色
baiduMap.addOverlay(mCircleOptions);
}
绘制多边形
/**
* 绘制多边形
* @param latLng
*/
private void drawPolygon(LatLng latLng) {
LatLng p1 = latLng;
LatLng p2 = new LatLng(latLng.latitude, latLng.longitude+0.005);
LatLng p3 = new LatLng(latLng.latitude-0.005, latLng.longitude+0.01);
LatLng p4 = new LatLng(latLng.latitude-0.01, latLng.longitude+0.005);
LatLng p5 = new LatLng(latLng.latitude-0.01, latLng.longitude);
LatLng p6 = new LatLng(latLng.latitude-0.005, latLng.longitude-0.005);
List<LatLng> pointList = new ArrayList<>();
pointList.add(p1);
pointList.add(p2);
pointList.add(p3);
pointList.add(p4);
pointList.add(p5);
pointList.add(p6);
//构造PolygonOptions
PolygonOptions mPolygonOptions = new PolygonOptions()
.points(pointList)
.fillColor(0xAAFFFF00) //填充颜色
.stroke(new Stroke(5, 0xAA00FF00)); //边框宽度和颜色
baiduMap.addOverlay(mPolygonOptions);
}
绘制文字
/**
* 绘制文本
* @param latLng
*/
private void drawText(LatLng latLng) {
//构建TextOptions对象
OverlayOptions mTextOptions = new TextOptions()
.text("百度地图SDK") //文字内容
.bgColor(0xAAFFFF00) //背景色
.fontSize(24) //字号
.fontColor(0xFFFF00FF) //文字颜色
// .rotate(-30) //旋转角度
.position(latLng);
baiduMap.addOverlay(mTextOptions);
}
绘制信息窗
/**
* 绘制信息窗
* @param latLng
*/
private void drawInfoWindow(LatLng latLng) {
//用来构造InfoWindow的Button
Button button = new Button(getApplicationContext());
button.setBackgroundResource(R.drawable.button);
button.setText("故宫你好");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "InfoWindow被点击事件", Toast.LENGTH_SHORT).show();
}
});
//构造InfoWindow
//point 描述的位置点
//-100 InfoWindow相对于point在y轴的偏移量
InfoWindow mInfoWindow = new InfoWindow(button, latLng, -100);
//使InfoWindow生效
baiduMap.showInfoWindow(mInfoWindow);
}
POI检索
// 检索初始化
private void initPoiSearch(){
poiSearch = PoiSearch.newInstance();
OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {
List<PoiInfo> allPoi = poiResult.getAllPoi();
//创建OverlayOptions的集合
List<OverlayOptions> options = new ArrayList<OverlayOptions>();
for(PoiInfo poiInfo : allPoi){
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.marker);
OverlayOptions overlayOptions = new MarkerOptions()
.position(poiInfo.location).icon(bitmapDescriptor).title(poiInfo.name);
options.add(overlayOptions);
}
baiduMap.addOverlays(options);
}
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
Log.e("onGetPoiDetailResult", poiDetailResult.toString());
}
@Override
public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {
Log.e("onGetPoiDetailResult", poiDetailSearchResult.toString());
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
Log.e("onGetPoiIndoorResult", poiIndoorResult.toString());
}
};
poiSearch.setOnGetPoiSearchResultListener(listener);
}
// 周边检索
private void nearBySearch() {
//23.189885425697206, longitude: 113.3582592194312
poiSearch.searchNearby(new PoiNearbySearchOption()
.location(new LatLng(23.189885425697206, 113.3582592194312))
.radius(1000)
.keyword("美食")
.pageNum(10));
}
/**
* POI城市检索
*/
private void poiCitySearch() {
poiSearch.searchInCity(new PoiCitySearchOption().city("广州").keyword("美食").pageNum(10));
}
区域检索
private void boundSearch() {
//latitude: 23.135834966085195, longitude: 113.2912276622988
//latitude: 23.197118720735396, longitude: 113.36530193462711
/**
* 设置矩形检索区域
*/
LatLngBounds searchBounds = new LatLngBounds.Builder()
.include(new LatLng( 23.135834966085195, 113.2912276622988 ))
.include(new LatLng( 23.197118720735396, 113.36530193462711))
.build();
poiSearch.searchInBound(new PoiBoundSearchOption().bound(searchBounds).keyword("银行").pageNum(10));
}
地点输入提示检索
private void suggestSearch() {
SuggestionSearch suggestionSearch = SuggestionSearch.newInstance();
OnGetSuggestionResultListener listener = new OnGetSuggestionResultListener() {
@Override
public void onGetSuggestionResult(SuggestionResult suggestionResult) {
Log.e("onGetSuggestionResult", suggestionResult.getAllSuggestions().toString());
}
};
suggestionSearch.setOnGetSuggestionResultListener(listener);
suggestionSearch.requestSuggestion(new SuggestionSearchOption().city("广州").keyword("广州"));
}
公交检索
private void busSearch() {
// poiSearch.searchInCity(new PoiCitySearchOption().city("广州").keyword("1号线"));
//uid = 6ceda41e4c1e9a9b3ce231b7 name = 地铁1号线(广州东站-西塱)
BusLineSearch busLineSearch = BusLineSearch.newInstance();
OnGetBusLineSearchResultListener listener = new OnGetBusLineSearchResultListener() {
@Override
public void onGetBusLineResult(BusLineResult busLineResult) {
Log.e("onGetBusLineResult", busLineResult.toString());
BusLineOverlay overlay = new BusLineOverlay(baiduMap);
overlay.setData(busLineResult);
overlay.addToMap();
overlay.zoomToSpan();
}
};
busLineSearch.setOnGetBusLineSearchResultListener(listener);
busLineSearch.searchBusLine(new BusLineSearchOption().city("广州").uid("6ceda41e4c1e9a9b3ce231b7"));
}
天气检索
/**
* 天气检索
*/
private void weatherSearch() {
String districtID = "110105"; // 天安门区域ID
WeatherSearchOption weatherSearchOption = new WeatherSearchOption()
.weatherDataType(WeatherDataType.WEATHER_DATA_TYPE_ALL)
.districtID(districtID);
WeatherSearch mWeatherSearch = WeatherSearch.newInstance();
mWeatherSearch.setWeatherSearchResultListener(new OnGetWeatherResultListener() {
@Override
public void onGetWeatherResultListener(final WeatherResult weatherResult) {
WeatherSearchRealTime realTimeWeather = weatherResult.getRealTimeWeather();
Log.e("onGetWeather", realTimeWeather.getPhenomenon() + realTimeWeather.getTemperature());
}
});
mWeatherSearch.request(weatherSearchOption);
}
推荐上车点
/**
* 推荐上车点
*/
private void stepSearch() {
RecommendStopSearch recommendStopSearch = RecommendStopSearch.newInstance();
OnGetRecommendStopResultListener listener = new OnGetRecommendStopResultListener() {
@Override
public void onGetRecommendStopResult(RecommendStopResult recommendStopResult) {
Log.e("onGetRecommend", recommendStopResult.getRecommendStopInfoList().get(1).getName());
}
};
recommendStopSearch.setOnGetRecommendStopResultListener(listener);
// latitude: 23.135834966085195, longitude: 113.2912276622988
LatLng latLng = new LatLng( 23.135834966085195,113.2912276622988);
recommendStopSearch.requestRecommendStop(new RecommendStopSearchOption().location(latLng));
}