1.第一步进行高德地图的配置
1)高德地图控制台https://lbs.amap.com/dev/index创建应用和所需要的key(注意applicationId 和 签名中的SHA1 正确,比如用 正式的签名配的SHA1但是编译项目却用debug的默认签名会出问题)
//清单文件配置
<application>
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="申请的Key"/>
</application>
2) gradle配置所需要的依赖包
app下的build.gradle文件中配置
dependencies {
//.......
//3D地图so及jar
compile 'com.amap.api:3dmap:latest.integration'
//定位功能
compile 'com.amap.api:location:latest.integration'
//搜索功能
compile 'com.amap.api:search:latest.integration'
}
2.UI,初始化,定位代码编写
xml代码
<?xml version="1.0" encoding="utf-8"?>
<com.amap.api.maps.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
activity代码
private MapView mapView;//地图显示view
private AMap aMap;//地图控制器
private MyLocationStyle myLocationStyle;//地图定位样式
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map_base);
mapView = (MapView) findViewById(R.id.map_view);
mapView.onCreate(savedInstanceState);
if (aMap == null){
aMap = mapView.getMap();
}
/**
* 设置一些amap的属性
*/
aMap.getUiSettings().setZoomControlsEnabled(false);//是否可以缩放
aMap.moveCamera(CameraUpdateFactory.zoomTo(15));//缩放比例
//地图文字的Z轴指数,设置为2可以将地图底图文字设置在添加的覆盖物之上
aMap.setMapTextZIndex(2);
UiSettings uiSettings = aMap.getUiSettings();//地图的UI设置控制器
uiSettings.setCompassEnabled(false);// 设置指南针是否显示
uiSettings.setZoomControlsEnabled(false);// 设置缩放按钮是否显示
uiSettings.setScaleControlsEnabled(true);// 设置比例尺是否显示
uiSettings.setRotateGesturesEnabled(true);// 设置地图旋转是否可用
uiSettings.setTiltGesturesEnabled(true);// 设置地图倾斜是否可用
uiSettings.setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
myLocationStyle = new MyLocationStyle();
//设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为秒。
myLocationStyle.interval(3000);
//设置连续定位、蓝点不会移动到地图中心点,定位点依照设备方向旋转,并且蓝点会跟随设备移动。
//具体场景可根据高德API查看
myLocationStyle.myLocationType(MyLocationStyle
.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
myLocationStyle.showMyLocation(true);//显示定位蓝点
//设置图标
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.
fromResource(R.mipmap.navi_map_gps_locked));
//设置圆圈颜色
myLocationStyle.radiusFillColor(0x70ffffff);
//设置边框颜色
myLocationStyle.strokeColor(0xffffffff);
aMap.setMyLocationStyle(myLocationStyle);//关联myLocationStyle
//监听定位信息的回调
aMap.setOnMyLocationChangeListener(new OnMyLocationChangeListener());
//开启定位,设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认false。
aMap.setMyLocationEnabled(true);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),
//保存地图当前的状态
mapView.onSaveInstanceState(outState);
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
mapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
mapView.onDestroy();
}
private boolean isFirstLocation = true;//第一次定位成功
class OnMyLocationChangeListener implements AMap.OnMyLocationChangeListener{
@Override //定位信息的回调监听
public void onMyLocationChange(Location location) {
if (location == null){
return;
}
Bundle bundle = location.getExtras();
if (bundle != null && (bundle.getInt("errorCode",-1)) == 0){//定位成功
//获取定位数据
//经度
double lat = location.getLatitude();
//纬度
double lng = location.getLongitude();
//实现第一次定位成功,将地图中心移动到定位点
if (isFirstLocation){
isFirstLocation = false;
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new
LatLng(lat,lng),17);
aMap.moveCamera(cameraUpdate);//将地图移动到定位坐标点
}
}else{
//错误信息
String error = bundle.get("errorInfo")
Log.e("Map",error);
}
}
}
3.路线规划查询路径
private RouteSearch mRouteSearch;//路线查询器
private void initSearch() {
mRouteSearch = new RouteSearch(this);
//设置数据回调监听器
mRouteSearch.setRouteSearchListener(new OnRouteSearchListener());
//设置开始位置坐标点(注意经纬度不能写反,会报错1800(只能规划到中国区域里的地图路线))
LatLonPoint startPoint new LatLonPoint(30.321842,120.141216);
//设置目的地坐标点
LatLonPoint endPoint = new LatLonPoint(30.321842,120.141216);
//查询信息对象
RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(startPoint,endPoint);
//设置搜索参数 1.fromAndTo 路径的起点终点 2.路径规划的策略(这里是驾车模式,具体看高德API) 3.途
//经点,可选 4.避让区域,可选, 5.避让道路 ,可选
RouteSearch.DriveRouteQuery query = new
RouteSearch.DriveRouteQuery(fromAndTo,RouteSearch.DRIVING_SINGLE_DEFAULT,null,null,"");
//开始异步查询
mRouteSearch.calculateDriveRouteAsyn(query);
}
class OnRouteSearchListener implements RouteSearch.OnRouteSearchListener{
@Override
public void onDriveRouteSearched(DriveRouteResult driveRouteResult, int rCode) {
if (rCode == 1000){//获取规划路线成功,获取到的是了,路线坐标点的集合
List<DrivePath> paths = driveRouteResult.getPaths();
//创建存储坐标点的集合
List<LatLng> latLngs = new ArrayList<>();
//遍历获取规划的所有路线坐标点
for (DrivePath mDrivePath : paths) {
for (DriveStep mDriveStep : mDrivePath.getSteps()) {
for (LatLonPoint mLatLonPoint : mDriveStep.getPolyline()) {
latLngs.add(new
LatLng(mLatLonPoint.getLatitude(),mLatLonPoint.getLongitude()));
}
}
}
//先清除一下,避免重复显示
aMap.clear();
//绘制起始位置和目的地marker
aMap.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(iconRes))
.position(new LatLng(经度,纬度)));
aMap.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(iconRes))
.position(new LatLng(经度,纬度)));
//绘制规划路径路线
aMap.addPolyline(new PolylineOptions()
//路线坐标点的集合
.addAll(latLngs)
//线的宽度
.width(30)
.color(getResources().getColor(R.color.blue))//设置画线的颜色
//显示完整包含所有marker地图路线
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (int i = 0; i < latLngs.size(); i++) {
builder.include(latLngs.get(i));
}
//显示全部marker,第二个参数是四周留空宽度
aMap.moveCamera(CameraUpdateFactory.newLatLngBounds(builder.build(),200));
}
}
}
Over~