百度地图综合

本文主要包括百度地图API的综合应用,主要内容如下

  1. 地图图层展示,包括热力图与实时路况图
  2. 添加覆盖物,包括图片,文字,折线等
  3. 地图控制,包括俯视,旋转,放大,缩小等
  4. 定位,并且用图标标示出来
  5. POI检索,检索出范围内的兴趣点
  6. 公交线路查询
  7. 路线规划,包括驾车,公交,步行。

这里写图片描述

主界面

package com.zj.mapall;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;/*** 程序启动引导页,选择不同的功能进入不同的界面* * @author ys**/
public class LaunchActivity extends Activity {private ListView listview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_launch);listview = (ListView) findViewById(R.id.activity_listview);init();}/*** 初始化listview列表*/private void init() {final Class[] clazz = { BasisMapActivity.class,AddOverlayActivity.class, MapControllActivity.class,LocationActivity.class,PoiSearchActivity.class,BusLineSearchActivity.class,RoutePlanningActivity.class};String arr[] = { "地图图层展示" ,"添加覆盖物" ,"地图控制 ","定位","POI检索","公交线路查询","路线规划"};ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, arr);listview.setAdapter(adapter);listview.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {startActivity(new Intent(LaunchActivity.this, clazz[position]));}});}
}

注意,加载地图前应初始化SDKInitializer,可放在Application中初始化

package com.zj.mapall;import com.baidu.mapapi.SDKInitializer;import android.app.Application;public class MyApplication extends Application{@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();SDKInitializer.initialize(getApplicationContext());}}

基础地图展示

package com.zj.mapall;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;public class BasisMapActivity extends Activity implements OnClickListener {// 百度地图控件private MapView mMapView = null;// 百度地图对象private BaiduMap bdMap;// 普通地图private Button normalMapBtn;// 卫星地图private Button satelliteMapBtn;// 实时路况交通图private Button trafficMapBtn;// 热力图private Button headMapBtn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_basis_map);init();}/*** 初始化方法*/private void init() {mMapView = (MapView) findViewById(R.id.bmapview);mMapView.showZoomControls(false);// 不显示默认的缩放控件MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);bdMap = mMapView.getMap();bdMap.setMapStatus(msu);normalMapBtn = (Button) findViewById(R.id.normal_map_btn);satelliteMapBtn = (Button) findViewById(R.id.satellite_map_btn);trafficMapBtn = (Button) findViewById(R.id.traffic_map_btn);headMapBtn = (Button) findViewById(R.id.heat_map_btn);normalMapBtn.setOnClickListener(this);satelliteMapBtn.setOnClickListener(this);trafficMapBtn.setOnClickListener(this);headMapBtn.setOnClickListener(this);//normalMapBtn.setEnabled(false);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.normal_map_btn:bdMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);normalMapBtn.setEnabled(false);satelliteMapBtn.setEnabled(true);break;case R.id.satellite_map_btn:bdMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);satelliteMapBtn.setEnabled(false);normalMapBtn.setEnabled(true);break;case R.id.traffic_map_btn:if (!bdMap.isTrafficEnabled()) {bdMap.setTrafficEnabled(true);trafficMapBtn.setText("关闭实时路况");} else {bdMap.setTrafficEnabled(false);trafficMapBtn.setText("打开实时路况");}break;case R.id.heat_map_btn:if (!bdMap.isBaiduHeatMapEnabled()) {bdMap.setBaiduHeatMapEnabled(true);headMapBtn.setText("关闭热力图");} else {bdMap.setBaiduHeatMapEnabled(false);headMapBtn.setText("打开热力图");}break;}}@Overrideprotected void onResume() {super.onResume();mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();mMapView.onPause();}@Overrideprotected void onDestroy() {mMapView.onDestroy();mMapView = null;super.onDestroy();}}

参考链接:

Android百度地图开发(一)之初体验 - crazy_jack - 博客频道 - CSDN.NET

添加覆盖物实现

package com.zj.mapall;import java.util.ArrayList;
import java.util.List;import com.baidu.mapapi.map.ArcOptions;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.CircleOptions;
import com.baidu.mapapi.map.DotOptions;
import com.baidu.mapapi.map.GroundOverlayOptions;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.PolygonOptions;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.map.Stroke;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.map.BaiduMap.OnMapClickListener;
import com.baidu.mapapi.map.BaiduMap.OnMapDoubleClickListener;
import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.BaiduMap.OnMarkerDragListener;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;/*** 添加覆盖物(marker、polygon、text、polyline、dot、circle、arc、ground、)* 地图的单击事件、双击事件、marker的拖拽事件    +  地理编码与反地理编码* * @author ys**/
public class AddOverlayActivity extends Activity implements OnClickListener {// 百度地图控件private MapView mMapView = null;// 百度地图对象private BaiduMap bdMap;// 覆盖物按钮private Button overlayBtn;// markerprivate Marker marker1;// 标记显示第几个覆盖物 1->marker 2->polygon 3->text 4->GroundOverlay(地形图图层) 5->dot// 6->circle 7->arc 8->polylineprivate int overlayIndex = 0;// 经纬度private double latitude = 39.9401752;private double longitude = 116.400244;// 初始化全局 bitmap 信息,不用时及时 recycle// 构建marker图标BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);// GroundOptionsBitmapDescriptor bitmap2 = BitmapDescriptorFactory.fromResource(R.drawable.csdn_blog);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_add_overlay);mMapView = (MapView) findViewById(R.id.bmapview);MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);bdMap = mMapView.getMap();bdMap.setMapStatus(msu);// 对marker覆盖物添加点击事件bdMap.setOnMarkerClickListener(new OnMarkerClickListener() {@Overridepublic boolean onMarkerClick(Marker arg0) {if (arg0 == marker1) {final LatLng latLng = arg0.getPosition();// 将经纬度转换成屏幕上的点// Point point =// bdMap.getProjection().toScreenLocation(latLng);Toast.makeText(AddOverlayActivity.this, latLng.toString(),Toast.LENGTH_SHORT).show();}return false;}});overlayBtn = (Button) findViewById(R.id.overlay_btn);overlayBtn.setOnClickListener(this);/*** 地图单击事件*/bdMap.setOnMapClickListener(new OnMapClickListener() {@Overridepublic boolean onMapPoiClick(MapPoi arg0) {return false;}@Overridepublic void onMapClick(LatLng latLng) {displayInfoWindow(latLng);}});/*** 地图双击事件*/bdMap.setOnMapDoubleClickListener(new OnMapDoubleClickListener() {@Overridepublic void onMapDoubleClick(LatLng arg0) {}});/*** Marker拖拽事件*/bdMap.setOnMarkerDragListener(new OnMarkerDragListener() {@Overridepublic void onMarkerDragStart(Marker arg0) {}@Overridepublic void onMarkerDragEnd(Marker arg0) {Toast.makeText(AddOverlayActivity.this,"拖拽结束,新位置:" + arg0.getPosition().latitude + ", "+ arg0.getPosition().longitude,Toast.LENGTH_LONG).show();reverseGeoCode(arg0.getPosition());}@Overridepublic void onMarkerDrag(Marker arg0) {}});}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.overlay_btn:switch (overlayIndex) {case 0:overlayBtn.setText("显示多边形覆盖物");addMarkerOverlay();break;case 1:overlayBtn.setText("显示文字覆盖物");addPolygonOptions();break;case 2:overlayBtn.setText("显示地形图图层覆盖物");addTextOptions();break;case 3:overlayBtn.setText("显示折线覆盖物");addGroundOverlayOptions();break;case 4:overlayBtn.setText("显示圆点覆盖物");addPolylineOptions();break;case 5:overlayBtn.setText("显示圆(空心)覆盖物");addDotOptions();break;case 6:overlayBtn.setText("显示折线覆盖物");addCircleOptions();break;case 7:overlayBtn.setText("显示marker覆盖物");addArcOptions();break;}overlayIndex = (overlayIndex + 1) % 8;break;}}/*** 添加标注覆盖物*/private void addMarkerOverlay() {bdMap.clear();// 定义marker坐标点LatLng point = new LatLng(latitude, longitude);// 构建markerOption,用于在地图上添加markerOverlayOptions options = new MarkerOptions()//.position(point)// 设置marker的位置.icon(bitmap)// 设置marker的图标.zIndex(9)// 設置marker的所在層級.draggable(true);// 设置手势拖拽// 在地图上添加marker,并显示marker1 = (Marker) bdMap.addOverlay(options);}/*** 添加多边形覆盖物*/private void addPolygonOptions() {bdMap.clear();// 定义多边形的五个顶点LatLng pt1 = new LatLng(latitude + 0.02, longitude);LatLng pt2 = new LatLng(latitude, longitude - 0.03);LatLng pt3 = new LatLng(latitude - 0.02, longitude - 0.01);LatLng pt4 = new LatLng(latitude - 0.02, longitude + 0.01);LatLng pt5 = new LatLng(latitude, longitude + 0.03);List<LatLng> points = new ArrayList<LatLng>();points.add(pt1);points.add(pt2);points.add(pt3);points.add(pt4);points.add(pt5);//PolygonOptions polygonOptions = new PolygonOptions();polygonOptions.points(points);polygonOptions.fillColor(0xAAFFFF00);polygonOptions.stroke(new Stroke(2, 0xAA00FF00));bdMap.addOverlay(polygonOptions);}/*** 添加文字覆盖物*/private void addTextOptions() {bdMap.clear();LatLng latLng = new LatLng(latitude, longitude);TextOptions textOptions = new TextOptions();textOptions.bgColor(0xAAFFFF00) // 設置文字覆蓋物背景顏色.fontSize(28) // 设置字体大小.fontColor(0xFFFF00FF)// 设置字体颜色.text("我在这里啊!!!!") // 文字内容.rotate(-30) // 设置文字的旋转角度.position(latLng);// 设置位置bdMap.addOverlay(textOptions);}/*** 添加地形图图层*/private void addGroundOverlayOptions() {bdMap.clear();LatLng southwest = new LatLng(latitude - 0.01, longitude - 0.012);// 西南LatLng northeast = new LatLng(latitude + 0.01, longitude + 0.012);// 东北LatLngBounds bounds = new LatLngBounds.Builder().include(southwest).include(northeast).build();// 得到一个地理范围对象GroundOverlayOptions groundOverlayOptions = new GroundOverlayOptions();groundOverlayOptions.image(bitmap2);// 显示的图片groundOverlayOptions.positionFromBounds(bounds);// 显示的位置groundOverlayOptions.transparency(0.7f);// 显示的透明度bdMap.addOverlay(groundOverlayOptions);}/*** 添加折线覆盖物*/private void addPolylineOptions() {bdMap.clear();// 点LatLng pt1 = new LatLng(latitude + 0.01, longitude);LatLng pt2 = new LatLng(latitude, longitude - 0.01);LatLng pt3 = new LatLng(latitude - 0.01, longitude - 0.01);LatLng pt5 = new LatLng(latitude, longitude + 0.01);List<LatLng> points = new ArrayList<LatLng>();points.add(pt1);points.add(pt2);points.add(pt3);points.add(pt5);//PolylineOptions polylineOptions = new PolylineOptions();polylineOptions.points(points);polylineOptions.color(0xFF000000);polylineOptions.width(4);// 折线线宽bdMap.addOverlay(polylineOptions);}/*** 添加圆点覆盖物*/private void addDotOptions() {bdMap.clear();DotOptions dotOptions = new DotOptions();dotOptions.center(new LatLng(latitude, longitude));// 设置圆心坐标dotOptions.color(0XFFfaa755);// 颜色dotOptions.radius(25);// 设置半径bdMap.addOverlay(dotOptions);}/*** 添加圆(空心)覆盖物*/private void addCircleOptions() {bdMap.clear();CircleOptions circleOptions = new CircleOptions();circleOptions.center(new LatLng(latitude, longitude));// 设置圆心坐标circleOptions.fillColor(0XFFfaa755);// 圆的填充颜色circleOptions.radius(150);// 设置半径circleOptions.stroke(new Stroke(5, 0xAA00FF00));// 设置边框bdMap.addOverlay(circleOptions);}/*** 添加弧线覆盖物*/private void addArcOptions() {bdMap.clear();LatLng pt1 = new LatLng(latitude, longitude - 0.01);LatLng pt2 = new LatLng(latitude - 0.01, longitude - 0.01);LatLng pt3 = new LatLng(latitude, longitude + 0.01);ArcOptions arcOptions = new ArcOptions();arcOptions.points(pt1, pt2, pt3);// 设置弧线的起点、中点、终点坐标arcOptions.width(5);// 线宽arcOptions.color(0xFF000000);bdMap.addOverlay(arcOptions);}/*** 显示弹出窗口覆盖物*/private void displayInfoWindow(final LatLng latLng) {// 创建infowindow展示的viewButton btn = new Button(getApplicationContext());btn.setBackgroundResource(R.drawable.popup);btn.setText("点我点我~");btn.setTextColor(0xAA000000);BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromView(btn);// infowindow点击事件OnInfoWindowClickListener infoWindowClickListener = new OnInfoWindowClickListener() {@Overridepublic void onInfoWindowClick() {reverseGeoCode(latLng);// 隐藏InfoWindowbdMap.hideInfoWindow();}};// 创建infowindowInfoWindow infoWindow = new InfoWindow(bitmapDescriptor, latLng, -47,infoWindowClickListener);// 显示InfoWindowbdMap.showInfoWindow(infoWindow);}/*** 反地理编码得到地址信息*/private void reverseGeoCode(LatLng latLng) {// 创建地理编码检索实例GeoCoder geoCoder = GeoCoder.newInstance();//OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {// 反地理编码查询结果回调函数@Overridepublic void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {if (result == null|| result.error != SearchResult.ERRORNO.NO_ERROR) {// 没有检测到结果Toast.makeText(AddOverlayActivity.this, "抱歉,未能找到结果",Toast.LENGTH_LONG).show();}Toast.makeText(AddOverlayActivity.this,"位置:" + result.getAddress(), Toast.LENGTH_LONG).show();}// 地理编码查询结果回调函数@Overridepublic void onGetGeoCodeResult(GeoCodeResult result) {if (result == null|| result.error != SearchResult.ERRORNO.NO_ERROR) {// 没有检测到结果}}};// 设置地理编码检索监听者geoCoder.setOnGetGeoCodeResultListener(listener);//geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));// 释放地理编码检索实例// geoCoder.destroy();}@Overrideprotected void onResume() {super.onResume();mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();mMapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();mMapView.onDestroy();// 回收bitmip资源bitmap.recycle();bitmap2.recycle();}
}

参考链接

百度地图开发(二)之添加覆盖物 + 地理编码和反地理编码 - crazy_jack - 博客频道 - CSDN.NET

地图控制实现

package com.zj.mapall;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapClickListener;
import com.baidu.mapapi.map.BaiduMap.SnapshotReadyCallback;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;/*** 地图控制demo(点击、双击、长按、缩放、旋转、俯视) + 定位* * @author ys**/
public class MapControllActivity extends Activity implements OnClickListener {// 地图控件对象private MapView mapView;// 百度地图对象private BaiduMap bdMap;// 经纬度private double latitude, longitude;// 缩小private Button zoomOutBtn;// 放大private Button zoomInBtn;// 旋转private Button rotateBtn;// 俯视private Button overlookBtn;// 截图private Button screenShotBtn;// 标记是否已经放大到最大或者缩小到最小级别private boolean isMaxOrMin = false;private float maxZoom = 0.0f;private float minZoom = 0.0f;// 记录当前地图的缩放级别private float currentZoom = 0.0f;// 描述地图状态将要发生的状态private MapStatusUpdate msu;// 用于生成地图将要发生的变化private MapStatusUpdateFactory msuFactory;// 定义地图状态private MapStatus mapStatus;// 旋转角度private float rotateAngle = 0.0f;// 俯视角度 (0 ~ -45°)private float overlookAngle = 0.0f;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_map_controll);init();}/*** */private void init() {mapView = (MapView) findViewById(R.id.bd_mapview);bdMap = mapView.getMap();mapView.showZoomControls(false);// 不显示默认的缩放控件mapView.showScaleControl(false);// 不显示默认比例尺控件maxZoom = bdMap.getMaxZoomLevel();// 获得地图的最大缩放级别minZoom = bdMap.getMinZoomLevel();// 获得地图的最小缩放级别zoomInBtn = (Button) findViewById(R.id.zoom_in_btn);zoomOutBtn = (Button) findViewById(R.id.zoom_out_btn);rotateBtn = (Button) findViewById(R.id.rotate_btn);overlookBtn = (Button) findViewById(R.id.overlook_btn);screenShotBtn = (Button) findViewById(R.id.screen_shot_btn);zoomInBtn.setOnClickListener(this);zoomOutBtn.setOnClickListener(this);rotateBtn.setOnClickListener(this);overlookBtn.setOnClickListener(this);screenShotBtn.setOnClickListener(this);bdMap.setOnMapClickListener(new OnMapClickListener() {@Overridepublic boolean onMapPoiClick(MapPoi arg0) {return false;}@Overridepublic void onMapClick(LatLng arg0) {// 设置地图新中心点msu = msuFactory.newLatLng(arg0);bdMap.animateMapStatus(msu);Toast.makeText(MapControllActivity.this,"地图中心点移动到:" + arg0.toString(), Toast.LENGTH_SHORT).show();}});}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.zoom_out_btn:// 缩小msu = msuFactory.zoomOut();bdMap.animateMapStatus(msu);currentZoom = bdMap.getMapStatus().zoom;Toast.makeText(MapControllActivity.this,"当前地图的缩放级别是:" + currentZoom, Toast.LENGTH_SHORT).show();break;case R.id.zoom_in_btn:// 放大msu = msuFactory.zoomIn();bdMap.animateMapStatus(msu);currentZoom = bdMap.getMapStatus().zoom;Toast.makeText(MapControllActivity.this,"当前地图的缩放级别是:" + currentZoom, Toast.LENGTH_SHORT).show();break;case R.id.rotate_btn:// 旋转mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).rotate(rotateAngle += 30).build();msu = msuFactory.newMapStatus(mapStatus);bdMap.animateMapStatus(msu);break;case R.id.overlook_btn:// 俯视mapStatus = new MapStatus.Builder(bdMap.getMapStatus()).overlook(overlookAngle -= 10).build();msu = msuFactory.newMapStatus(mapStatus);bdMap.animateMapStatus(msu);break;case R.id.screen_shot_btn:// 截图bdMap.snapshot(new SnapshotReadyCallback() {@Overridepublic void onSnapshotReady(Bitmap bitmap) {File file = new File("/mnt/sdcard/test.png");FileOutputStream out;try {out = new FileOutputStream(file);if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)) {out.flush();out.close();}Toast.makeText(MapControllActivity.this,"屏幕截图成功,图片存在: " + file.toString(),Toast.LENGTH_SHORT).show();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}});break;default:break;}}@Overrideprotected void onPause() {super.onPause();mapView.onPause();}@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onDestroy() {super.onDestroy();mapView.onDestroy();}}

定位实现

package com.zj.mapall;import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.BDNotifyListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;import android.app.Activity;
import android.app.Service;
import android.os.Bundle;
import android.os.Vibrator;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;/*** 定位* * @author ys**/
public class LocationActivity extends Activity implements OnClickListener {private MapView mapview;private BaiduMap bdMap;private LocationClient locationClient;private BDLocationListener locationListener;private BDNotifyListener notifyListener;private double longitude;// 精度private double latitude;// 维度private float radius;// 定位精度半径,单位是米private String addrStr;// 反地理编码private String province;// 省份信息private String city;// 城市信息private String district;// 区县信息private float direction;// 手机方向信息private int locType;// 定位按钮private Button locateBtn;// 定位模式 (普通-跟随-罗盘)private MyLocationConfiguration.LocationMode currentMode;// 定位图标描述private BitmapDescriptor currentMarker = null;// 记录是否第一次定位private boolean isFirstLoc = true;//振动器设备private Vibrator mVibrator;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_location);mapview = (MapView) findViewById(R.id.bd_mapview);bdMap = mapview.getMap();locateBtn = (Button) findViewById(R.id.locate_btn);locateBtn.setOnClickListener(this);currentMode = MyLocationConfiguration.LocationMode.NORMAL;locateBtn.setText("普通");mVibrator =(Vibrator)getApplicationContext().getSystemService(Service.VIBRATOR_SERVICE);init();}/*** */private void init() {bdMap.setMyLocationEnabled(true);// 1. 初始化LocationClient类locationClient = new LocationClient(getApplicationContext());// 2. 声明LocationListener类locationListener = new MyLocationListener();// 3. 注册监听函数locationClient.registerLocationListener(locationListener);// 4. 设置参数LocationClientOption locOption = new LocationClientOption();locOption.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式locOption.setCoorType("bd09ll");// 设置定位结果类型locOption.setScanSpan(20000);// 设置发起定位请求的间隔时间,mslocOption.setIsNeedAddress(true);// 返回的定位结果包含地址信息locOption.setNeedDeviceDirect(true);// 设置返回结果包含手机的方向locationClient.setLocOption(locOption);// 5. 注册位置提醒监听事件notifyListener = new MyNotifyListener();notifyListener.SetNotifyLocation(longitude, latitude, 3000, "bd09ll");//精度,维度,范围,坐标类型locationClient.registerNotify(notifyListener);// 6. 开启/关闭 定位SDKlocationClient.start();// locationClient.stop();// 发起定位,异步获取当前位置,因为是异步的,所以立即返回,不会引起阻塞// 定位的结果在ReceiveListener的方法onReceive方法的参数中返回。// 当定位SDK从定位依据判定,位置和上一次没发生变化,而且上一次定位结果可用时,则不会发生网络请求,而是返回上一次的定位结果。// 返回值,0:正常发起了定位 1:service没有启动 2:没有监听函数// 6:两次请求时间太短(前后两次请求定位时间间隔不能小于1000ms)/** if (locationClient != null && locationClient.isStarted()) {* requestResult = locationClient.requestLocation(); } else {* Log.d("LocSDK5", "locClient is null or not started"); }*/}/*** * @author ys**/class MyLocationListener implements BDLocationListener {// 异步返回的定位结果@Overridepublic void onReceiveLocation(BDLocation location) {if (location == null) {return;}locType = location.getLocType();Toast.makeText(LocationActivity.this, "当前定位的返回值是:"+locType, Toast.LENGTH_SHORT).show();longitude = location.getLongitude();latitude = location.getLatitude();if (location.hasRadius()) {// 判断是否有定位精度半径radius = location.getRadius();}if (locType == BDLocation.TypeGpsLocation) {//Toast.makeText(LocationActivity.this,"当前速度是:" + location.getSpeed() + "~~定位使用卫星数量:"+ location.getSatelliteNumber(),Toast.LENGTH_SHORT).show();} else if (locType == BDLocation.TypeNetWorkLocation) {addrStr = location.getAddrStr();// 获取反地理编码(文字描述的地址)Toast.makeText(LocationActivity.this, addrStr,Toast.LENGTH_SHORT).show();}direction = location.getDirection();// 获取手机方向,【0~360°】,手机上面正面朝北为0°province = location.getProvince();// 省份city = location.getCity();// 城市district = location.getDistrict();// 区县Toast.makeText(LocationActivity.this,province + "~" + city + "~" + district, Toast.LENGTH_SHORT).show();// 构造定位数据MyLocationData locData = new MyLocationData.Builder().accuracy(radius)//.direction(direction)// 方向.latitude(latitude)//.longitude(longitude)//.build();// 设置定位数据bdMap.setMyLocationData(locData);LatLng ll = new LatLng(latitude, longitude);MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(ll);bdMap.animateMapStatus(msu);}}/*** 位置提醒监听器* @author ys**/class MyNotifyListener extends BDNotifyListener {@Overridepublic void onNotify(BDLocation bdLocation, float distance) {super.onNotify(bdLocation, distance);mVibrator.vibrate(1000);//振动提醒已到设定位置附近Toast.makeText(LocationActivity.this, "震动提醒", Toast.LENGTH_SHORT).show();}}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.locate_btn:// 定位switch (currentMode) {case NORMAL:locateBtn.setText("跟随");currentMode = MyLocationConfiguration.LocationMode.FOLLOWING;break;case FOLLOWING:locateBtn.setText("罗盘");currentMode = MyLocationConfiguration.LocationMode.COMPASS;break;case COMPASS:locateBtn.setText("普通");currentMode = MyLocationConfiguration.LocationMode.NORMAL;break;}bdMap.setMyLocationConfigeration(new MyLocationConfiguration(currentMode, true, currentMarker));break;}}@Overrideprotected void onResume() {super.onResume();mapview.onResume();}@Overrideprotected void onPause() {super.onPause();mapview.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();mapview.onDestroy();locationClient.unRegisterLocationListener(locationListener);//取消位置提醒locationClient.removeNotifyEvent(notifyListener);locationClient.stop();}
}

参考链接

百度地图开发(三)之地图控制 + 定位 - crazy_jack - 博客频道 - CSDN.NET

效果如下

这里写图片描述

POI检索实现

package com.zj.mapall;import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import com.baidu.mapapi.overlayutil.PoiOverlay;import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiBoundSearchOption;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiDetailSearchOption;
import com.baidu.mapapi.search.poi.PoiNearbySearchOption;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import com.baidu.mapapi.search.share.OnGetShareUrlResultListener;
import com.baidu.mapapi.search.share.ShareUrlResult;
import com.baidu.mapapi.search.share.ShareUrlSearch;import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;/*** POI检索 1.周边检索 2. 范围检索 3. 城市检索 4.详细检索* * @author ys**/
public class PoiSearchActivity extends Activity implements OnClickListener {private MapView mapView;private BaiduMap bdMap;//private PoiSearch poiSearch;private ShareUrlSearch shareUrlSearch;private EditText editCityEt, editSearchKeyEt;// 城市检索,区域检索,周边检索,下一组数据 按钮private Button citySearchBtn, boundSearchBtn, nearbySearchBtn, nextDataBtn;// 记录检索类型private int type;// 记录页标private int page = 1;private int totalPage = 0;private double latitude = 39.9361752;private double longitude = 116.400244;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_poi_search);init();}private void init() {mapView = (MapView) findViewById(R.id.mapview);mapView.showZoomControls(false);bdMap = mapView.getMap();// 实例化PoiSearch对象poiSearch = PoiSearch.newInstance();// 设置检索监听器poiSearch.setOnGetPoiSearchResultListener(poiSearchListener);editCityEt = (EditText) findViewById(R.id.city);editSearchKeyEt = (EditText) findViewById(R.id.searchkey);citySearchBtn = (Button) findViewById(R.id.city_search_btn);boundSearchBtn = (Button) findViewById(R.id.bound_search_btn);nearbySearchBtn = (Button) findViewById(R.id.nearby_search_btn);nextDataBtn = (Button) findViewById(R.id.next_data_btn);nextDataBtn.setEnabled(false);citySearchBtn.setOnClickListener(this);boundSearchBtn.setOnClickListener(this);nearbySearchBtn.setOnClickListener(this);nextDataBtn.setOnClickListener(this);editSearchKeyEt.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) {citySearchBtn.setEnabled(true);boundSearchBtn.setEnabled(true);nearbySearchBtn.setEnabled(true);nextDataBtn.setEnabled(false);page = 1;totalPage = 0;}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {}@Overridepublic void afterTextChanged(Editable s) {}});shareUrlSearch = ShareUrlSearch.newInstance();}/*** */OnGetPoiSearchResultListener poiSearchListener = new OnGetPoiSearchResultListener() {@Overridepublic void onGetPoiResult(PoiResult poiResult) {if (poiResult == null|| poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果Toast.makeText(PoiSearchActivity.this, "未找到结果",Toast.LENGTH_LONG).show();return;}if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {// 检索结果正常返回bdMap.clear();MyPoiOverlay poiOverlay = new MyPoiOverlay(bdMap);poiOverlay.setData(poiResult);// 设置POI数据bdMap.setOnMarkerClickListener(poiOverlay);poiOverlay.addToMap();// 将所有的overlay添加到地图上poiOverlay.zoomToSpan();//totalPage = poiResult.getTotalPageNum();// 获取总分页数Toast.makeText(PoiSearchActivity.this,"总共查到" + poiResult.getTotalPoiNum() + "个兴趣点, 分为"+ totalPage + "页", Toast.LENGTH_SHORT).show();}}@Overridepublic void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(PoiSearchActivity.this, "抱歉,未找到结果",Toast.LENGTH_SHORT).show();} else {// 正常返回结果的时候,此处可以获得很多相关信息Toast.makeText(PoiSearchActivity.this,poiDetailResult.getName() + ": "+ poiDetailResult.getAddress(),Toast.LENGTH_LONG).show();}}};/*** 短串检索监听器*/OnGetShareUrlResultListener shareUrlResultListener = new OnGetShareUrlResultListener() {@Overridepublic void onGetPoiDetailShareUrlResult(ShareUrlResult arg0) {}@Overridepublic void onGetLocationShareUrlResult(ShareUrlResult arg0) {}@Overridepublic void onGetRouteShareUrlResult(ShareUrlResult arg0) {// TODO Auto-generated method stub}};class MyPoiOverlay extends PoiOverlay {public MyPoiOverlay(BaiduMap arg0) {super(arg0);}@Overridepublic boolean onPoiClick(int arg0) {super.onPoiClick(arg0);PoiInfo poiInfo = getPoiResult().getAllPoi().get(arg0);poiSearch.searchPoiDetail(new PoiDetailSearchOption().poiUid(poiInfo.uid));return true;}}/*** 城市内搜索*/private void citySearch(int page) {// 设置检索参数PoiCitySearchOption citySearchOption = new PoiCitySearchOption();citySearchOption.city(editCityEt.getText().toString());// 城市citySearchOption.keyword(editSearchKeyEt.getText().toString());// 关键字citySearchOption.pageCapacity(15);// 默认每页10条citySearchOption.pageNum(page);// 分页编号// 发起检索请求poiSearch.searchInCity(citySearchOption);}/*** 范围检索*/private void boundSearch(int page) {PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption();LatLng southwest = new LatLng(latitude - 0.01, longitude - 0.012);// 西南LatLng northeast = new LatLng(latitude + 0.01, longitude + 0.012);// 东北LatLngBounds bounds = new LatLngBounds.Builder().include(southwest).include(northeast).build();// 得到一个地理范围对象boundSearchOption.bound(bounds);// 设置poi检索范围boundSearchOption.keyword(editSearchKeyEt.getText().toString());// 检索关键字boundSearchOption.pageNum(page);poiSearch.searchInBound(boundSearchOption);// 发起poi范围检索请求}/*** 附近检索*/private void nearbySearch(int page) {PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();nearbySearchOption.location(new LatLng(latitude, longitude));nearbySearchOption.keyword(editSearchKeyEt.getText().toString());nearbySearchOption.radius(1000);// 检索半径,单位是米nearbySearchOption.pageNum(page);poiSearch.searchNearby(nearbySearchOption);// 发起附近检索请求}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.city_search_btn:type = 0;page = 1;citySearchBtn.setEnabled(false);boundSearchBtn.setEnabled(true);nearbySearchBtn.setEnabled(true);nextDataBtn.setEnabled(true);bdMap.clear();citySearch(page);break;case R.id.bound_search_btn:type = 1;page = 1;citySearchBtn.setEnabled(true);boundSearchBtn.setEnabled(false);nearbySearchBtn.setEnabled(true);nextDataBtn.setEnabled(true);bdMap.clear();boundSearch(page);break;case R.id.nearby_search_btn:type = 2;page = 1;citySearchBtn.setEnabled(true);boundSearchBtn.setEnabled(true);nearbySearchBtn.setEnabled(false);nextDataBtn.setEnabled(true);bdMap.clear();nearbySearch(page);break;case R.id.next_data_btn:switch (type) {case 0:if (++page <= totalPage) {citySearch(page);} else {Toast.makeText(PoiSearchActivity.this, "已经查到了最后一页~",Toast.LENGTH_SHORT).show();}break;case 1:if (++page <= totalPage) {boundSearch(page);} else {Toast.makeText(PoiSearchActivity.this, "已经查到了最后一页~",Toast.LENGTH_SHORT).show();}break;case 2:if (++page <= totalPage) {nearbySearch(page);} else {Toast.makeText(PoiSearchActivity.this, "已经查到了最后一页~",Toast.LENGTH_SHORT).show();}break;}break;default:break;}}@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onPause() {super.onPause();mapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();poiSearch.destroy();// 释放poi检索对象mapView.onDestroy();}}

注意,在这里需要用到PoiOverlay,最新的jar包中已经没有这个类了,但已经开源,可以直接下载源代码加入

参考链接

现在检索接口中没有PoiOverlay类了吗 - Android地图SDK - 百度地图开放平台 - Powered by Discuz!

百度地图开发(四)之POI检索 - crazy_jack - 博客频道 - CSDN.NET

效果如下

这里写图片描述

公交线路查询实现

package com.zj.mapall;import java.util.ArrayList;
import java.util.List;import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.overlayutil.BusLineOverlay;
import com.baidu.mapapi.search.busline.BusLineResult;
import com.baidu.mapapi.search.busline.BusLineSearch;
import com.baidu.mapapi.search.busline.BusLineSearchOption;
import com.baidu.mapapi.search.busline.OnGetBusLineSearchResultListener;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;/*** 公交线路查询* * @author ys**/
public class BusLineSearchActivity extends Activity implements OnClickListener {private EditText cityEt;private EditText buslineEt;private Button searchBtn;private Button nextlineBtn;private MapView mapView;private BaiduMap bdMap;private String city;// 城市private String busline;// 公交路线private List<String> buslineIdList;// 存储公交线路的uidprivate int buslineIndex = 0;// 标记第几个路线private PoiSearch poiSearch;private BusLineSearch busLineSearch;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_busline_search);init();}/*** 初始化操作*/private void init() {mapView = (MapView) findViewById(R.id.mapview);bdMap = mapView.getMap();cityEt = (EditText) findViewById(R.id.city_et);buslineEt = (EditText) findViewById(R.id.searchkey_et);searchBtn = (Button) findViewById(R.id.busline_search_btn);nextlineBtn = (Button) findViewById(R.id.nextline_btn);searchBtn.setOnClickListener(this);nextlineBtn.setOnClickListener(this);buslineIdList = new ArrayList<String>();poiSearch = PoiSearch.newInstance();poiSearch.setOnGetPoiSearchResultListener(poiSearchResultListener);busLineSearch = BusLineSearch.newInstance();busLineSearch.setOnGetBusLineSearchResultListener(busLineSearchResultListener);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.busline_search_btn:city = cityEt.getText().toString();busline = buslineEt.getText().toString();poiSearch.searchInCity((new PoiCitySearchOption()).city(city).keyword(busline));break;case R.id.nextline_btn:searchBusline();break;}}private void searchBusline() {if (buslineIndex >= buslineIdList.size()) {buslineIndex = 0;}if (buslineIndex >= 0 && buslineIndex < buslineIdList.size()&& buslineIdList.size() > 0) {boolean flag = busLineSearch.searchBusLine((new BusLineSearchOption().city(city).uid(buslineIdList.get(buslineIndex))));if (flag) {Toast.makeText(BusLineSearchActivity.this, "检索成功~", 1000).show();} else {Toast.makeText(BusLineSearchActivity.this, "检索失败~", 1000).show();}buslineIndex++;}}/*** POI检索结果监听器*/OnGetPoiSearchResultListener poiSearchResultListener = new OnGetPoiSearchResultListener() {@Overridepublic void onGetPoiResult(PoiResult poiResult) {if (poiResult == null|| poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果Toast.makeText(BusLineSearchActivity.this, "未找到结果",Toast.LENGTH_LONG).show();return;}if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {// 检索结果正常返回// 遍历所有poi,找到类型为公交线路的poibuslineIdList.clear();for (PoiInfo poi : poiResult.getAllPoi()) {if (poi.type == PoiInfo.POITYPE.BUS_LINE|| poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {buslineIdList.add(poi.uid);}}searchBusline();}}@Overridepublic void onGetPoiDetailResult(PoiDetailResult arg0) {}};/*** 公交信息查询结果监听器*/OnGetBusLineSearchResultListener busLineSearchResultListener = new OnGetBusLineSearchResultListener() {@Overridepublic void onGetBusLineResult(BusLineResult busLineResult) {if (busLineResult.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(BusLineSearchActivity.this, "抱歉,未找到结果",Toast.LENGTH_SHORT).show();} else {bdMap.clear();BusLineOverlay overlay = new MyBuslineOverlay(bdMap);// 用于显示一条公交详情结果的Overlayoverlay.setData(busLineResult);overlay.addToMap();// 将overlay添加到地图上overlay.zoomToSpan();// 缩放地图,使所有overlay都在合适的视野范围内bdMap.setOnMarkerClickListener(overlay);// 公交线路名称Toast.makeText(BusLineSearchActivity.this,busLineResult.getBusLineName(), Toast.LENGTH_SHORT).show();}}};class MyBuslineOverlay extends BusLineOverlay {public MyBuslineOverlay(BaiduMap arg0) {super(arg0);}/*** 站点点击事件*/@Overridepublic boolean onBusStationClick(int arg0) {MarkerOptions options = (MarkerOptions) getOverlayOptions().get(arg0);bdMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(options.getPosition()));return true;}}@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onPause() {super.onPause();mapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();poiSearch.destroy();// 释放检索对象资源busLineSearch.destroy();// 释放检索对象资源mapView.onDestroy();}}

效果如下

这里写图片描述

路径规划实现

package com.zj.mapall;import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.overlayutil.DrivingRouteOverlay;
import com.baidu.mapapi.overlayutil.TransitRouteOverlay;
import com.baidu.mapapi.overlayutil.WalkingRouteOverlay;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.route.BikingRouteResult;
import com.baidu.mapapi.search.route.DrivingRoutePlanOption;
import com.baidu.mapapi.search.route.DrivingRoutePlanOption.DrivingPolicy;
import com.baidu.mapapi.search.route.DrivingRouteResult;
import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener;
import com.baidu.mapapi.search.route.PlanNode;
import com.baidu.mapapi.search.route.RoutePlanSearch;
import com.baidu.mapapi.search.route.TransitRoutePlanOption;
import com.baidu.mapapi.search.route.TransitRoutePlanOption.TransitPolicy;
import com.baidu.mapapi.search.route.TransitRouteResult;
import com.baidu.mapapi.search.route.WalkingRoutePlanOption;
import com.baidu.mapapi.search.route.WalkingRouteResult;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;/*** 路线规划* * @author ys* */
public class RoutePlanningActivity extends Activity implements OnClickListener {private MapView mapView;private BaiduMap bdMap;private EditText startEt;private EditText endEt;private String startPlace;// 开始地点private String endPlace;// 结束地点private Button driveBtn;// 驾车private Button walkBtn;// 步行private Button transitBtn;// 换成 (公交)private Button nextLineBtn;private Spinner drivingSpinner, transitSpinner;private RoutePlanSearch routePlanSearch;// 路径规划搜索接口private int index = -1;private int totalLine = 0;// 记录某种搜索出的方案数量private int drivintResultIndex = 0;// 驾车路线方案indexprivate int transitResultIndex = 0;// 换乘路线方案index@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_route_planning);init();}/*** */private void init() {mapView = (MapView) findViewById(R.id.mapview);mapView.showZoomControls(false);bdMap = mapView.getMap();startEt = (EditText) findViewById(R.id.start_et);endEt = (EditText) findViewById(R.id.end_et);driveBtn = (Button) findViewById(R.id.drive_btn);transitBtn = (Button) findViewById(R.id.transit_btn);walkBtn = (Button) findViewById(R.id.walk_btn);nextLineBtn = (Button) findViewById(R.id.nextline_btn);nextLineBtn.setEnabled(false);driveBtn.setOnClickListener(this);transitBtn.setOnClickListener(this);walkBtn.setOnClickListener(this);nextLineBtn.setOnClickListener(this);drivingSpinner = (Spinner) findViewById(R.id.driving_spinner);String[] drivingItems = getResources().getStringArray(R.array.driving_spinner);ArrayAdapter<String> drivingAdapter = new ArrayAdapter<>(this,android.R.layout.simple_spinner_item, drivingItems);drivingSpinner.setAdapter(drivingAdapter);drivingSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view,int position, long id) {if (index == 0) {drivintResultIndex = 0;drivingSearch(drivintResultIndex);}}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});transitSpinner = (Spinner) findViewById(R.id.transit_spinner);String[] transitItems = getResources().getStringArray(R.array.transit_spinner);ArrayAdapter<String> transitAdapter = new ArrayAdapter<>(this,android.R.layout.simple_spinner_item, transitItems);transitSpinner.setAdapter(transitAdapter);transitSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view,int position, long id) {if (index == 1) {transitResultIndex = 0;transitSearch(transitResultIndex);}}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});routePlanSearch = RoutePlanSearch.newInstance();routePlanSearch.setOnGetRoutePlanResultListener(routePlanResultListener);}/*** 路线规划结果回调*/OnGetRoutePlanResultListener routePlanResultListener = new OnGetRoutePlanResultListener() {/*** 步行路线结果回调*/@Overridepublic void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {bdMap.clear();if (walkingRouteResult == null|| walkingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(RoutePlanningActivity.this, "抱歉,未找到结果",Toast.LENGTH_SHORT).show();}if (walkingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {// TODOreturn;}if (walkingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {WalkingRouteOverlay walkingRouteOverlay = new WalkingRouteOverlay(bdMap);walkingRouteOverlay.setData(walkingRouteResult.getRouteLines().get(drivintResultIndex));bdMap.setOnMarkerClickListener(walkingRouteOverlay);walkingRouteOverlay.addToMap();walkingRouteOverlay.zoomToSpan();totalLine = walkingRouteResult.getRouteLines().size();Toast.makeText(RoutePlanningActivity.this,"共查询出" + totalLine + "条符合条件的线路", 1000).show();if (totalLine > 1) {nextLineBtn.setEnabled(true);}}}/*** 换成路线结果回调*/@Overridepublic void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {bdMap.clear();if (transitRouteResult == null|| transitRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(RoutePlanningActivity.this, "抱歉,未找到结果",Toast.LENGTH_SHORT).show();}if (transitRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {// 起终点或途经点地址有岐义,通过以下接口获取建议查询信息// drivingRouteResult.getSuggestAddrInfo()return;}if (transitRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {TransitRouteOverlay transitRouteOverlay = new TransitRouteOverlay(bdMap);transitRouteOverlay.setData(transitRouteResult.getRouteLines().get(drivintResultIndex));// 设置一条驾车路线方案bdMap.setOnMarkerClickListener(transitRouteOverlay);transitRouteOverlay.addToMap();transitRouteOverlay.zoomToSpan();totalLine = transitRouteResult.getRouteLines().size();Toast.makeText(RoutePlanningActivity.this,"共查询出" + totalLine + "条符合条件的线路", 1000).show();if (totalLine > 1) {nextLineBtn.setEnabled(true);}// 通过getTaxiInfo()可以得到很多关于打车的信息Toast.makeText(RoutePlanningActivity.this,"该路线打车总路程"+ transitRouteResult.getTaxiInfo().getDistance(), 1000).show();}}/*** 驾车路线结果回调 查询的结果可能包括多条驾车路线方案*/@Overridepublic void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {bdMap.clear();Log.i("test", "test1");if (drivingRouteResult == null|| drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(RoutePlanningActivity.this, "抱歉,未找到结果",Toast.LENGTH_SHORT).show();}Log.i("test", "test2");if (drivingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {// 起终点或途经点地址有岐义,通过以下接口获取建议查询信息// drivingRouteResult.getSuggestAddrInfo()return;}if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(bdMap);Log.i("test", "test3");drivingRouteOverlay.setData(drivingRouteResult.getRouteLines().get(drivintResultIndex));// 设置一条驾车路线方案bdMap.setOnMarkerClickListener(drivingRouteOverlay);drivingRouteOverlay.addToMap();drivingRouteOverlay.zoomToSpan();totalLine = drivingRouteResult.getRouteLines().size();Toast.makeText(RoutePlanningActivity.this,"共查询出" + totalLine + "条符合条件的线路", 1000).show();if (totalLine > 1) {nextLineBtn.setEnabled(true);}//Log.i("test",drivingRouteResult.getTaxiInfo().getDistance()+"");// 通过getTaxiInfo()可以得到很多关于打车的信息//Toast.makeText(RoutePlanningActivity.this,"该路线打车总路程"+ drivingRouteResult.getTaxiInfo().getDistance(), 1000).show();}}@Overridepublic void onGetBikingRouteResult(BikingRouteResult arg0) {// TODO Auto-generated method stubLog.i("test", "test5");}};/*** 驾车线路查询*/private void drivingSearch(int index) {DrivingRoutePlanOption drivingOption = new DrivingRoutePlanOption();drivingOption.policy(DrivingPolicy.values()[drivingSpinner.getSelectedItemPosition()]);// 设置驾车路线策略drivingOption.from(PlanNode.withCityNameAndPlaceName("北京", startPlace));// 设置起点drivingOption.to(PlanNode.withCityNameAndPlaceName("北京", endPlace));// 设置终点routePlanSearch.drivingSearch(drivingOption);// 发起驾车路线规划}/*** 换乘路线查询*/private void transitSearch(int index) {TransitRoutePlanOption transitOption = new TransitRoutePlanOption();transitOption.city("北京");// 设置换乘路线规划城市,起终点中的城市将会被忽略transitOption.from(PlanNode.withCityNameAndPlaceName("北京", startPlace));transitOption.to(PlanNode.withCityNameAndPlaceName("北京", endPlace));transitOption.policy(TransitPolicy.values()[transitSpinner.getSelectedItemPosition()]);// 设置换乘策略routePlanSearch.transitSearch(transitOption);}/*** 步行路线查询*/private void walkSearch() {WalkingRoutePlanOption walkOption = new WalkingRoutePlanOption();walkOption.from(PlanNode.withCityNameAndPlaceName("北京", startPlace));walkOption.to(PlanNode.withCityNameAndPlaceName("北京", endPlace));routePlanSearch.walkingSearch(walkOption);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.drive_btn:// 驾车index = 0;drivintResultIndex = 0;startPlace = startEt.getText().toString();endPlace = endEt.getText().toString();driveBtn.setEnabled(false);transitBtn.setEnabled(true);walkBtn.setEnabled(true);nextLineBtn.setEnabled(false);drivingSearch(drivintResultIndex);break;case R.id.transit_btn:// 换乘index = 1;transitResultIndex = 0;startPlace = startEt.getText().toString();endPlace = endEt.getText().toString();transitBtn.setEnabled(false);driveBtn.setEnabled(true);walkBtn.setEnabled(true);nextLineBtn.setEnabled(false);transitSearch(transitResultIndex);break;case R.id.walk_btn:// 步行index = 2;startPlace = startEt.getText().toString();endPlace = endEt.getText().toString();walkBtn.setEnabled(false);driveBtn.setEnabled(true);transitBtn.setEnabled(true);nextLineBtn.setEnabled(false);walkSearch();break;case R.id.nextline_btn:// 下一条switch (index) {case 0:drivingSearch(++drivintResultIndex);break;case 1:transitSearch(transitResultIndex);break;case 2:break;}break;}}@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onPause() {super.onPause();mapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();routePlanSearch.destroy();// 释放检索实例mapView.onDestroy();}}

注意

在最新的jar包中,drivingRouteResult.getTaxiInfo().getDistance(),如果没有出租车信息时会报空指针异常

参考链接

百度地图开发(五)之公交信息检索 + 路线规划 - crazy_jack - 博客频道 - CSDN.NET

效果如下

这里写图片描述

whuhan2013/MapAll: 百度地图综合实例代码下载

完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内Api行业,可以内卷到什么程度?

随着移动应用以及智能设备爆发增长&#xff0c;同时越来越多的零售商、媒体、政府和金融服务公司开始公开Web API&#xff0c;API的使用越来越多。 现在&#xff0c;每日API调用量在不断飙升&#xff0c;早在2009年&#xff0c;Facebook每天API调用量就已经达到了50亿。如何能…

自动驾驶关键技术报告:惯性导航和背后的芯片大战

来源&#xff1a;智东西摘要&#xff1a;惯性导航将成为自动驾驶定位信息融合的中心。惯性导航系统由于具有的输出信息不间断、不受外界干扰的独特优势&#xff1b;同时可以将多种传感器的信息以及车身信息进行更深层次的融合&#xff0c;为决策层提供精确可靠的连续的车辆位置…

3D打印产业化机遇与挑战

来源&#xff1a;3D科学谷3D打印的突出特点有两个&#xff1a;免除模具以及制造成本对设计的复杂性不敏感。免除模具的特点使得3D打印适合用于产品原型、试制零件、备品备件、个性化定制、零件修复、医疗植入物、医疗导板、牙科产品、耳机产品等小批量个性化的产品。而传统制造…

Android之ExpandableListView

ExpandableListView可以用来表现多层级的listView&#xff0c;本文主要是ExpandableListView的一个简单实现 布局文件 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"andro…

Api -- 连接世界的Super Star

文章目录&#x1f34f; 一、api 的定义&#xff1a;数据共享模式定义 4 大种类&#x1f356; 二、api 使用场景&#xff1a;互联网时代&#xff0c;api 无处不在2.1 sql 查询2.2 数据传输&#x1f364; 三、开放 api&#xff08;OpenAPI&#xff09;&#xff1a;开放双赢&#…

2018全球最强物联网公司揭晓!

来源&#xff1a;数字化企业根据Gartner预测&#xff0c; 到2020年将有超过200亿台联网设备&#xff0c;市场价值将达3000亿美元之巨。随着垂直应用上的不断细分&#xff0c;以及与AI的加速整合&#xff0c;物联网不仅将持续地变革人们的生活和工作&#xff0c;市场规模也将持续…

Android之解析GML并显示

本例主要实现在APP中解析GML数据并显示 GML,地理标记语言&#xff08;外语全称&#xff1a;Geography MarkupLanguage、外语缩写&#xff1a;GML&#xff09;&#xff0c;它由开放式地理信息系统协会&#xff08;外语缩写&#xff1a;OGC&#xff09;于1999年提出&#xff0c;…

中国电子学会发布《新一代人工智能领域十大最具成长性技术展望(2018-2019年)》...

来源&#xff1a;中国电子学会当前&#xff0c;全球正在经历科技和产业高度耦合、深度迭加的新一轮变革&#xff0c;大数据的形成、理论算法的革新、计算能力的提升及网络设施的演进驱动人工智能进入新一轮创新发展高峰期&#xff0c;新技术持续获得突破性进展&#xff0c;呈现…

晓得不,中间表是这样被消灭的

目录 一、中间表的产生 1、一步算不出来 2、实时计算等待时间过长 3、多样性数据源参加计算 4、中间表难以删除 二、文件计算 三、高性能文件格式 四、易管理性 五、多数据源支持 六、集成性 七、资料 一、中间表的产生 中间表是数据库中专门存放中间计算结果的数据…

美国五大科技巨头的人工智能竞赛

来源&#xff1a;资本实验室毫无疑问&#xff0c;人工智能已经开始渗透到各行各业&#xff0c;并正在改变我们的工作方式和生活方式。2017年&#xff0c;全球与人工智能相关的资金投入总额达到152亿美元&#xff0c;比上一年增加144&#xff05;。而无论在投资&#xff0c;还是…

模拟Struts2实现

本文主要是一个模拟的Struts2的简单实现 真正的MVC架构 实现主要思路 定义一个过滤器&#xff0c;接收传递过去的Action&#xff0c;根据处理的结果重定向或者转发。 首先定义index.jsp <% page language"java" import"java.util.*" pageEncoding&q…

实战教学--怎样提高报表呈现的性能?

报表的性能很重要&#xff0c;是一个总被谈及的问题&#xff0c;跑的慢的报表用户体验恶劣&#xff0c;无法忍受。解决这些慢的性能问题&#xff0c;也成了项目方和工程师头疼的事情。一出状况&#xff0c;就得安排技术好的&#xff0c;能力强的工程师去救火&#xff0c;本来利…

WiFi共享精灵 - 不需路由器一键轻松把网线共享给手机、笔记本等同时无线上网...

现在人们身边手机、游戏机等各种使用WiFi上网的设备已经越来越多&#xff0c;但经常遇到一些地方只有有线网络&#xff0c;或者没有无线路由器的情况&#xff0c;这时&#xff0c;用笔记本上网&#xff0c;然后把网络通过WiFi共享给其他设备上网那么就最合适了。我们之前有介绍…

干货|李开复最新刷屏演讲:人工智能最难取代这13种工作,也最容易威胁人性与爱!...

来源&#xff1a;澎湃新闻这两年&#xff0c;创新工场董事长兼首席执行官李开复&#xff0c;一直为人工智能站台和奔走&#xff0c;还出新书帮助人们规划未来的AI生活。他预言&#xff0c;中国有望在全球范围内首先实现OMO&#xff08;Online-Merge-Offline&#xff0c;线上线下…

Apifox vs Eolink,国内 Api 工具哪家强?

目前行业内有 postman、jmeter 为代表开源 Api 工具派系&#xff0c;我想对大家对这两个词并不陌生。虽然它们能解决基本的接口测试&#xff0c;但是无法解决接口链路上的所有问题&#xff0c;一个工具难以支持整个过程。 在国内&#xff0c;我们可以看到有国产 API 管理工具&…

人工智能、区块链、混合现实:2019年新闻、媒体与技术趋势

来源&#xff1a;资本实验室近日&#xff0c;未来今日研究所&#xff08;Future Today Institute&#xff09;发布了《2019年新闻、媒体与技术趋势报告》&#xff0c;报告提出了涵盖多个领域的108个新兴技术趋势。报告显示&#xff0c;未来的新闻、媒体等行业将受到各种技术错综…

活久见:都 2203 年了,你还在使用 word 调试 API

随着信息技术的发展&#xff0c;API 变得无处不在&#xff0c;无处不用。但令人费解的是&#xff0c;都 2203 年了&#xff0c;竟然还有很多人使用 word 调试 API&#xff1f; 今天&#xff0c;西红柿将带领大家打开新世界的大门&#xff0c;放下诺基亚&#xff0c;抄起智能机&…

Struts2基础知识

本文主要包括以下内容 struts2常用常量的定义与意义struts2处理流程拆分struts动态方法调用,使用通配符接收请求参数中文编码问题自定义类型转化器访问或添加request/session/application常用servlet对象的获取 struts2常用常量的定义与意义 struts2处理流程 每一次请求都会创…

自动驾驶汽车测试在美惹争议,原因为何?

来源&#xff1a;中国汽车报摘要&#xff1a;近日&#xff0c;针对美国总统特朗普提出的&#xff0c;汽车制造商需自愿提交他们在公共道路上测试自动驾驶汽车安全报告一事&#xff0c;回应者寥寥&#xff0c;目前只有三家汽车公司响应了上述要求&#xff0c;提交了相关材料。据…

Struts2基础知识(二)

本文主要包括以下内容 文件上传&#xff0c;多文件上传 自定义拦截器 用户输入验证国际化 文件上传 将头设置为enctype”multipart/form-data” <body><form action"${pageContext.request.contextPath}/upload/upload1.action" method"post" …