바 이 두 지 도 는 소형 차 가 노선 을 계획 한 후 부 드 럽 게 이동 하 는 기능 을 실현 한다.
프로젝트 개발 에 필요 하기 때문에 바 이 두 지도 가 제공 하 는 소형 차 의 부 드 러 운 궤적 이동 과 결합 하여 자신 이 쓴 demo
실현 효과
코드 다운로드
링크 다운로드
다음은 실현 의 관건 적 인 절차 이다.
통합 바 이 두 지도
자연 을 어떻게 통합 하 는 지 는 바 이 두 지도 개발 플랫폼 에서 제공 하 는 문 서 를 보 는 것 이다.
문서 연결
계획 회선
바 이 두 지도 문 서 를 보고 노선 을 계획 하 는 도구 류(운전 하 는)를 작성 합 니 다.
package com.wzhx.car_smooth_move_demo.utils;
import android.util.Log;
import com.baidu.mapapi.search.route.BikingRouteResult;
import com.baidu.mapapi.search.route.DrivingRoutePlanOption;
import com.baidu.mapapi.search.route.DrivingRouteResult;
import com.baidu.mapapi.search.route.IndoorRouteResult;
import com.baidu.mapapi.search.route.MassTransitRouteResult;
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.TransitRouteResult;
import com.baidu.mapapi.search.route.WalkingRouteResult;
import com.wzhx.car_smooth_move_demo.listener.OnGetDrivingResultListener;
public class RoutePlanUtil {
private RoutePlanSearch mRoutePlanSearch = RoutePlanSearch.newInstance();
private OnGetDrivingResultListener getDrivingResultListener;
private OnGetRoutePlanResultListener getRoutePlanResultListener = new OnGetRoutePlanResultListener() {
@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
}
@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
}
@Override
public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {
}
@Override
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
Log.e(" ", drivingRouteResult.error + ":" + drivingRouteResult.status);
getDrivingResultListener.onSuccess(drivingRouteResult);
}
@Override
public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {
}
@Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
}
};
public RoutePlanUtil(OnGetDrivingResultListener getDrivingResultListener) {
this.getDrivingResultListener = getDrivingResultListener;
this.mRoutePlanSearch.setOnGetRoutePlanResultListener(this.getRoutePlanResultListener);
}
public void routePlan(PlanNode startNode, PlanNode endNode){
mRoutePlanSearch.drivingSearch((new DrivingRoutePlanOption())
.from(startNode).to(endNode)
.policy(DrivingRoutePlanOption.DrivingPolicy.ECAR_TIME_FIRST)
.trafficPolicy(DrivingRoutePlanOption.DrivingTrafficPolicy.ROUTE_PATH_AND_TRAFFIC));
}
}
선 로 를 계획 한 후 실시 간 도로 상황 색인 을 저장 하고 뒤에 그림 을 그 려 야 합 니 다.
//
List<DrivingRouteLine.DrivingStep> allStep = selectedRouteLine.getAllStep();
mTrafficTextureIndexList.clear();
for (int j = 0; j < allStep.size(); j++) {
if (allStep.get(j).getTrafficList() != null && allStep.get(j).getTrafficList().length > 0) {
for (int k = 0; k < allStep.get(j).getTrafficList().length; k++) {
mTrafficTextureIndexList.add(allStep.get(j).getTrafficList()[k]);
}
}
}
노선 이 계 획 된 노선 의 구간 을 다시 세분(절단)해 야 소형 차 가 이동 할 수 있다.
/**
*
* demo 。( )
* @param routeLine
* @param distance
* @return
*/
private ArrayList<LatLng> divideRouteLine(ArrayList<LatLng> routeLine, double distance) {
//
ArrayList<LatLng> result = new ArrayList<>();
mNewTrafficTextureIndexList.clear();
for (int i = 0; i < routeLine.size() - 1; i++) {
final LatLng startPoint = routeLine.get(i);
final LatLng endPoint = routeLine.get(i + 1);
double slope = getSlope(startPoint, endPoint);
//
boolean isYReverse = (startPoint.latitude > endPoint.latitude);
boolean isXReverse = (startPoint.longitude > endPoint.longitude);
double intercept = getInterception(slope, startPoint);
double xMoveDistance = isXReverse ? getXMoveDistance(slope, distance) :
-1 * getXMoveDistance(slope, distance);
double yMoveDistance = isYReverse ? getYMoveDistance(slope, distance) :
-1 * getYMoveDistance(slope, distance);
ArrayList<LatLng> temp1 = new ArrayList<>();
for (double j = startPoint.latitude, k = startPoint.longitude;
!((j > endPoint.latitude) ^ isYReverse) && !((k > endPoint.longitude) ^ isXReverse); ) {
LatLng latLng = null;
if (slope == Double.MAX_VALUE) {
latLng = new LatLng(j, k);
j = j - yMoveDistance;
} else if (slope == 0.0) {
latLng = new LatLng(j, k - xMoveDistance);
k = k - xMoveDistance;
} else {
latLng = new LatLng(j, (j - intercept) / slope);
j = j - yMoveDistance;
}
final LatLng finalLatLng = latLng;
if (finalLatLng.latitude == 0 && finalLatLng.longitude == 0) {
continue;
}
mNewTrafficTextureIndexList.add(mTrafficTextureIndexList.get(i));
temp1.add(finalLatLng);
}
result.addAll(temp1);
if (i == routeLine.size() - 2) {
result.add(endPoint); //
}
}
return result;
}
마지막 으로 서브 스 레 드 를 켜 서 소형 차 상 태 를 업데이트 합 니 다(헤드 방향 과 소형 차 위치).
/**
*
*/
public void moveLooper() {
moveThread = new Thread() {
public void run() {
Thread thisThread = Thread.currentThread();
while (!exit) {
for (int i = 0; i < latLngs.size() - 1; ) {
if (exit) {
break;
}
for (int p = 0; p < latLngs.size() - 1; p++) {
// , true
// : 5 DistanceUtil.getDistance(mCurrentLatLng, latLngs.get(p)) <= 5)
// mCurrentLatLng
if (true) {
// mIndex = p;
mIndex++; // 1
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(mContext, " :" + mIndex, Toast.LENGTH_SHORT).show();
}
});
break;
}
}
//
i = mIndex + 1;
if (mIndex >= latLngs.size() - 1) {
exit = true;
break;
}
//
int len = mNewTrafficTextureIndexList.subList(mIndex, mNewTrafficTextureIndexList.size()).size();
Integer[] integers = mNewTrafficTextureIndexList.subList(mIndex, mNewTrafficTextureIndexList.size()).toArray(new Integer[len]);
int[] index = new int[integers.length];
for (int x = 0; x < integers.length; x++) {
index[x] = integers[x];
}
if (index.length > 0) {
mPolyline.setIndexs(index);
mPolyline.setPoints(latLngs.subList(mIndex, latLngs.size()));
}
// ,
final LatLng startPoint = latLngs.get(mIndex);
final LatLng endPoint = latLngs.get(mIndex + 1);
mHandler.post(new Runnable() {
@Override
public void run() {
//
if (mMapView == null) {
return;
}
mMoveMarker.setPosition(startPoint);
mMoveMarker.setRotate((float) getAngle(startPoint,
endPoint));
}
});
try {
//
thisThread.sleep(TIME_INTERVAL);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
};
//
moveThread.start();
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
nginx 버 전의 부 드 러 운 업그레이드며칠 전에 제 동료 가 저녁 에 당직 을 서고 일이 없 을 때 회사 고객 의 nginx 서버 를 업 그 레이 드 했 습 니 다. 이런 조작 을 저 는 해 본 적 이 없고 궁금 합 니 다. 오늘 은 한가 할 때 인터넷...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.