现在的app中经常会用到对地图的调用,包括定位以及导航等,这里我们公司所做的项目里,我同ios部讨论了一段时间,还是选择高德地图吧,高德相对百度而言地图内容更加丰富,接口更加有好一点,精确度更高一定。
高德地图的api配置也不多说了,官方文档很详细,具体到eclipse和AS都有,现在需要的去讲的是如何在自己的代码中去实现API所给的哪些功能,先前在网上也找了很多资料,但基本上都是那么不尽人意,最后还是看了官方的那些文档,才开始去写出来。
这篇文章主要讲的是定位,前提是你已经将高德地图在你的应用中显示出来了,要么2D,要么3D,这里我用的是2D,IDE是androidstudio1.5。
配置还是细致的讲下,可能有些朋友对于第三方接触的太少。
我们首先需要在高德api官方网站上去注册一个账号,注册完了以后,就需要去申请key了,申请的页面如下:
这个里面带红色*就是必填的,信息大获取上面都有教程,Key申请以后就可以在去下载库文件了。网址为:
http://lbs.amap.com/api/android-sdk/down/
将那些SDK都下载下来,配置那个网页上面有详细介绍。
定位需要安装那个定位的SDK,定位的整个代码如下:
package winsky.cn.modeltest.Fragment;
import android.app.Fragment;
import android.app.ProgressDialog;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;
import com.amap.api.maps2d.AMap;
import com.amap.api.maps2d.AMapOptions;
import com.amap.api.maps2d.CameraUpdateFactory;
import com.amap.api.maps2d.LocationSource;
import com.amap.api.maps2d.MapView;
import com.amap.api.maps2d.UiSettings;
import com.amap.api.maps2d.model.BitmapDescriptorFactory;
import com.amap.api.maps2d.model.CameraPosition;
import com.amap.api.maps2d.model.LatLng;
import com.amap.api.maps2d.model.Marker;
import com.amap.api.maps2d.model.MarkerOptions;
import com.amap.api.maps2d.model.MyLocationStyle;
import com.amap.api.maps2d.overlay.BusRouteOverlay;
import com.amap.api.maps2d.overlay.DrivingRouteOverlay;
import com.amap.api.maps2d.overlay.WalkRouteOverlay;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.route.BusPath;
import com.amap.api.services.route.BusRouteResult;
import com.amap.api.services.route.DrivePath;
import com.amap.api.services.route.DriveRouteResult;
import com.amap.api.services.route.RouteSearch;
import com.amap.api.services.route.WalkPath;
import com.amap.api.services.route.WalkRouteResult;
import java.text.SimpleDateFormat;
import java.util.Date;
import winsky.cn.modeltest.MainActivity;
import winsky.cn.modeltest.R;
import winsky.cn.modeltest.control.AMapUtil;
/**
* Created by wj121 on 2015/12/1.
*/
public class LocateFragment extends Fragment implements LocationSource,
AMapLocationListener, AMap.OnMapClickListener, AMap.OnMapLongClickListener, AMap.OnCameraChangeListener, View.OnClickListener, RouteSearch.OnRouteSearchListener, AMap.OnMarkerClickListener, AMap.OnInfoWindowClickListener, AMap.InfoWindowAdapter {
/**
* AMapV2地图中介绍如何使用mapview显示地图
*/
//声明变量
private View view;
private UiSettings mUiSettings; //控制ui
private MapView mapView;
private AMap aMap;
private TextView tx_daohang;
private float currentZoom ;
private CameraUpdateFactory factory;
//声明AMapLocationClient类对象
//声明AMapLocationClient类对象
public AMapLocationClient mLocationClient = null;
//声明定位回调监听器
private OnLocationChangedListener mListener;
public AMapLocationClientOption mLocationOption = null;
//初始化定位参数
private LatLonPoint startPoint = null;
private LatLonPoint endPoint = null;
private int busMode = RouteSearch.BusDefault;// 公交默认模式
private int drivingMode = RouteSearch.DrivingDefault;// 驾车默认模式
private int walkMode = RouteSearch.WalkDefault;// 步行默认模式
private RouteSearch routeSearch;
private int routeType = 3;// 1代表公交模式,2代表驾车模式,3代表步行模式
private ProgressDialog progDialog = null;// 搜索时进度条
private BusRouteResult busRouteResult;// 公交模式查询结果
private DriveRouteResult driveRouteResult;// 驾车模式查询结果
private WalkRouteResult walkRouteResult;// 步行模式查询结果
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.locate_frag, null);
mapView = (MapView) view.findViewById(R.id.map);
mapView.onCreate(savedInstanceState);// 必须要写
init();
return view;
}
private void init() {
if (aMap == null) {
aMap = mapView.getMap();
aMap.moveCamera(CameraUpdateFactory.zoomTo(16));
mUiSettings = aMap.getUiSettings();
findView();
setListener();
setReseach();//设置搜索
setUpMap();
}
}
/**
* 设置点击事件
*/
private void setListener() {
tx_daohang.setOnClickListener(this);
}
/*
初始化所有的控件
*/
private void findView() {
tx_daohang= (TextView) view.findViewById(R.id.tx_daohang);
}
private void setReseach() {
routeSearch = new RouteSearch(getActivity());
routeSearch.setRouteSearchListener(this);
}
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (mListener != null && amapLocation != null) {
if (amapLocation != null
&& amapLocation.getErrorCode() == 0) {
mListener.onLocationChanged(amapLocation);// 显示系统小蓝点
startPoint = AMapUtil.convertToLatLonPoint(new LatLng(amapLocation.getLatitude(),amapLocation.getLongitude()));
} else {
String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
Log.e("AmapErr",errText);
}
}
}
@Override
public void activate(OnLocationChangedListener listener) {
mListener = listener;
if (mLocationClient == null) {
mLocationClient = new AMapLocationClient(getActivity());
mLocationOption = new AMapLocationClientOption();
//设置定位监听
mLocationClient.setLocationListener(this);
//设置为高精度定位模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位参数
mLocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
mLocationClient.startLocation();
}
}
@Override
public void deactivate() {
mListener = null;
if (mLocationClient != null) {
mLocationClient.stopLocation();
mLocationClient.onDestroy();
}
mLocationClient = null;
}
@Override
public void onResume() {
super.onResume();
mapView.onResume();
}
@Override
public void onPause() {
super.onPause();
mapView.onPause();
deactivate();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
@Override
public void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
private void setUpMap() {
// 自定义系统定位小蓝点
currentZoom = aMap.getCameraPosition().zoom; //当前大缩放度
MyLocationStyle myLocationStyle = new MyLocationStyle();
mUiSettings.setCompassEnabled(true);//指南针
// mUiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_RIGHT);
// 设置地图logo显示在右下方
aMap.setOnMapClickListener(this);// 对amap添加单击地图事件监听器
aMap.setOnMapLongClickListener(this);// 对amap添加长按地图事件监听器
aMap.setOnCameraChangeListener(this);// 对amap添加移动地图事件监听器
mUiSettings.setScaleControlsEnabled(true);//比例尺
myLocationStyle.myLocationIcon(BitmapDescriptorFactory
.fromResource(R.drawable.location_marker));// 设置小蓝点的图标
myLocationStyle.strokeColor(Color.BLACK);// 设置圆形的边框颜色
myLocationStyle.radiusFillColor(Color.argb(100, 0, 0, 180));// 设置圆形的填充颜色
// myLocationStyle.anchor(int,int)//设置小蓝点的锚点
myLocationStyle.strokeWidth(1.0f);// 设置圆形的边框粗细
aMap.setMyLocationStyle(myLocationStyle);
aMap.setLocationSource(this);// 设置定位监听
mUiSettings.setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
// aMap.setMyLocationType()
}
@Override
public void onMapClick(LatLng latLng) {
// Toast.makeText(getActivity(),String.valueOf(latLng),Toast.LENGTH_LONG).show();
}
@Override
public void onMapLongClick(LatLng latLng) {
MarkerOptions markerOptions=new MarkerOptions();
markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.map_blue));
markerOptions.title("目的地");
markerOptions.position(latLng);
markerOptions.visible(true);
markerOptions.draggable(false);
endPoint = AMapUtil.convertToLatLonPoint(markerOptions.getPosition());
aMap.addMarker(markerOptions);
}
@Override
public void onCameraChange(CameraPosition cameraPosition) {
}
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
}
@Override
public void onClick(View v) {
if (endPoint != null) {
searchRouteResult(startPoint, endPoint);
}
}
/**
* 显示进度框
*/
private void showProgressDialog() {
if (progDialog == null)
progDialog = new ProgressDialog(getActivity());
progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progDialog.setIndeterminate(false);
progDialog.setCancelable(true);
progDialog.setMessage("正在搜索");
progDialog.show();
}
/**
* 隐藏进度框
*/
private void dissmissProgressDialog() {
if (progDialog != null) {
progDialog.dismiss();
}
}
/**
* 开始搜索路径规划方案
*/
public void searchRouteResult(LatLonPoint startPoint, LatLonPoint endPoint) {
showProgressDialog();
final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(
startPoint, endPoint);
if (routeType == 1) {// 公交路径规划
RouteSearch.BusRouteQuery query = new RouteSearch.BusRouteQuery(fromAndTo, busMode, "北京", 0);// 第一个参数表示路径规划的起点和终点,第二个参数表示公交查询模式,第三个参数表示公交查询城市区号,第四个参数表示是否计算夜班车,0表示不计算
routeSearch.calculateBusRouteAsyn(query);// 异步路径规划公交模式查询
} else if (routeType == 2) {// 驾车路径规划
RouteSearch.DriveRouteQuery query = new RouteSearch.DriveRouteQuery(fromAndTo, drivingMode,
null, null, "");// 第一个参数表示路径规划的起点和终点,第二个参数表示驾车模式,第三个参数表示途经点,第四个参数表示避让区域,第五个参数表示避让道路
routeSearch.calculateDriveRouteAsyn(query);// 异步路径规划驾车模式查询
} else if (routeType == 3) {// 步行路径规划
RouteSearch.WalkRouteQuery query = new RouteSearch.WalkRouteQuery(fromAndTo, walkMode);
routeSearch.calculateWalkRouteAsyn(query);// 异步路径规划步行模式查询
}
}
/**
* 公交路线查询回调
*/
@Override
public void onBusRouteSearched(BusRouteResult result, int rCode) {
dissmissProgressDialog();
if (rCode == 0) {
if (result != null && result.getPaths() != null
&& result.getPaths().size() > 0) {
busRouteResult = result;
BusPath busPath = busRouteResult.getPaths().get(0);
aMap.clear();// 清理地图上的所有覆盖物
BusRouteOverlay routeOverlay = new BusRouteOverlay(getActivity(), aMap,
busPath,
busRouteResult.getStartPos(),
busRouteResult.getTargetPos()
);
routeOverlay.removeFromMap();
routeOverlay.addToMap();
routeOverlay.zoomToSpan();
}
}
}
/**
* 驾车结果回调
*/
@Override
public void onDriveRouteSearched(DriveRouteResult result, int rCode) {
dissmissProgressDialog();
if (rCode == 0) {
if (result != null && result.getPaths() != null
&& result.getPaths().size() > 0) {
driveRouteResult = result;
DrivePath drivePath = driveRouteResult.getPaths().get(0);
aMap.clear();// 清理地图上的所有覆盖物
DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(
getActivity(), aMap, drivePath, driveRouteResult.getStartPos(),
driveRouteResult.getTargetPos());
drivingRouteOverlay.removeFromMap();
drivingRouteOverlay.addToMap();
drivingRouteOverlay.zoomToSpan();
}
}
}
/**
* 步行路线结果回调
*/
@Override
public void onWalkRouteSearched(WalkRouteResult result, int rCode) {
dissmissProgressDialog();
if (rCode == 0) {
if (result != null && result.getPaths() != null
&& result.getPaths().size() > 0) {
walkRouteResult = result;
WalkPath walkPath = walkRouteResult.getPaths().get(0);
aMap.clear();// 清理地图上的所有覆盖物
WalkRouteOverlay walkRouteOverlay = new WalkRouteOverlay(getActivity(),
aMap, walkPath, walkRouteResult.getStartPos(),
walkRouteResult.getTargetPos());
walkRouteOverlay.removeFromMap();
walkRouteOverlay.addToMap();
walkRouteOverlay.zoomToSpan();
}
}
}
/**
* 注册监听
*/
private void registerListener() {
aMap.setOnMapClickListener(this);
aMap.setOnMarkerClickListener(this);
aMap.setOnInfoWindowClickListener(this);
aMap.setInfoWindowAdapter(this);
}
@Override
public boolean onMarkerClick(Marker marker) {
return false;
}
@Override
public void onInfoWindowClick(Marker marker) {
}
@Override
public View getInfoWindow(Marker marker) {
return null;
}
@Override
public View getInfoContents(Marker marker) {
return null;
}
}
这是一个fragment,和activity差不多,之里面包括一个定位和一个路线规划,应该看的懂吧