前言
最近做了一个关于公交站点显示的应用,相信很多朋友都遇到过这种从服务器上获取多个定位点加载到地图上显示的需求,今天我就来分享一下我实现这个需求的方式(针对于那些对高德api不熟悉的伙伴,大佬可忽略)
简介
高德开发平台为开发者提供了一整套关于地图操作的SDK和文档。在使用之前需要去申请账号、创建应用并查看集成方式。具体操作请移步至官网
在查看文档之后设置好自己的key,然后按照文档要求集成。下面开始使用示例
示例
其实高德api的开发文档上很多东西就有说明,可以通过查看其官网Demo了解到所有的基本功能,不过还是可能存在文档不清晰导致新手看不懂的问题,这篇博客主要就是进行步骤说明。在xml里面添加地图控件。
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
然后需要重写使用地图控件的activity的生命周期
MapView mMapView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.map);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
mMapView.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
mMapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
mMapView.onSaveInstanceState(outState);
}
}
这些都是基本配置。现在来讲一下如何将从服务器上获取到的多个定位信息通过图标的形势加载到地图上。
首先要明确如何在地图上添加图标,这个操作必须通过AMap这个对象完成,这个对象可以理解为mapView的管理者。
获取AMap对象可通过如下代码获得
aMap = mapView.getMap();
他可以对mapView的功能进行设置
比如采用自定义定位图标可以使用如下代码,第一行代码表示设置定位图标为自定义图标,第二行代码是设置显示当前手机定位的位置,第三行代码是加载当前定位图标的图片资源,R.drawable.gps_point 即为定位图标。
aMap.getUiSettings().setMyLocationButtonEnabled(true);
aMap.setMyLocationEnabled(true);
myLocationStyle.myLocationIcon(BitmapDescriptorFactory
.fromResource(R.drawable.gps_point));
AMap除了可以添加当前手机定位的图标位置还可以添加多个定位点的位置信息显示在地图上。
首先来看一下怎么添加一个定位点的位置信息到地图上。代码如下所示,MarkerOptions对象为单个定位点图标的设置对象,可以设置定位点是否可以拖动(markerOption.draggable(false)设置为不可拖动),也可以设置定位点的坐标(markerOption.position(LatLng对象,即经纬度对象)),还可以设置其图标(代码中R.drawable.route_stop即为图标的图片资源)。
MarkerOptions markerOption = new MarkerOptions();
markerOption.draggable(false);
markerOption.position(o.getLatLng());
markerOption.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
.decodeResource(getResources(),R.drawable.route_stop)));
markerOption.setFlat(true);
Marker e = aMap.addMarker(markerOption);
除了可以设置定位点的一些功能,还可以让定位点加载一些显示信息,比如显示一个信息窗口,在显示之前必须做信息的加载
Marker e = aMap.addMarker(markerOption);
//可以给定位点绑定一个信息对象
e.setObject(o);
//允许定位点显示信息窗口
e.setInfoWindowEnable(true);
e.setTitle("设置标题");
e.setSnippet("设置内容");
如果要批量加载可以这样写
private void load(List<LatLng> latlngs){
MarkerOptions markerOption = new MarkerOptions();
markerOption.draggable(false);
markerOption.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
.decodeResource(getResources(),R.drawable.route_stop)));
markerOption.setFlat(true);
for(LatLng latLng:latlngs){
markerOption.position(latLng);
Marker e = aMap.addMarker(markerOption);
//可以给定位点绑定一个信息对象
e.setObject(o);
//允许定位点显示信息窗口
e.setInfoWindowEnable(true);
e.setTitle("设置标题");
e.setSnippet("设置内容");
}
}
上述代码中可以批量加载定位点到地图上。其中latlngs参数表示定位点的位置信息集合,即每个定位点经纬度数据集合
因为定位点不光能现在在地图上还需要点击操作
首先需要给定位点小图标设置点击监听
aMap.setOnMarkerClickListener(this);
this表示当前Activity,并且Activity需要实现AMap.OnMarkerClickListener这个接口。在实现这个接口之后重写onMarkerClick方法
@Override
public boolean onMarkerClick(Marker marker) {
if (marker.isInfoWindowShown()){
marker.hideInfoWindow();
}else {
marker.showInfoWindow();
}
return true;
}
上述示例了一个简单的操作,即是判断当前定位点是否显示信息窗口如果显示则关闭,如果没有显示则显示信息窗口。可以回顾一下之前我们写的那个
//可以给定位点绑定一个信息对象
e.setObject(o); 如果要做一些特殊的信息处理,可以在加载之前进行数据的绑定,然后在点击的时候通过marker.getObject()获取那个信息对象进行相应的操作。
当然你在加载了这么多数据之后如果需要将地图的中心点就行切换可以通过以下方法
CameraPosition cameraPosition = new CameraPosition("地图中心点Latlng对象信息","缩放度",0,0);
aMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
总结
好了,基本的东西也就介绍完毕了,读者可根据自己实际项目进行修改,实现需求。