概述 最后更新时间: 2021年11月23日
重要:由于个人信息保护法的实施,从地图8.1.0版本起对旧版本SDK不兼容,请务必确保调用SDK任何接口前先调用更新隐私合规updatePrivacyShow、updatePrivacyAgree两个接口,具体可参考开发指南-其他配置注意事项-隐私合规接口说明传入相关参数。否则可能产生的异常情况如下:
- MapView、TextureMapView、MapFragment显示白屏;
- OfflineMapManager、OfflineMapActivity、LBSTraceClient、搜索接口也需在初始化时对抛出的异常进行捕获,否则可能导致编译不通过、空指针等异常情况;
Flutter兼容性:Flutter3.0.0版本已发布,兼容Android定位5.6.0、iOS定位2.8.0、地图8.1.0及以上版本,可前往 Flutter插件下载页面 获取对应版本
Android地图SDK简介
高德开放平台目前开放了Android 地图 SDK 以及 Android 地图 SDK 专业版两套地图SDK工具。
高德地图 Android SDK 是一套地图开发调用接口,开发者可以轻松地在自己的Android应用中加入地图相关的功能,包括:地图显示(含室内、室外地图)、与地图交互、在地图上绘制、兴趣点搜索、地理编码、离线地图等功能。
高德地图 Android SDK 专业版是在 Android SDK 已有服务的基础上,新增支持了自定义地图在线加载、自定义地图元素纹理等功能,便于开发者完成基于自身场景的更深层、更个性化地图的开发需求。
V4.0.0开始,除了支持手机设备外,还支持Android Wear。
功能介绍与体验
- 展示地图
package com.amap.map3d.demo.basic; import android.app.Activity; import android.os.Bundle; import com.amap.api.maps.AMap; import com.amap.api.maps.MapView; import com.amap.map3d.demo.R; public class AmapActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.basicmap_activity); MapView mapView = (MapView) findViewById(R.id.map); mapView.onCreate(savedInstanceState);// 此方法必须重写 AMap aMap = mapView.getMap(); aMap.setTrafficEnabled(true);// 显示实时交通状况 //地图模式可选类型:MAP_TYPE_NORMAL,MAP_TYPE_SATELLITE,MAP_TYPE_NIGHT aMap.setMapType(AMap.MAP_TYPE_SATELLITE);// 卫星地图模式 } }
- 覆盖物
public class AmapActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.basicmap_activity); MapView mapView = (MapView) findViewById(R.id.map); mapView.onCreate(savedInstanceState);// 此方法必须重写 AMap aMap = mapView.getMap(); //绘制marker Marker marker = aMap.addMarker(new MarkerOptions() .position(new LatLng(39.986919,116.353369)) .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory .decodeResource(getResources(),R.drawable.marker))) .draggable(true)); // 绘制曲线 aMap.addPolyline((new PolylineOptions()) .add(new LatLng(43.828, 87.621), new LatLng(45.808, 126.55)) .geodesic(true).color(Color.RED)); } }
- 路径规划
/** * 开始搜索路径规划方案 */ public void searchRouteResult(int routeType, int mode) { if (mStartPoint == null) { ToastUtil.show(mContext, "起点未设置"); return; } if (mEndPoint == null) { ToastUtil.show(mContext, "终点未设置"); } showProgressDialog(); final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo( mStartPoint, mEndPoint); if (routeType == ROUTE_TYPE_BUS) {// 公交路径规划 BusRouteQuery query = new BusRouteQuery(fromAndTo, mode, mCurrentCityName, 0);// 第一个参数表示路径规划的起点和终点,第二个参数表示公交查询模式,第三个参数表示公交查询城市区号,第四个参数表示是否计算夜班车,0表示不计算 mRouteSearch.calculateBusRouteAsyn(query);// 异步路径规划公交模式查询 } else if (routeType == ROUTE_TYPE_DRIVE) {// 驾车路径规划 DriveRouteQuery query = new DriveRouteQuery(fromAndTo, mode, null, null, "");// 第一个参数表示路径规划的起点和终点,第二个参数表示驾车模式,第三个参数表示途经点,第四个参数表示避让区域,第五个参数表示避让道路 mRouteSearch.calculateDriveRouteAsyn(query);// 异步路径规划驾车模式查询 } else if (routeType == ROUTE_TYPE_WALK) {// 步行路径规划 WalkRouteQuery query = new WalkRouteQuery(fromAndTo, mode); mRouteSearch.calculateWalkRouteAsyn(query);// 异步路径规划步行模式查询 } }
- POI搜索
/** * 开始进行poi搜索 */ protected void doSearchQuery() { keyWord = mSearchText.getText().toString().trim(); currentPage = 0; query = new PoiSearch.Query(keyWord, "", "北京市"); query.setPageSize(20);// 设置每页最多返回多少条poiitem query.setPageNum(currentPage);// 设置查第一页 if (lp != null) { poiSearch = new PoiSearch(this, query); poiSearch.setOnPoiSearchListener(this); poiSearch.setBound(new SearchBound(lp, 5000, true));// poiSearch.searchPOIAsyn();// 异步搜索 } }
- 自定义OpenGL渲染
... /** * 初始化AMap对象 */ private void init() { if (aMap == null) { aMap = mapView.getMap(); //关闭文字 aMap.showMapText(false); //关闭3d楼块 aMap.showBuildings(false); //注1:设置opengl Renderer aMap.setCustomRenderer(new MapRenderer(aMap)); } } ... class MapRenderer implements CustomRenderer{ //平移位置 private float[] translate_vector = new float[4]; //缩放比例 public static float SCALE = 0.005F; private LatLng center = new LatLng(39.90403, 116.407525);// 北京市经纬度 private AMap aMap; public MapRenderer(AMap aMap) { this.aMap = aMap; aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(center,15)); } @Override public void onDrawFrame(GL10 gl) { // 注2:绘制各种图形的opengl代码 } ... @Override public void OnMapReferencechanged() { //注3:回调这个时,坐标系发生改变,需要重新计算缩放比例 calScaleAndTranslate(); } private void calScaleAndTranslate() { // 坐标会变化,重新计算计算偏移,供参考,可以自行定义 PointF pointF = aMap.getProjection().toOpenGLLocation(center); translate_vector[0] = pointF.x; translate_vector[1] = pointF.y; translate_vector[2] = 0; //重新计算缩放比例 LatLng latLng2 = new LatLng(center.latitude + 0.001, center.longitude + 0.001); PointF pointF2 = aMap.getProjection().toOpenGLLocation(latLng2); double _x = Math.abs((pointF.x - pointF2.x)); double _y = Math.abs((pointF.y - pointF2.y)); SCALE = (float) Math.sqrt((_x * _x + _y * _y)); } }
- 离线地图
// 设置应用单独的地图存储目录,在下载离线地图或初始化地图时设置 MapsInitializer.sdcardDir = getSdCacheDir(this); private String getSdCacheDir(Context context) { return "地址路径"; } //按照citycode下载 OfflineMapManager.downloadByCityCode(String citycode); //按照cityname下载 OfflineMapManager.downloadByCityName(String cityname); /** * 点击暂停按钮响应事件回调 */ amapManager = new OfflineMapManager(context, OfflineMapDownloadListener ); amapManager.pause();
给开发者的建议
对于高德开放平台提供的地图API/SDK,若您以非商业目的使用,则均可免费使用 。若您以商业目的使用,则您需事先从高德获取商用授权。您需要先申请Key,才能使用该服务。关于具体使用规则,请参阅《高德地图开放平台服务协议》获得详细信息。