Android开发笔记Google地图定位与路线显示

来源:互联网 发布:linux虚拟机安装jdk 编辑:程序博客网 时间:2024/04/27 17:14

当你的应用需要加入Google地图,并且需要根据两点坐标规划路线时,就需要在应用中加入Google地图,调用指定的api获取路线数据,再把数据显示出来。

1.加载google地图,实例化一个地图视图对象,地图操作管理对象,地图图层对象等。图层对象可以用于在指定坐标位置显示用户自定义的图标,以及用于显示路径。

LayoutInflater inflater = getLayoutInflater();

bubble = (LinearLayout) inflater.inflate(R.layout.map_bubblemapView,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), thismapViewbubblefalse);

frommapOverlay = new MapItemizedOverlay(this.getResources().getDrawable(R.drawable.pin_purple), thismapViewbubble,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((intPOINT_LAT, (intPOINT_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));

  }

}

原创粉丝点击