高德地图Android SDK的使用


高德地图 Android SDK 是一套地图开发调用接口,开发者可以轻松地在自己的Android应用中加入地图相关的功能,包括:地图显示(含室内、室外地图)、与地图交互、在地图上绘制、兴趣点搜索、地理编码、离线地图等功能。同时也提供也定位SDK、和导航SDK。

详细参考:http://lbs.amap.com/

使用高德地图来显示给定单个经纬度的点、多个经纬度的点、线、以及计算距离。

下载高德地图开发包,添加到工程中,并获取相关的高德Key。参考:http://lbs.amap.com/api/android-sdk/gettingstarted

坐标系

在给定一个经纬度时,如果要准确显示其位置,则必须知道这个经纬度对应的坐标系。如果对应坐标系不正确,则会出现几公里的偏差。目前国内使用的坐标系主要有下面三种:

  1. WGS84: 表示GPS获取的坐标。国际通用标准。
  2. GCJ02: 表示经过国测局加密的坐标。我国特有的。
  3. BD09 : 为百度坐标系,其中bd09ll表示百度经纬度坐标系。

高德地图默认使用的是GCJ02的坐标系,也就说如果给定一个经纬度且这个经纬度对应的坐标系是GCJ02 ,那么可以不需要转换,直接可以在高德地图上显示。如果是其他坐标系则需要进行转换。高德地图提供了相应的坐标系转换接口,可以把其他坐标系转换成GCJ02 ,如下代码,是把WGS84 坐标的经纬度转换为GCJ02坐标:

CoordinateConverter converter  = new CoordinateConverter(); 
// CoordType.GPS 待转换坐标类型
converter.from(CoordType.GPS); 
// sourceLatLng待转换坐标点 LatLng类型
converter.coord(sourceLatLng); 
// 执行转换操作
LatLng desLatLng = converter.convert();

添加高德地图控件

在布局xml文件中添加地图控件,代码如下:

<com.amap.api.maps.MapView
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</com.amap.api.maps.MapView>

显示单个经纬度的点

显示一个给定经纬度且坐标系为GCJ02的点,如下图:

point.png

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class MainActivity extends Activity {

private MapView mMapView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_map);

mMapView = (MapView) findViewById(R.id.map);
mMapView.onCreate(savedInstanceState);
AMap aMap = mMapView.getMap();

LatLng latLng = new LatLng(29.558392, 106.466887);

// 居中显示
CameraUpdate mCameraUpdate = CameraUpdateFactory.newCameraPosition(
new CameraPosition(latLng, 18, 30, 0));
aMap.moveCamera(mCameraUpdate);

aMap.addMarker(new MarkerOptions()
.position(latLng)
.title("29.558392, 106.466887")
.snippet("29.558392, 106.466887"));
}

@Override
protected void onDestroy() {
mMapView.onDestroy();
}
}

先是通过R.id.map找到布局文件文件中的地图控件mMapView,然后再获得地图对象,创建一个经纬度为29.558392, 106.466887LatLng对象,最后通过居中显示出相应的点。

显示多个经纬度的点

显示多个给定经纬度且坐标系为GCJ02的点,如下图:

mutil_point.png

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class MainActivity extends Activity {

private MapView mMapView;
private List<LatLng> latLngs = new ArrayList<LatLng>();

private void init() {
latLngs.add(new LatLng(29.558392, 106.466887));
latLngs.add(new LatLng(29.558239, 106.466955));
latLngs.add(new LatLng(29.558016, 106.466991));
latLngs.add(new LatLng(29.557745, 106.467043));
latLngs.add(new LatLng(29.557443, 106.467132));
latLngs.add(new LatLng(29.557175, 106.46728));
latLngs.add(new LatLng(29.556989, 106.467464));
latLngs.add(new LatLng(29.556925, 106.46764));
latLngs.add(new LatLng(29.556966, 106.467818));
latLngs.add(new LatLng(29.557039, 106.468056));
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_map);

init();

mMapView = (MapView) findViewById(R.id.map);
mMapView.onCreate(savedInstanceState);
AMap aMap = mMapView.getMap();

for(int i = 0; i < latLngs.size(); ++i) {

if(i == 0) {
// 居中显示
CameraUpdate mCameraUpdate = CameraUpdateFactory.newCameraPosition(
new CameraPosition(latLngs.get(i), 18, 30, 0));
aMap.moveCamera(mCameraUpdate);
}

aMap.addMarker(new MarkerOptions()
.position(latLngs.get(i))
.title("point: " + i)
.snippet(latLngs.get(i).toString()));
}
}

@Override
protected void onDestroy() {
mMapView.onDestroy();
}
}

init函数中把要显示点的经纬度添加到一个List中,以List中的第一个点为中心点,调用地图进行显示。

显示线

给定多个经纬度且坐标系为GCJ02的点,把它们连成一条线,如下图:

line.png

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class MainActivity extends Activity {

private MapView mMapView;
private List<LatLng> latLngs = new ArrayList<LatLng>();

private void init() {
latLngs.add(new LatLng(29.558392, 106.466887));
latLngs.add(new LatLng(29.558239, 106.466955));
latLngs.add(new LatLng(29.558016, 106.466991));
latLngs.add(new LatLng(29.557745, 106.467043));
latLngs.add(new LatLng(29.557443, 106.467132));
latLngs.add(new LatLng(29.557175, 106.46728));
latLngs.add(new LatLng(29.556989, 106.467464));
latLngs.add(new LatLng(29.556925, 106.46764));
latLngs.add(new LatLng(29.556966, 106.467818));
latLngs.add(new LatLng(29.557039, 106.468056));
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_map);

init();

mMapView = (MapView) findViewById(R.id.map);
mMapView.onCreate(savedInstanceState);
AMap aMap = mMapView.getMap();

// 居中显示
CameraUpdate mCameraUpdate = CameraUpdateFactory.newCameraPosition(
new CameraPosition(latLngs.get(0), 18, 30, 0));
aMap.moveCamera(mCameraUpdate);

aMap.addPolyline(new PolylineOptions()
.addAll(latLngs)
.width(10)
.color(Color.argb(255, 255, 0, 0)));
}

@Override
protected void onDestroy() {
mMapView.onDestroy();
}
}

init函数中把要显示点的经纬度添加到一个List中,以List中的第一个点为中心点,直接调用addPolyline函数就可以显示,可以设置显示线的颜色,大小等。

计算距离

高德地图提供了计算两个点之间的距离的函数calculateLineDistance,把上面的线的距离计算出来,显示到MainActivitytitle里。如下图:

distance.png

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class MainActivity extends Activity {

private MapView mMapView;
private List<LatLng> latLngs = new ArrayList<LatLng>();

private void init() {
latLngs.add(new LatLng(29.558392, 106.466887));
latLngs.add(new LatLng(29.558239, 106.466955));
latLngs.add(new LatLng(29.558016, 106.466991));
latLngs.add(new LatLng(29.557745, 106.467043));
latLngs.add(new LatLng(29.557443, 106.467132));
latLngs.add(new LatLng(29.557175, 106.46728));
latLngs.add(new LatLng(29.556989, 106.467464));
latLngs.add(new LatLng(29.556925, 106.46764));
latLngs.add(new LatLng(29.556966, 106.467818));
latLngs.add(new LatLng(29.557039, 106.468056));
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_map);

init();

mMapView = (MapView) findViewById(R.id.map);
mMapView.onCreate(savedInstanceState);
AMap aMap = mMapView.getMap();

CameraUpdate mCameraUpdate = CameraUpdateFactory.newCameraPosition(
new CameraPosition(latLngs.get(0), 18, 30, 0));
aMap.moveCamera(mCameraUpdate);

aMap.addPolyline(new PolylineOptions()
.addAll(latLngs)
.width(10)
.color(Color.argb(255, 255, 0, 0)));

// 计算距离
float distance = 0;

for(int i = 0; i < latLngs.size() - 1; ++i) {
distance += AMapUtils.calculateLineDistance(latLngs.get(i), latLngs.get(i+1));
}
setTitle(distance + "m");
}

@Override
protected void onDestroy() {
mMapView.onDestroy();
}
}

通过调用calculateLineDistance计算每两个点之间的距离,再把它们累加起来,最后显示在MainActivitytitle里为229.51405米。