地图如今已经离不开我们大家的生活了 ,作为开发者来说 ,能够尽可能开发一款完善的地图也是至关重要的
因此我对高德地图进行了一些研究,
下面我将 把我对高德地图的研究分享给大家
1.在高德应用管理后台创建新应用,获取AppKey
在这里我们会看到以下界面,它会让我们填入发布板SHA1值,那么这个SHA1值如何获取呢
SHA1的获取:
打开cmd命令在cmd控制台上 依次输入
cd .android
keytool -list -v -keystore debug.keystore
android
即可得到SHA1值,如下:
提交之后便会获取到AppKey
2.在高德地图开发平台上下载Android地图SDK,在libs 报下导入so库及jar包
2.在build.gradle加入以下
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
compile files('libs/AMap_Location_V3.4.0_20170427.jar')
compile files('libs/AMap_Search_V5.1.0_20170517.jar')
compile files('libs/Android_Map3D_SDK_V5.1.0_20170518.jar')
3.在清单文件中加权限和配置AppKey
<!--允许程序打开网络套接字-->
<uses-permissionandroid:name="android.permission.INTERNET"/>
<!--允许程序设置内置sd卡的写权限-->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--允许程序获取网络状态-->
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--允许程序访问WiFi网络信息-->
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
<!--允许程序读写手机状态和身份-->
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
配置AppKey
<meta-dataandroid:name="com.amap.api.v2.apikey"android:value="a530a2c6fa8f40ed4a486745d20c1ebe"/>
<serviceandroid:name="com.amap.api.location.APSService"></service>
4.在xml中写mapview 控件
<com.amap.api.maps.MapView
android:layout_width="368dp"
android:layout_height="495dp"
android:id="@+id/mapview"
tools:layout_editor_absoluteY="8dp"
tools:layout_editor_absoluteX="8dp"></com.amap.api.maps.MapView>
5.在avtivity 中显示定位蓝点
mapview= (MapView) findViewById(R.id.mapview);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
mapview.onCreate(savedInstanceState);//
此方法须覆写,虚拟机需要在很多情况下保存地图绘制的当前状态。
//初始化地图控制器对象
if(aMap==
null) {
aMap=
mapview.getMap();
}
myLocationStyle=
newMyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
myLocationStyle.interval(2000);//设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);//连续定位、蓝点不会移动到地图中心点,定位点依照设备方向旋转,并且蓝点会跟随设备移动。
aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Styl
// aMap.getUiSettings().setMyLocationButtonEnabled(true);设置默认定位按钮是否显示,非必需设置。
aMap.setMyLocationEnabled(true);//
设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
@Override
protected voidonDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
mapview.onDestroy();
}
@Override
protected voidonResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume
(),重新绘制加载地图
mapview.onResume();
}
@Override
protected voidonPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
mapview.onPause();
}
6.POI检索
query=
newPoiSearch.Query(et_point,"",et_city);
//keyWord表示搜索字符串,
//第二个参数表示POI搜索类型,二者选填其一,选用POI搜索类型时建议填写类型代码,码表可以参考下方(而非文字)
//cityCode表示POI搜索区域,可以是城市编码也可以是城市名称,也可以传空字符串,空字符串代表全国在全国范围内进行搜索
query.setPageSize(10);//
设置每页最多返回多少条poiitem
// query.setPageNum(currentPage);//设置查询页码
poiSearch=
newPoiSearch(this,query);
poiSearch.setOnPoiSearchListener(this);
poiSearch.searchPOIAsyn();
@Override
public voidonPoiSearched(PoiResult
poiResult,inti) {
aMap.clear();
ArrayList<PoiItem> pois = poiResult.getPois();
for(PoiItem
poiItem : pois) {
LatLonPoint latLonPoint = poiItem.getLatLonPoint();
LatLng latLng =newLatLng(latLonPoint.getLatitude(),
latLonPoint.getLongitude());
MarkerOptions markerOption =newMarkerOptions().position(latLng).title(poiItem.toString()).snippet("去吃吧");
aMap.addMarker(markerOption);
}
}
7.点击覆盖物并规划线路(要在源码中复制几个类)
aMap.setOnMarkerClickListener(newAMap.OnMarkerClickListener()
{
@Override
public booleanonMarkerClick(Marker
marker) {
//获取起点经纬度
Location myLocation =aMap.getMyLocation();
//获取终点经纬度
LatLng position = marker.getPosition();
LatLonPoint from=newLatLonPoint(myLocation.getLatitude(),myLocation.getLongitude());
LatLonPoint to=newLatLonPoint(position.latitude,position.longitude);
RouteSearch.FromAndTo fromAndTo =newRouteSearch.FromAndTo(from,to);
RouteSearch.DriveRouteQuery query =newRouteSearch.DriveRouteQuery(fromAndTo,
RouteSearch.DRIVING_MULTI_CHOICE_AVOID_CONGESTION_NO_HIGHWAY,null,null,"");
RouteSearch routeSearch =newRouteSearch(MainActivity.this);
routeSearch.setRouteSearchListener(MainActivity.this);
routeSearch.calculateDriveRouteAsyn(query);
return false;
}
});
@Override
public voidonDriveRouteSearched(DriveRouteResult
result,interrorCode) {
aMap.clear();//
清理地图上的所有覆盖物
if(errorCode
== AMapException.CODE_AMAP_SUCCESS) {
if(result
!=null&& result.getPaths() !=null)
{
if(result.getPaths().size()
>0) {
finalDrivePath
drivePath = result.getPaths()
.get(0);
DrivingRouteOverlay drivingRouteOverlay =newDrivingRouteOverlay(
this,aMap,
drivePath,
result.getStartPos(),
result.getTargetPos(),null);
drivingRouteOverlay.setNodeIconVisibility(false);//设置节点marker是否显示
drivingRouteOverlay.setIsColorfulline(true);//是否用颜色展示交通拥堵情况,默认true
drivingRouteOverlay.removeFromMap();
drivingRouteOverlay.addToMap();
drivingRouteOverlay.zoomToSpan();
}else if(result
!=null&& result.getPaths() ==null)
{
ToastUtil.show(this,
R.string.no_result);
}
}else{
ToastUtil.show(this,
R.string.no_result);
}
}else{
ToastUtil.showerror(this.getApplicationContext(),
errorCode);
}
}
哈哈 到此结束了 ,以后有空在写,如果哪里写的不对还请各位大神指点