当你的应用需要加入Google地图,并且需要根据两点坐标规划路线时,就需要在应用中加入Google地图,调用指定的api获取路线数据,再把数据显示出来。
1.加载google地图,实例化一个地图视图对象,地图操作管理对象,地图图层对象等。图层对象可以用于在指定坐标位置显示用户自定义的图标,以及用于显示路径。
LayoutInflater inflater = getLayoutInflater();
bubble = (LinearLayout) inflater.inflate(R.layout.map_bubble, mapView,false);
mapView = (MapView) findViewById(R.id.location_mapview);
mapView.setBuiltInZoomControls(true);
myMapController = mapView.getController();
lm = (LocationManager) getSystemService(LOCATION_SERVICE);
mymapOverlay = new MapItemizedOverlay(this.getResources().getDrawable(R.drawable.my_pin), this, mapView, bubble, false);
frommapOverlay = new MapItemizedOverlay(this.getResources().getDrawable(R.drawable.pin_purple), this, mapView, bubble,false);
2.获取GPS定位或路径数据
3.解析数据并在地图上显示
一、在Google地图中定位用户当前的位置
1.获取用户当前位置,常用的定位方法即可。
long _15MinutesAgo = System.currentTimeMillis() - 15 * 60 * 1000;
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location == null || location.getTime() < _15MinutesAgo) {
location = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
2.在地图上显示位置,即用经纬度构造一个地点坐标位置,并加入地图控制管理类的显示图层中,以及重新显示地图
double latitude = myLocation.getLatitude() * 1E6;
double longitude = myLocation.getLongitude() * 1E6;
GeoPoint myPoint = new GeoPoint((int) latitude, (int) longitude);
myMapController.animateTo(myPoint);
List<Overlay> mapOverlays = mapView.getOverlays();
OverlayItem item = new OverlayItem(myPoint, "Your Position", "");
mymapOverlay.clearOverlay();
mymapOverlay.addOverlay(item);
mapOverlays.add(mymapOverlay);
mapView.postInvalidate();
二、显示两点之间的路径
根据两个坐标位置信息获取路径数据,并将解码的路径显示与地图图层中
GeoPoint fromPoint = new GeoPoint((int) latitude, (int) longitude);
GeoPoint topoint = new GeoPoint((int) POINT_LAT, (int) POINT_LONG);
newDrawPath(fromPoint, topoint, Color.BLUE);//蓝色为路径的颜色
private void newDrawPath(final GeoPoint src, final GeoPoint dest,finalint color) {
new Thread() {
public void run() {
final List<GeoPoint> routepoints = getDrawPath(src, dest, color);
runOnUiThread(new Runnable() {
@Override
public void run() {
if (routepoints == null)
return;
drawPath(routepoints, color);
}
});
}
}.start();
}
获取的路径数据点,无法直接使用,需要进行解码。
List<GeoPoint> getDrawPath(final GeoPoint src, final GeoPoint dest,finalint color) {
// connect to map web service
StringBuilder urlString = new StringBuilder();
urlString.append("http://maps.google.com.hk/maps?output=dragdir");
urlString.append("&saddr=");// from
urlString.append(Double.toString((double) src.getLatitudeE6() / 1.0E6));
urlString.append(",");
urlString.append(Double.toString((double) src.getLongitudeE6() / 1.0E6));
urlString.append("&daddr=");// to
urlString.append(Double.toString((double) dest.getLatitudeE6() / 1.0E6));
urlString.append(",");
urlString.append(Double.toString((double) dest.getLongitudeE6() / 1.0E6));
urlString.append("&dirflg=r");
try {
String result = NetUtil.getResult(urlString.toString(), "US-ASCII");
return decodeJson(result);
} catch (IOException ex) {
}
return null;
}
显示路径
void drawPath(List<GeoPoint> routepoints, int color) {
GeoPoint gp1 = null;
GeoPoint gp2 = routepoints.get(0);
for (GeoPoint point : routepoints) {
gp1 = gp2;
gp2 = point;
mapView.getOverlays().add(new MapDirectionOverlay(gp1, gp2, 2, color));
}
}