Android 高德地图步行导航实现详解:代码示例与类结构
要实现 Android 高德地图的步行导航,你需要创建以下几个类:
- MainActivity: 主活动类,负责初始化地图、处理定位、添加标记点等操作。
- MapUtil: 地图工具类,封装了一些常用的地图操作方法,如获取地图、添加标记点、路线规划等。
- NavigationActivity: 导航活动类,负责实现步行导航功能。
下面是一个简单的实现代码示例:
MainActivity.java:
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import com.amap.api.maps.AMap;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
public class MainActivity extends AppCompatActivity {
private MapView mapView;
private AMap aMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化地图
mapView = findViewById(R.id.map_view);
mapView.onCreate(savedInstanceState);
aMap = mapView.getMap();
// 定位权限申请
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
} else {
// 启动定位
aMap.setMyLocationEnabled(true);
}
// 添加标记点
LatLng latLng = new LatLng(39.906901, 116.397972);
Marker marker = aMap.addMarker(new MarkerOptions().position(latLng).title('Marker').snippet('Default Marker'));
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
}
MapUtil.java:
import android.content.Context;
import android.widget.Toast;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.route.RouteSearch;
public class MapUtil {
private static final int ROUTE_TYPE_WALK = 3;
public static void moveCamera(AMap aMap, double latitude, double longitude, float zoom) {
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), zoom));
}
public static void addMarker(AMap aMap, double latitude, double longitude, String title, String snippet) {
LatLng latLng = new LatLng(latitude, longitude);
Marker marker = aMap.addMarker(new MarkerOptions().position(latLng).title(title).snippet(snippet));
marker.showInfoWindow();
}
public static void searchRoute(Context context, RouteSearch routeSearch, LatLonPoint startPoint, LatLonPoint endPoint) {
RouteSearch.WalkRouteQuery query = new RouteSearch.WalkRouteQuery(new RouteSearch.FromAndTo(startPoint, endPoint));
routeSearch.calculateWalkRouteAsyn(query);
}
public static void showToast(Context context, String message) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
}
NavigationActivity.java:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.amap.api.maps.AMap;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.LatLng;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.route.RouteSearch;
public class NavigationActivity extends AppCompatActivity implements RouteSearch.OnRouteSearchListener {
private MapView mapView;
private AMap aMap;
private RouteSearch routeSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_navigation);
mapView = findViewById(R.id.map_view);
mapView.onCreate(savedInstanceState);
aMap = mapView.getMap();
routeSearch = new RouteSearch(this);
routeSearch.setRouteSearchListener(this);
// 获取起点和终点的经纬度
double startLatitude = getIntent().getDoubleExtra('startLatitude', 0);
double startLongitude = getIntent().getDoubleExtra('startLongitude', 0);
double endLatitude = getIntent().getDoubleExtra('endLatitude', 0);
double endLongitude = getIntent().getDoubleExtra('endLongitude', 0);
// 开始路线规划
MapUtil.searchRoute(this, routeSearch, new LatLonPoint(startLatitude, startLongitude), new LatLonPoint(endLatitude, endLongitude));
}
@Override
public void onWalkRouteSearched(WalkRouteResult result, int errorCode) {
if (errorCode == 1000) {
if (result != null && result.getPaths() != null && result.getPaths().size() > 0) {
WalkPath walkPath = result.getPaths().get(0);
List<LatLng> latLngs = MapUtil.parseWalkPath(walkPath);
Polyline polyline = aMap.addPolyline(new PolylineOptions().addAll(latLngs).width(10).color(Color.BLUE));
} else {
MapUtil.showToast(this, '没有找到路线');
}
} else {
MapUtil.showToast(this, '路线规划失败,错误码:' + errorCode);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
}
这只是一个简单的示例,你可以根据实际需求进行修改和完善。同时,你还需要在 AndroidManifest.xml 文件中添加相关权限和申请高德地图的 Key。
原文地址: https://www.cveoy.top/t/topic/pgpR 著作权归作者所有。请勿转载和采集!