版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fu_17791654327/article/details/79674614
Android之百度地图集成
注册和获取密钥
注册百度账号
注册链接:点击进行百度账号注册
创建应用
1.应用名称
2.应用类型(Android SDK)
3.发布版SHA1(详见:)
4.包名 (AndroidManifest.xml文件中)
5.提交生成AK
下载开发包并进行配置
1.开发包下载链接:点击下载开发包
2.解压下载的压缩包
3.复制libs文件夹下的所有文件至项目libs文件夹下,并将jar包添加到应用中。
4.build.gradle文件中说明so的路径为该libs路径,关联所有地图SDK的so文件
android {
sourceSets {
main {
jniLibs.srcDir 'libs'
//说明so的路径为该libs路径,关联所有地图SDK的so文件
}
}
}
5.AndroidManifest.xml中加入相关配置及权限。
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="创建应用后得到的AppKey" />
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" />
使用
1.创建地图
- xml文件中添加地图组件
<com.baidu.mapapi.map.TextureMapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
- 代码中获取地图组件,并设置地图显示图层
//获取地图控件引用
mMapView = (TextureMapView) findViewById(R.id.bmapView);
//获取地图控制器对象
mBaiduMap = mMapView.getMap();
// 设置地图图层
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); // 默认地图(2D,3D ),还有卫星地图(BaiduMap.MAP_TYPE_SATELLITE),空白地图(BaiduMap.MAP_TYPE_NONE)
- 显示定位
// 定位参数配置
option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000); // 定位次数
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
// 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setIsNeedAddress(true);// 可选,设置是否需要地址信息,默认不需要
option.setIsNeedLocationPoiList(true);// 可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
// 自定义定位图标
mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
// 自定义精度圈填充颜色
int accuracyCircleFillColor = 0x556EE1F4;//自定义精度圈填充颜色
// 自定义精度圈边框颜色
int accuracyCircleStrokeColor = 0xFF116DDD;//自定义精度圈边框颜色
// 定位图层的配置(定位模式,是否允许方向信息,用户自定义定位图标)
MyLocationConfiguration myLocationConfiguration = new MyLocationConfiguration(
mCurrentMode, true, mCurrentMarker,
accuracyCircleFillColor, accuracyCircleStrokeColor);
//打开室内图,默认为关闭状态
mBaiduMap.setIndoorEnable(true);
// 设定定位图层配置
mBaiduMap.setMyLocationConfiguration(myLocationConfiguration);
// // 当不需要定位图层时关闭定位图层
// mBaiduMap.setMyLocationEnabled(false);
// // 设置定位跟随状态(使用默认图标)
// mBaiduMap.setMyLocationConfigeration(
// new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, mCurrentMarker));
// 定位初始化
mLocClient = new LocationClient(this);
// 定位监听
MyLocationListener myLocListener = new MyLocationListener();
// 定位监听
mLocClient.registerLocationListener(myLocListener);
// 设置定位参数
mLocClient.setLocOption(option);
// 开启定位
mLocClient.start();
/**
* 定位SDK监听函数
*/
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null) {
return;
}
// 此处设置开发者获取到的方向信息,顺时针0-360
MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude()).longitude(location.getLongitude()).build();
// 设置定位数据
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
// 经纬度获取
latitude = location.getLatitude();
longitude = location.getLongitude();
// 移动定位图标至定位点上
latLngLocation = new LatLng(latitude, longitude);
builder = new MapStatus.Builder();
builder.target(latLngLocation).zoom(18.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
Toast.makeText(MainActivity.this, "当前所在位置:" + location.getAddrStr(), Toast.LENGTH_LONG).show();
tvAtvtMainHeatingPower.setText(location.getCity());
}
}
}
2.与地图交互
- 地图单击事件
// TODO: 2018/3/27 0027 地图单击事件
mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
/**
* 地图单击事件回调函数
* @param point 点击的地理坐标
*/
public void onMapClick(LatLng point) {
Log.e("onMapClick", "获取到点击坐标 = " + point);
}
/**
* 地图内 Poi 单击事件回调函数
* @param poi 点击的 poi 信息
*/
public boolean onMapPoiClick(MapPoi poi) {
Log.e("onMapPoiClick", " 地图poi的信息 name = " + poi.getName()
+ " uid = " + poi.getUid() + " latlng = " + poi.getPosition());
return true;
}
});
- 地图长按事件
// TODO: 2018/3/27 0027 地图长按事件
mBaiduMap.setOnMapLongClickListener(new BaiduMap.OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng latLng) {
Log.e("onMapLongClick", "长按事件 latLng = " + latLng);
}
});
- 地图定位点点击事件
// TODO: 2018/3/27 0027 地图定位点点击事件
mBaiduMap.setOnMyLocationClickListener(new BaiduMap.OnMyLocationClickListener() {
/**
* 地图定位图标点击事件监听函数
*/
public boolean onMyLocationClick() {
Log.e("onMyLocationClick", "定位图标点击事件");
return false;
}
});
- 地图覆盖物点击事件
// TODO: 2018/3/27 0027 覆盖物单击事件
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
/**
* 地图 Marker 覆盖物点击事件监听函数
* @param marker 被点击的 marker
*/
public boolean onMarkerClick(Marker marker) {
Log.e("onMarkerClick", "覆盖物点击事件监听 = " + marker);
return false;
}
});
- 地图覆盖物拖拽事件
// TODO: 2018/3/27 0027 地图上覆盖物拖拽的监听
mBaiduMap.setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() {
public void onMarkerDrag(Marker marker) {
//拖拽中
Log.e("onMarkerDrag", "拖拽中 marker = " + marker);
}
public void onMarkerDragEnd(Marker marker) {
//拖拽结束
Log.e("onMarkerDragEnd", "拖拽结束 marker = " + marker);
}
public void onMarkerDragStart(Marker marker) {
//开始拖拽
Log.e("onMarkerDragStart", "开始拖拽 marker = " + marker);
}
});
- 地图触摸事件
// TODO: 2018/3/27 0027 地图触摸事件
mBaiduMap.setOnMapTouchListener(new BaiduMap.OnMapTouchListener() {
/**
* 当用户触摸地图时回调函数
* @param event 触摸事件
*/
public void onTouch(MotionEvent event) {
Log.e("onTouch","触摸事件 event = " + event );
}
});
- 地图滑动事件
// TODO: 2018/3/27 0027 地图滑动监听
mBaiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {
@Override
public void onMapStatusChangeStart(MapStatus mapStatus) {
}
@Override
public void onMapStatusChangeStart(MapStatus mapStatus, int i) {
Log.e("onMapStatusChangeStart","地图滑动开始 + 2 mapStatus = " + mapStatus + " i = " + i);
}
@Override
public void onMapStatusChange(MapStatus mapStatus) {
Log.e("onMapStatusChange","地图滑动中 mapStatus = " + mapStatus );
}
@Override
public void onMapStatusChangeFinish(MapStatus mapStatus) {
Log.e("onMapStatusChangeFinish","地图滑动完成 mapStatus = " + mapStatus );
}
});
3.在地图上绘制
- 绘制线
// TODO: 2018/3/27 0027 绘制多段线
//构建折线点坐标
LatLng p1 = new LatLng(39.97923, 116.357428);
LatLng p2 = new LatLng(36.94923, 113.397428);
LatLng p3 = new LatLng(33.97923, 119.437428);
List<LatLng> points = new ArrayList<LatLng>();
points.add(p1);
points.add(p2);
points.add(p3);
//绘制折线
OverlayOptions ooPolyline = new PolylineOptions().width(10)
.color(0xAAFF0000).points(points);
Polyline mPolyline = (Polyline) mBaiduMap.addOverlay(ooPolyline);
// mPolyline.setDottedLine(true); //设置是否虚线绘制
// TODO: 2018/3/27 0027 绘制多段分色线
// 构造折线点坐标
List<LatLng> pointss = new ArrayList<LatLng>();
pointss.add(new LatLng(39.965, 116.404));
pointss.add(new LatLng(39.925, 116.454));
pointss.add(new LatLng(39.955, 116.494));
pointss.add(new LatLng(39.905, 116.554));
pointss.add(new LatLng(39.965, 116.604));
//构建分段颜色索引数组
List<Integer> colors = new ArrayList<>();
colors.add(Integer.valueOf(Color.BLUE));
colors.add(Integer.valueOf(Color.RED));
colors.add(Integer.valueOf(Color.YELLOW));
colors.add(Integer.valueOf(Color.GREEN));
OverlayOptions oooPolyline = new PolylineOptions().width(10)
.colorsValues(colors).points(pointss);
// 添加在地图中
mPolyline = (Polyline) mBaiduMap.addOverlay(oooPolyline);
- 绘制面
// TODO: 2018/3/27 0027 绘制圆
LatLng llCircle = new LatLng(39.90923, 116.447428);
Stroke stroke = new Stroke(5, 0xAA000000);
OverlayOptions ooCircle = new CircleOptions().fillColor(0x000000FF).center(llCircle).stroke(stroke).radius(1400);
// 设置颜色和透明度,均使用16进制显示,0xAARRGGBB,如 0xAA000000 其中AA是透明度,000000为颜色
mBaiduMap.addOverlay(ooCircle);
// TODO: 2018/3/27 0027 绘制多边形
//定义多边形的五个顶点
LatLng pt1 = new LatLng(39.93923, 116.357428);
LatLng pt2 = new LatLng(39.91923, 116.327428);
LatLng pt3 = new LatLng(39.89923, 116.347428);
LatLng pt4 = new LatLng(39.89923, 116.367428);
LatLng pt5 = new LatLng(39.91923, 116.387428);
List<LatLng> pts = new ArrayList<LatLng>();
pts.add(pt1);
pts.add(pt2);
pts.add(pt3);
pts.add(pt4);
pts.add(pt5);
//构建用户绘制多边形的Option对象
OverlayOptions polygonOption = new PolygonOptions()
.points(pts)
.stroke(new Stroke(5, 0xAA00FF00))
.fillColor(0xAAFFFF00);
//在地图上添加多边形Option,用于显示
mBaiduMap.addOverlay(polygonOption);
- 绘制文字
//定义文字所显示的坐标点
LatLng llText = new LatLng(39.86923, 116.397428);
//构建文字Option对象,用于在地图上添加文字
OverlayOptions textOption = new TextOptions()
.bgColor(0xAAFFFF00) // 背景色
.fontSize(24) // 文字大小
.fontColor(0xFFFF00FF) // 文字颜色
.text("绘制文字") // 文字内容
.rotate(-30) // 文字旋转角度
.position(llText); // 文字显示位置
//在地图上添加该文字对象并显示
mBaiduMap.addOverlay(textOption);
4.检索地图数据
// 地图poi检索配置
private void poiSearchSet(){
// 1.创建POI检索实例
mPoiSearch = PoiSearch.newInstance();
// 初始化建议搜索模块,注册建议搜索事件监听
mSuggestionSearch = SuggestionSearch.newInstance();
// 2.创建POI检索监听者;
//获取POI检索结果
//获取Place详情页检索结果
poiListener = new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {
//获取POI检索结果
Log.e("onGetPoiResult", "POI检索结果 poiResult = " + poiResult);
List<PoiInfo> poiInfoList = poiResult.getAllPoi();
Log.e("onGetPoiResult", "POI检索结果 poiInfoList = " + poiInfoList);
if (poiInfoList != null && poiInfoList.size() > 0) {
PoiInfo poiinfo = poiInfoList.get(0);
Log.e("onGetPoiResult", "POI检索结果 describeContents = " + poiinfo.describeContents() +
" name = " + poiinfo.name + " address = " + poiinfo.address + " city = " + poiinfo.city + " " +
" phoneNum = " + poiinfo.phoneNum + " postCode = " + poiinfo.postCode + " uid = " + poiinfo.uid +
" hasCaterDetails = " + poiinfo.hasCaterDetails + " isPano = " + poiinfo.isPano + " location = " + poiinfo.location +
" type = " + poiinfo.type + " ");
for (int i = 0; i < poiInfoList.size(); i++) {
PoiInfo poiInfo = (PoiInfo) poiInfoList.get(i);
Log.e("poiInfo ", " poiInfo = " + poiInfo.address + " " + poiInfo.name);
}
}
List<PoiAddrInfo> poiAddrInfoList = poiResult.getAllAddr();
Log.e("onGetPoiResult", "POI检索结果 poiAddrInfoList = " + poiAddrInfoList);
if (poiAddrInfoList != null && poiAddrInfoList.size() > 0) {
for (int i = 0; i < poiAddrInfoList.size(); i++) {
PoiAddrInfo poiAddrInfo = poiAddrInfoList.get(i);
Log.e("onGetPoiResult", "POI检索结果 location = " + poiAddrInfo.location +
" name = " + poiAddrInfo.name +
" address = " + poiAddrInfo.name );
}
}
List<CityInfo> suggestCityList = poiResult.getSuggestCityList();
Log.e("onGetPoiResult", "POI检索结果 suggestCityList = " + suggestCityList);
if (suggestCityList != null && suggestCityList.size() > 0) {
for (int i = 0; i < suggestCityList.size(); i++) {
CityInfo cityInfo = suggestCityList.get(i);
Log.e("onGetPoiResult", "POI检索结果 describeContents = " + cityInfo.describeContents() +
" num = " + cityInfo.num +
" city = " + cityInfo.city );
}
}
}
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
//获取Place详情页检索结果
Log.e("onGetPoiDetailResult", "Place详情页检索结果 poiDetailResult = " + poiDetailResult.toString());
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
Log.e("onGetPoiIndoorResult", "Indoor POI检索结果 poiIndoorResult = " + poiIndoorResult.toString());
List<PoiIndoorInfo> poiIndoorInfoList = poiIndoorResult.getmArrayPoiInfo();
if (poiIndoorInfoList != null && poiIndoorInfoList.size() > 0) {
for (int i = 0; i < poiIndoorInfoList.size(); i++) {
PoiIndoorInfo poiIndoorInfo = (PoiIndoorInfo) poiIndoorInfoList.get(i);
Log.e("onGetPoiResult", "POI检索结果 describeContents = " + poiIndoorInfo.latLng +
" name = " + poiIndoorInfo.name + " address = " + poiIndoorInfo.address +
" bid = " + poiIndoorInfo.bid + " " + " uid = " + poiIndoorInfo.uid +
" cid = " + poiIndoorInfo.cid + " floor = " + poiIndoorInfo.floor +
" tag = " + poiIndoorInfo.tag + " isGroup = " + poiIndoorInfo.isGroup +
" discount = " + poiIndoorInfo.discount + " groupNum = " + poiIndoorInfo.groupNum +
" phone = " + poiIndoorInfo.phone + " floor = " + poiIndoorInfo.floor +
" isTakeOut = " + poiIndoorInfo.isTakeOut + " isWaited = " + poiIndoorInfo.isWaited +
" price = " + poiIndoorInfo.price + " starLevel = " + poiIndoorInfo.starLevel );
}
}
}
};
OnGetSuggestionResultListener onGetSuggestionResultListener = new OnGetSuggestionResultListener() {
@Override
public void onGetSuggestionResult(SuggestionResult suggestionResult) {
}
};
// 3.设置POI检索监听者;
mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
mSuggestionSearch.setOnGetSuggestionResultListener(onGetSuggestionResultListener);
}
// 条件搜索
private void poiConditionSearch() {
// 4.发起检索请求;
if (!TextUtils.isEmpty(etAtvtMainCity.getText().toString().trim()) && !TextUtils.isEmpty(etAtvtMainText.getText().toString().trim())) {
mPoiSearch.searchInCity((new PoiCitySearchOption())
.city(etAtvtMainCity.getText().toString().trim())
.keyword(etAtvtMainText.getText().toString().trim())
.pageNum(10));
/**
* 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新
*/
mSuggestionSearch.requestSuggestion((new SuggestionSearchOption())
.keyword(etAtvtMainText.getText().toString()) // 搜索关键字
.city(etAtvtMainCity.getText().toString())); // 搜索城市
}
}
// 周边搜索
private void poiAmbitusSearch() {
// 4.发起检索请求;
if (!TextUtils.isEmpty(etAtvtMainCity.getText().toString().trim()) && !TextUtils.isEmpty(etAtvtMainText.getText().toString().trim())) {
LatLng center = new LatLng(34.29923570837169, 108.95409189492081);
mPoiSearch.searchNearby(new PoiNearbySearchOption()
.keyword(etAtvtMainText.getText().toString().trim())
.sortType(PoiSortType.distance_from_near_to_far)
.location(center)
.radius(100)
.pageNum(10));
}
}
// 矩形搜索
private void poiRectangleSearch() {
// 4.发起检索请求;
LatLng southwest = new LatLng( 39.92235, 116.380338 );
LatLng northeast = new LatLng( 39.947246, 116.414977);
LatLngBounds searchbound = new LatLngBounds.Builder()
.include(southwest).include(northeast)
.build();
mPoiSearch.searchInBound(new PoiBoundSearchOption().bound(searchbound)
.keyword("餐厅"));
}
5.工具
计算两点之间的直线距离(单位:米):
DistanceUtil. getDistance(p1, p2);