This commit is contained in:
zhongchao
2022-11-10 16:54:26 +08:00
parent 5322d03ec1
commit 2156d2cd18
148 changed files with 147 additions and 19811 deletions

View File

@@ -1,11 +0,0 @@
# 基础框架
## 基于 WindowManger.addView 方式实现的弹窗
## 大而全数据定义
## 地图中心点控制策略
## 自研车机类型判断
## 模块加载类

View File

@@ -51,10 +51,6 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation rootProject.ext.dependencies.kotlinstdlibjdk7
implementation rootProject.ext.dependencies.androidxccorektx
implementation rootProject.ext.dependencies.androidxappcompat
implementation rootProject.ext.dependencies.androidxrecyclerview
implementation rootProject.ext.dependencies.androidxconstraintlayout
implementation rootProject.ext.dependencies.arouter
kapt rootProject.ext.dependencies.aroutercompiler
@@ -89,4 +85,3 @@ dependencies {
}
apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()

View File

@@ -1,10 +1 @@
#-----CommonModule-----
-keep class com.mogo.module.common.machinevision.*{*;}
-keep class com.mogo.module.common.constants.*{*;}
-keep class com.mogo.module.common.drawer.marker.*{*;}
-keep class com.mogo.module.common.entity.*{*;}
-keep class com.mogo.module.common.view.*{*;}
-keep class com.mogo.module.common.widget.*{*;}
-keep class com.mogo.module.common.wm.* {*;}
-keep class com.mogo.module.common.MogoModulePaths{*;}
-keep class com.mogo.hook.*{*;}

View File

@@ -21,6 +21,3 @@
#-renamesourcefileattribute SourceFile
#-----CommonModule-----
-keep class com.mogo.module.common.entity.** {*;}
-keep class com.mogo.module.common.wm.** {*;}
-keep class com.mogo.module.common.MogoModulePaths

View File

@@ -1,19 +0,0 @@
package com.mogo.module.common;
/**
* @author congtaowang
* @since 2020-03-13
* <p>
* 各个卡片模块类型
*/
public class ModuleNames {
/**
* 卡片 探路数据
*/
public static final String CARD_TYPE_ROAD_CONDITION = "CARD_TYPE_ROAD_CONDITION";
/**
* 卡片 用户数据
*/
public static final String CARD_TYPE_USER_DATA = "CARD_TYPE_USER_DATA";
}

View File

@@ -1,63 +0,0 @@
package com.mogo.module.common;
/**
* @author congtaowang
* @since 2019-12-31
* <p>
* 模块描述信息
*/
public class MogoModule {
/**
* 模块加载路径
*/
private String mPath;
/**
* 模块名称
*/
private String mName;
/**
* 广播接收者
*/
private String mBroadcastAction;
/**
* @param path 模块加载路径
* @param name 模块名称
*/
public MogoModule( String path, String name ) {
this.mPath = path;
this.mName = name;
}
public String getPath() {
return mPath;
}
public MogoModule setPath( String path ) {
this.mPath = path;
return this;
}
public String getName() {
return mName;
}
public MogoModule setName( String name ) {
this.mName = name;
return this;
}
public String getBroadcastAction() {
return mBroadcastAction;
}
public MogoModule setBroadcastAction( String broadcastAction ) {
this.mBroadcastAction = broadcastAction;
return this;
}
}

View File

@@ -1,88 +0,0 @@
package com.mogo.module.common;
import android.text.TextUtils;
import java.util.ArrayList;
import java.util.List;
/**
* @author congtaowang
* @since 2019-12-23
* <p>
* 模块路由路径
*/
public class MogoModulePaths {
private static final List<MogoModule> mMogoModules = new ArrayList<>();
// 不需要启动APP也能运行的模块
private static final List<MogoModule> mMogoBaseModules = new ArrayList<>();
private static final List<MogoModule> mModuleFunctions = new ArrayList<>();
private static final List<MogoModule> mModuleFunctionServers = new ArrayList<>();
/**
* 添加卡片模块
*
* @param module
*/
public static void addModule(MogoModule module) {
if (module == null || TextUtils.isEmpty(module.getPath().replace(" ", ""))) {
throw new IllegalArgumentException("module path can't be empty or null or blank");
}
mMogoModules.add(module);
}
/**
* 添加模块功能
*
* @param module 功能模块
*/
public static void addModuleFunction(MogoModule module) {
if (module == null || TextUtils.isEmpty(module.getPath().replace(" ", ""))) {
throw new IllegalArgumentException("module path can't be empty or null or blank");
}
mModuleFunctions.add(module);
}
/**
* 添加 功能服务, 不带UI Fragment的
*
* @param module 功能模块
*/
public static void addModuleFunctionServer(MogoModule module) {
if (module == null || TextUtils.isEmpty(module.getPath().replace(" ", ""))) {
throw new IllegalArgumentException("module path can't be empty or null or blank");
}
mModuleFunctionServers.add(module);
}
/**
* 添加基础模块
*
* @param module
*/
public static void addBaseModule(MogoModule module) {
if (module == null || TextUtils.isEmpty(module.getPath().replace(" ", ""))) {
throw new IllegalArgumentException("module path can't be empty or null or blank");
}
mMogoBaseModules.add(module);
}
public static List<MogoModule> getModules() {
return mMogoModules;
}
public static List<MogoModule> getBaseModules() {
return mMogoBaseModules;
}
public static List<MogoModule> getModuleFunctions() {
return mModuleFunctions;
}
public static List<MogoModule> getModuleFunctionServers() {
return mModuleFunctionServers;
}
}

View File

@@ -1,30 +0,0 @@
package com.mogo.module.common.entity;
import com.mogo.eagle.core.data.BaseData;
import java.util.List;
@SuppressWarnings("unused")
public class MarkerCardResult extends BaseData {
private List<String> dataType; // 要查询的类型
private long messageTime;
public List<String> getDataType() {
return dataType;
}
public void setDataType(List<String> dataType) {
this.dataType = dataType;
}
public long getMessageTime() {
return messageTime;
}
public void setMessageTime(long messageTime) {
this.messageTime = messageTime;
}
}

View File

@@ -1,54 +0,0 @@
package com.mogo.module.common.entity;
import com.mogo.eagle.core.data.BaseData;
import java.io.Serializable;
@SuppressWarnings("unused")
public class MarkerResponse extends BaseData implements Serializable {
// private int code;
// private String msg;
private MarkerCardResult result;
private String sign;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public MarkerCardResult getResult() {
return result;
}
public void setResult(MarkerCardResult result) {
this.result = result;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
@Override
public String toString() {
return "MarkerResponse{" + "result=" + result + ", sign='" + sign + '\'' + ", code=" + code + ", msg='" + msg + '\'' + '}';
}
}

View File

@@ -1,125 +0,0 @@
package com.mogo.module.common.utils;
import android.text.TextUtils;
import com.mogo.commons.debug.DebugConfig;
import java.lang.reflect.Method;
/**
* @author congtaowang
* @since 2020-03-26
* <p>
* 车机类型
*/
public class CarSeries {
private static boolean invokeFlag = false;
private static boolean isF8xxSeries = false;
public static boolean isF8xxSeries() {
if ( invokeFlag ) {
return isF8xxSeries;
}
isF8xxSeries = DebugConfig.getProductFlavor().startsWith( "f" );
invokeFlag = true;
return isF8xxSeries;
}
@Deprecated
public static final int CAR_SERIES_C80X = 10;
@Deprecated
public static final int CAR_SERIES_D80X = 20;
@Deprecated
public static final int CAR_SERIES_D81X = 21;
@Deprecated
public static final int CAR_SERIES_D82X = 22;
@Deprecated
public static final int CAR_SERIES_D84X = 23;
@Deprecated
public static final int CAR_SERIES_F80X = 30;
@Deprecated
public static final int CAR_SERIES_G80X = 40;
@Deprecated
public static final int CAR_SERIES_E84X = 50;
@Deprecated
public static final int CAR_SERIES_E84XCD = 51;
@Deprecated
public static final int CAR_SERIES_E85X = 50;
@Deprecated
public static final int CAR_SERIES_E85XCD = 51;
@Deprecated
public static final int CAR_SERIES_E85XJD = 51;
@Deprecated
public static int CAR_SERIES = 0;
/**
* Deprecated.
* Use {@link DebugConfig#getProductFlavor()} instead.
*
* @return
*/
@Deprecated
public static int getSeries() {
if ( CAR_SERIES != 0 ) {
return CAR_SERIES;
}
synchronized ( CarSeries.class ) {
if ( CAR_SERIES != 0 ) {
return CAR_SERIES;
}
String device = get( "ro.fota.device" );
if ( TextUtils.isEmpty( device ) ) {
return CAR_SERIES_F80X;
}
if ( "FG166".equals( device ) ) {
CAR_SERIES = CAR_SERIES_C80X;
} else if ( "D801-802".equals( device ) ) {
CAR_SERIES = CAR_SERIES_D80X;
} else if ( "D801B-802B".equals( device ) ) {
// 2+16G
CAR_SERIES = CAR_SERIES_D80X;
} else if ( "D811-812".equals( device ) ) {
CAR_SERIES = CAR_SERIES_D81X;
} else if ( "D821-822".equals( device ) ) {
CAR_SERIES = CAR_SERIES_D82X;
} else if ( "D841-842".equals( device ) ) {
CAR_SERIES = CAR_SERIES_D84X;
} else if ( "G801-802".equals( device ) ) {
CAR_SERIES = CAR_SERIES_G80X;
} else if ( "F801-802".equals( device ) ) {
CAR_SERIES = CAR_SERIES_F80X;
} else if ( "E841-842".equals( device ) ) {
CAR_SERIES = CAR_SERIES_E84X;
} else if ( "E84XCD".equals( device ) ) {
CAR_SERIES = CAR_SERIES_E84XCD;
} else if ( "E851-852".equals( device ) ) {
CAR_SERIES = CAR_SERIES_E85X;
} else if ( "E85XCD".equals( device ) ) {
CAR_SERIES = CAR_SERIES_E85XCD;
} else if ( "E85XJD".equals( device ) ) {
CAR_SERIES = CAR_SERIES_E85XJD;
} else if ( device.startsWith( "E85" ) ) {
CAR_SERIES = CAR_SERIES_E85XJD;
} else {
CAR_SERIES = CAR_SERIES_F80X;
}
return CAR_SERIES;
}
}
@Deprecated
private static String get( String key ) {
String value = "";
try {
Class< ? > c = Class.forName( "android.os.SystemProperties" );
Method get = c.getMethod( "get", new Class[]{String.class, String.class} );
value = ( String ) get.invoke( c, new Object[]{key, "unknown"} );
} catch ( Exception e ) {
value = "";
}
return value;
}
}

View File

@@ -1,156 +0,0 @@
package com.mogo.module.common.utils;
import static java.lang.Math.PI;
import android.util.Pair;
/**
* author : donghongyu
* e-mail : 1358506549@qq.com
* date : 2020/4/14 1:02 PM
* desc : 计算车辆驾驶方向的工具类
* version: 1.0
*/
public class DrivingDirectionUtils {
public static long getDegreeOfCar2Poi2(double x1, double y1, double x2, double y2, double x1_angle) {
Pair<Double, Double> newPoint = calculateNewPoint(x1, y1, x1_angle, 10);
if (newPoint != null) {
double angle = getAngle(x1, y1, newPoint.first, newPoint.second, x2, y2);
return Math.round(angle + 0.5);
}
return 0;
}
public static double distance(double x1, double y1, double x2, double y2) {
return Math.sqrt(Math.pow(x1 - x2, 2.0) + Math.pow(y1 - y2, 2.0));
}
public static double getAngle(double sx, double sy, double x1, double y1, double x2, double y2) {
x1 = x1 - sx;
y1 = y1 - sy;
x2 = x2 - sx;
y2 = y2 - sy;
double product = x1 * x2 + y1 * y2;
double radians = Math.acos(product / (Math.sqrt(Math.pow(x1, 2.0) + Math.pow(y1, 2.0)) * Math.sqrt(Math.pow(x2, 2.0) + Math.pow(y2, 2.0))));
return Math.toDegrees(radians);
}
public static Pair<Double, Double> calculateNewPoint(double x, double y, double angle, double distance) {
if (distance == 0) {
return null;
}
double radian = Math.toRadians(angle);
double radianCandle = Math.toRadians(90.0 - angle);
double nX = x + distance * Math.sin(radian) / 100000.0;
double nY = y + distance * Math.sin(radianCandle) / 100000.0;
return Pair.create(nX, nY);
}
/**
* 计算车辆行驶方向 与 poi点到车辆的连线 间的夹角
*
* @param carLon 车辆位置 lon
* @param carLat 车辆位置 lat
* @param poiLon poi 位置 lon
* @param poiLat poi 位置 lat
* @param carAngle 车辆行驶方向
* @return
*/
public static int getDegreeOfCar2Poi(double carLon, double carLat, double poiLon, double poiLat, int carAngle) {
int poiAngle = 0;
// 以子午线作为y轴 计算两点的余切 再将余切值转化为角度
double _angle = Math.atan2(Math.abs(carLon - poiLon), Math.abs(carLat - poiLat)) * (180 / PI);
if (poiLon > carLon) {
// poi 在 车辆位置的第1象限
if (poiLat > carLat) {
poiAngle = (int) _angle;
}
// poi 在 车辆位置的第2象限
else {
poiAngle = 180 - (int) _angle;
}
} else {
// poi 在 车辆位置的第3象限
if (poiLat < carLat) {
poiAngle = (int) _angle + 180;
}
// poi 在 车辆位置的第4象限
else {
poiAngle = 360 - (int) _angle;
}
}
return calculationAngle(poiAngle, carAngle);
}
/**
* 计算两个行驶方向间的夹角 计算结果小于180度
*
* @param angle0
* @param angle1
* @return
*/
public static int calculationAngle(int angle0, int angle1) {
// 获取两方向间夹角
int angle = Math.abs(angle0 - angle1);
if (angle > 180) {
int minAngle = Math.min(angle0, angle1);
int maxAngle = Math.max(angle0, angle1);
return 180 - Math.abs(minAngle + 180 - maxAngle);
} else {
return angle;
}
}
/**
* 计算车辆行驶方向角度,起点&终点经纬度
*
* @param carLat 车辆位置 lat
* @param carLon 车辆位置 lon
* @param poiLat poi 位置 lat
* @param poiLon poi 位置 lon
*/
public static int getCarAngle(double carLat, double carLon, double poiLat, double poiLon) {
int poiAngle = 0;
// 以子午线作为y轴 计算两点的余切 再将余切值转化为角度
double _angle = Math.atan2(Math.abs(carLon - poiLon), Math.abs(carLat - poiLat)) * (180 / PI);
if (poiLon > carLon) {
// poi 在 车辆位置的第1象限
if (poiLat > carLat) {
poiAngle = (int) _angle;
}
// poi 在 车辆位置的第2象限
else {
poiAngle = 180 - (int) _angle;
}
} else {
// poi 在 车辆位置的第3象限
if (poiLat < carLat) {
poiAngle = (int) _angle + 180;
}
// poi 在 车辆位置的第4象限
else {
poiAngle = 360 - (int) _angle;
}
}
if (poiAngle >= 355) {
poiAngle = 0;
}
return poiAngle;
}
/**
* 计算连两个角度差值
*
* @param angle1 角度1
* @param angle2 角度2
* @return 差值
*/
public static double getAngleDiff(double angle1, double angle2) {
// 两个角度差值较小
return 180 - Math.abs(Math.abs(angle1 - angle2) - 180);
}
}

View File

@@ -1,53 +0,0 @@
package com.mogo.module.common.utils;
import com.mogo.eagle.core.data.map.MogoLatLng;
/**
* @author liujing
* @description 描述
* @since: 2021/4/13
*/
public class Trigonometric {
private final static double radius_b = 6378137;//大半径
private final static double radius_s = 6356725;//小半径
private static double mRadLo;
private static double mRadLa;
private static double Ec;
private static double Ed;
/**
* 计算两点间的角度
*/
public static double getAngle(double lon1, double lat1, double lon2,
double lat2) {
double fLat = Math.PI * (lat1) / 180.0;
double fLng = Math.PI * (lon1) / 180.0;
double tLat = Math.PI * (lat2) / 180.0;
double tLng = Math.PI * (lon2) / 180.0;
double degree = (Math.atan2(Math.sin(tLng - fLng) * Math.cos(tLat), Math.cos(fLat) * Math.sin(tLat) -
Math.sin(fLat) * Math.cos(tLat) * Math.cos(tLng - fLng))) * 180.0 / Math.PI;
if (degree >= 0) {
return degree;
} else {
return 360 + degree;
}
}
/**
* 根据角度获取指定距离点的经纬度
*/
public static MogoLatLng getNewLocation(double lon, double lat, double distance, double angle) {
mRadLo = lon * Math.PI / 180.;
mRadLa = lat * Math.PI / 180.;
Ec = radius_s + (radius_b - radius_s) * (90. - lat) / 90;
Ed = Ec * Math.cos(mRadLa);
double dx = distance * Math.sin(Math.toRadians(angle));
double dy = distance * Math.cos(Math.toRadians(angle));
double lon_new = (dx / Ed + mRadLo) * 180. / Math.PI;
double lat_new = (dy / Ec + mRadLa) * 180. / Math.PI;
return new MogoLatLng(lat_new, lon_new);
}
}

View File

@@ -1,310 +0,0 @@
package com.mogo.module.common.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.mogo.module.common.R;
import java.math.BigDecimal;
public class CustomRatingBar extends LinearLayout {
private Context mContext;
/*
是否可点击
* */
private boolean mClickable;
/*
* 单元总数(心形/星星)
* */
private int elementCount;
/*
* 单元点击事件
* */
private OnRatingChangeListener mOnRatingBarChangeListener;
/*
* 每个单元的大小
* */
private float elementWidth;
private float elementHeight;
public float getElementWidth() {
return elementWidth;
}
public void setElementWidth(float elementWidth) {
this.elementWidth = elementWidth;
}
public float getElementHeight() {
return elementHeight;
}
public void setElementHeight(float elementHeight) {
this.elementHeight = elementHeight;
}
/*
* 每个单元间的距离
* */
private float elementPadding;
/*
*单元的显示数量,支持小数点
* */
private float elementStep;
/*
* 空白的默认单元图片
* */
private Drawable elementEmptyDrawable;
/*
* 选中后的单元图片
* */
private Drawable elementFillDrawable;
/*
* 半颗单元图片
* */
private Drawable elementHarfDrawable;
/*
* 每次点击单元所增加的量是半个还是整个
* */
private StepSize stepSize;
/*
*添加资源(空白心是白色还是灰色自定义属性)
* */
private boolean otherHeartImg;
@Override
public boolean isClickable() {
return mClickable;
}
@Override
public void setClickable(boolean clickable) {
mClickable = clickable;
}
public int getElementCount() {
return elementCount;
}
public void setElementCount(int elementCount) {
this.elementCount = elementCount;
}
public OnRatingChangeListener getOnRatingBarChangeListener() {
return mOnRatingBarChangeListener;
}
public void setOnRatingChangeListener(OnRatingChangeListener onRatingBarChangeListener) {
mOnRatingBarChangeListener = onRatingBarChangeListener;
}
public float getElementPadding() {
return elementPadding;
}
public void setElementPadding(float elementPadding) {
this.elementPadding = elementPadding;
}
public float getElementStep() {
return elementStep;
}
public void setElementStep(float elementStep) {
this.elementStep = elementStep;
}
public Drawable getElementEmptyDrawable() {
return elementEmptyDrawable;
}
public void setElementEmptyDrawable(Drawable elementEmptyDrawable) {
this.elementEmptyDrawable = elementEmptyDrawable;
}
public Drawable getElementFillDrawable() {
return elementFillDrawable;
}
public void setElementFillDrawable(Drawable elementFillDrawable) {
this.elementFillDrawable = elementFillDrawable;
}
public Drawable getElementHarfDrawable() {
return elementHarfDrawable;
}
public void setElementHarfDrawable(Drawable elementHarfDrawable) {
this.elementHarfDrawable = elementHarfDrawable;
}
public void setStepSize(StepSize stepSize) {
this.stepSize = stepSize;
}
public CustomRatingBar(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mContext = context;
setOrientation(LinearLayout.HORIZONTAL);
TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomRatingBar);
elementWidth = mTypedArray.getDimension(R.styleable.CustomRatingBar_elenmentWidth,
context.getResources().getDimension(R.dimen.heart_ratingbar_width));
elementHeight = mTypedArray.getDimension(R.styleable.CustomRatingBar_elenmentHeight,
context.getResources().getDimension(R.dimen.heart_ratingbar_height));
elementPadding = mTypedArray.getDimension(R.styleable.CustomRatingBar_elenmentPadding,
context.getResources().getDimension(R.dimen.ratingbar_padding));
/*
* 白天模式下 热心指数(白色)和个人中心(灰色)使用不同的资源
* 默认灰色
* */
otherHeartImg = mTypedArray.getBoolean(R.styleable.CustomRatingBar_OtherHeartImg, true);
elementStep = mTypedArray.getFloat(R.styleable.CustomRatingBar_elenmentStep, 1.0f);
stepSize = StepSize.fromStep(mTypedArray.getInt(R.styleable.CustomRatingBar_stepSize, 1));
elementCount = mTypedArray.getInteger(R.styleable.CustomRatingBar_elenmentCount, 5);
stepSize = StepSize.Half;
Drawable drawable_empty_default = ContextCompat.getDrawable(context,
otherHeartImg == false ? R.drawable.icon_heart_unchoose : R.drawable.icon_heart_unchoose_other);
Drawable drawable_half_default = ContextCompat.getDrawable(context,
otherHeartImg == false ? R.drawable.icon_heart_second : R.drawable.icon_heart_second_other);
Drawable drawable_fill_default = ContextCompat.getDrawable(context, R.drawable.icon_heart_choose);
Drawable drawable_empty = mTypedArray.getDrawable(R.styleable.CustomRatingBar_elenmentEmpty);
Drawable drawable_half = mTypedArray.getDrawable(R.styleable.CustomRatingBar_elenmentHarf);
Drawable drawable_fill = mTypedArray.getDrawable(R.styleable.CustomRatingBar_elenmentFill);
elementEmptyDrawable = drawable_empty != null ? drawable_empty : drawable_empty_default;
elementFillDrawable = drawable_half != null ? drawable_half : drawable_fill_default;
elementHarfDrawable = drawable_fill != null ? drawable_fill : drawable_half_default;
mClickable = mTypedArray.getBoolean(R.styleable.CustomRatingBar_clickable, false);
mTypedArray.recycle();
for (int i = 0; i < elementCount; ++i) {
final ImageView imageView = getElenmentImageView();
imageView.setImageDrawable(elementEmptyDrawable);
imageView.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
if (mClickable) {
//浮点数的整数部分
int fint = (int) elementStep;
BigDecimal b1 = new BigDecimal(Float.toString(elementStep));
BigDecimal b2 = new BigDecimal(Integer.toString(fint));
//浮点数的小数部分
float fPoint = b1.subtract(b2).floatValue();
if (fPoint == 0) {
fint -= 1;
}
if (indexOfChild(v) > fint) {
setRating(indexOfChild(v) + 1);
} else if (indexOfChild(v) == fint) {
if (stepSize == StepSize.Full) {//如果是满星 就不考虑半颗星了
return;
}
//点击之后默认每次先增加一颗星,再次点击变为半颗星
if (imageView.getDrawable().getCurrent().getConstantState().
equals(elementHarfDrawable.getConstantState())) {
setRating(indexOfChild(v) + 1);
} else {
setRating(indexOfChild(v) + 0.5f);
}
} else {
setRating(indexOfChild(v) + 1f);
}
}
}
}
);
addView(imageView);
}
setRating(elementStep);
}
private ImageView getElenmentImageView() {
ImageView imageView = new ImageView(getContext());
LayoutParams layout = new LayoutParams(
Math.round(mContext.getResources().getDimension(R.dimen.heart_ratingbar_width)),
Math.round(mContext.getResources().getDimension(R.dimen.heart_ratingbar_width)));//设置每个单元格在线性布局的大小
layout.setMargins(0, 0, Math.round(elementPadding), 0);//设置每颗星星在线性布局的间距
imageView.setLayoutParams(layout);
imageView.setAdjustViewBounds(true);
imageView.setImageDrawable(elementEmptyDrawable);
imageView.setMinimumWidth((int) elementWidth);
imageView.setMaxWidth((int) elementWidth);
imageView.setMinimumHeight((int) elementHeight);
imageView.setMaxHeight((int) elementHeight);
return imageView;
}
public void setRating(float rating) {
if (rating > elementCount)
rating = elementCount;
if (mOnRatingBarChangeListener != null) {
mOnRatingBarChangeListener.onRatingChange(rating);
}
this.elementStep = rating;
//浮点数的整数部分
int fint = (int) rating;
BigDecimal b1 = new BigDecimal(Float.toString(rating));
BigDecimal b2 = new BigDecimal(Integer.toString(fint));
//浮点数的小数部分
float fPoint = b1.subtract(b2).floatValue();
//设置选中的单元
for (int i = 0; i < fint; ++i) {
((ImageView) getChildAt(i)).setImageDrawable(elementFillDrawable);
}
//设置没有选中的单元
for (int i = fint; i < elementCount; i++) {
((ImageView) getChildAt(i)).setImageDrawable(elementEmptyDrawable);
}
//小数点默认增加半个
if (fPoint > 0) {
((ImageView) getChildAt(fint)).setImageDrawable(elementHarfDrawable);
}
}
public interface OnRatingChangeListener {
void onRatingChange(float ratingCount);
}
/**
* 每次增加的方式整颗还是半颗,枚举类型
* 类似于View.GONE
*/
public enum StepSize {
Half(0), Full(1);
int step;
StepSize(int step) {
this.step = step;
}
public static StepSize fromStep(int step) {
for (StepSize f : values()) {
if (f.step == step) {
return f;
}
}
throw new IllegalArgumentException();
}
}
}

View File

@@ -1,55 +0,0 @@
package com.mogo.module.common.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import androidx.appcompat.widget.AppCompatImageView;
/**
* @author donghongyu
* @date 2019-08-22
*/
public class ImageViewClipBounds extends AppCompatImageView {
Rect mClipBounds = null;
public ImageViewClipBounds(Context context) {
this(context, null);
}
public ImageViewClipBounds(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ImageViewClipBounds(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
if (mClipBounds != null) {
// clip bounds ignore scroll
canvas.clipRect(mClipBounds);
}
super.onDraw(canvas);
}
public void setClip(Rect clipBounds) {
if (clipBounds == mClipBounds || (clipBounds != null && clipBounds.equals(mClipBounds))) {
return;
}
if (clipBounds != null) {
if (mClipBounds == null) {
mClipBounds = new Rect(clipBounds);
} else {
mClipBounds.set(clipBounds);
}
} else {
mClipBounds = null;
}
invalidate();
}
}

View File

@@ -1,39 +0,0 @@
package com.mogo.module.common.view;
import android.view.View;
public
/**
* @author congtaowang
* @since 2020/9/25
*
* 防止短时间内多次点击
*/
abstract class OnPreventFastClickListener implements View.OnClickListener {
public static final long INTERVAL = 1_000L;
private long mInterval;
private long mLastClickTime = 0L;
public OnPreventFastClickListener() {
this( INTERVAL );
}
public OnPreventFastClickListener( long interval ) {
if ( interval < 0L ) {
interval = INTERVAL;
}
this.mInterval = interval;
}
@Override
public final void onClick( View v ) {
if ( System.currentTimeMillis() - mLastClickTime > mInterval ) {
onClickImpl( v );
mLastClickTime = System.currentTimeMillis();
}
}
public abstract void onClickImpl( View v );
}

View File

@@ -1,25 +0,0 @@
package com.mogo.module.common.view;
import android.graphics.Rect;
import android.view.View;
import androidx.recyclerview.widget.RecyclerView;
/**
* 这是LinearLayoutManager设置Item间距的的一个辅助类
*
* @author donghongyu
*/
public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
private int space;
public SpacesItemDecoration(int space) {
this.space = space;
}
@Override
public void getItemOffsets(Rect outRect, View view,
RecyclerView parent, RecyclerView.State state) {
outRect.bottom = space;
}
}

View File

@@ -1,58 +0,0 @@
package com.mogo.module.common.wm;
import android.app.Dialog;
import android.view.View;
import android.view.ViewGroup;
import com.mogo.module.common.dialog.BaseFloatDialog;
/**
* 采用Dialog实现接口
*/
class DialogImpl implements IWindowManagerView {
private Dialog dialog;
private View contentView;
@Override
public void init(WindowManagerView.WMViewParams params) {
dialog = new BaseFloatDialog(params.mContext);
contentView = params.mContentView;
dialog.setContentView(contentView);
}
@Override
public boolean isShowing() {
return dialog.isShowing();
}
@Override
public void handleTouchEvent(OnViewClickListener listener) {
// do nothings.
}
@Override
public void show() {
dialog.show();
}
@Override
public void update(WindowManagerView.WMViewParams params) {
}
@Override
public void update() {
}
@Override
public void hide() {
/*
* 取得view的父组件然后移除view
*/
if (contentView != null) {
((ViewGroup) contentView.getParent()).removeView(contentView);
}
dialog.dismiss();
}
}

View File

@@ -1,49 +0,0 @@
package com.mogo.module.common.wm;
import android.view.View;
public interface IWindowManagerView {
/**
* 初始化
*
* @param params contentView包装类
*/
void init( WindowManagerView.WMViewParams params );
/**
* 是否显示
*
* @return true - 显示中
*/
boolean isShowing();
/**
* 支持手势拖动,该操作只支持触发点击操作
*/
void handleTouchEvent(OnViewClickListener listener);
/**
* 显示
*/
void show();
/**
* 更新界面位置或大小
* @param params 具体参数
*/
void update(WindowManagerView.WMViewParams params);
/**
* 刷新
*/
void update();
/**
* 隐藏
*/
void hide();
public interface OnViewClickListener {
void onClick( View view, float xPos, float yPos );
}
}

View File

@@ -1,118 +0,0 @@
package com.mogo.module.common.wm;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Build;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
/**
* 采用windowManager实现接口
*/
class WindowManagerImpl implements IWindowManagerView {
private WindowManager mWindowManager;
private WindowManager.LayoutParams mLayoutParams;
private WindowManagerView.WMViewParams mParams;
private boolean isShowing;
private View rootView;
private float mLastX, mLastY;
private int mOldOffsetX, mOldOffsetY;
@Override
public void init( WindowManagerView.WMViewParams params ) {
mParams = params;
mWindowManager = ( WindowManager ) mParams.mContext.getApplicationContext().getSystemService( Context.WINDOW_SERVICE );
generateLayoutParams();
}
private void generateLayoutParams(){
mLayoutParams = new WindowManager.LayoutParams();
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ) {
mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}
mLayoutParams.format = PixelFormat.TRANSLUCENT;
mLayoutParams.gravity = mParams.mGravity;
mLayoutParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
mLayoutParams.width = mParams.mWidth;
mLayoutParams.height = mParams.mHeight;
mOldOffsetX = mLayoutParams.x = mParams.mX;
mOldOffsetY = mLayoutParams.y = mParams.mY;
mLayoutParams.dimAmount = 0.5f;
}
@Override
public boolean isShowing() {
return isShowing;
}
@Override
public void handleTouchEvent(OnViewClickListener listener) {
mParams.mContentView.setOnTouchListener( ( v, event ) -> {
final int action = event.getAction();
float x = event.getX();
float y = event.getY();
if ( action == MotionEvent.ACTION_DOWN ) {
mLastX = x;
mLastY = y;
} else if ( action == MotionEvent.ACTION_MOVE ) {
mLayoutParams.x += ( int ) ( x - mLastX ) / 3; // 减小偏移量,防止过度抖动
mLayoutParams.y += ( int ) ( y - mLastY ) / 3; // 减小偏移量,防止过度抖动
mWindowManager.updateViewLayout( mParams.mContentView, mLayoutParams );
} else if ( action == MotionEvent.ACTION_UP ) {
int newOffsetX = mLayoutParams.x;
int newOffsetY = mLayoutParams.y;
// 只要按钮一动位置不是很大,就认为是点击事件
if ( Math.abs( mOldOffsetX - newOffsetX ) <= 20
&& Math.abs( mOldOffsetY - newOffsetY ) <= 20 ) {
if ( listener != null ) {
listener.onClick( mParams.mContentView, x, y );
}
return false;
}
mOldOffsetX = newOffsetX;
mOldOffsetY = newOffsetY;
}
return true;
} );
}
@Override
public void show() {
if ( !isShowing ) {
isShowing = true;
rootView = mParams.mContentView;
mWindowManager.addView( mParams.mContentView, mLayoutParams );
}
}
@Override
public void update(WindowManagerView.WMViewParams params) {
if (isShowing) {
mParams = params;
generateLayoutParams();
mWindowManager.updateViewLayout(rootView,mLayoutParams);
}
}
@Override
public void update() {
if ( isShowing ) {
mWindowManager.updateViewLayout(rootView,mLayoutParams);
}
}
@Override
public void hide() {
if ( isShowing && mParams != null ) {
mWindowManager.removeView( mParams.mContentView );
isShowing = false;
}
}
}

View File

@@ -1,136 +0,0 @@
package com.mogo.module.common.wm;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import androidx.annotation.IdRes;
import androidx.annotation.LayoutRes;
/**
* @author congtaowang
* @since 2020-05-21
* <p>
* 往 window manager 添加view
*/
public class WindowManagerView {
private WMViewParams mParams;
private IWindowManagerView mManagerView;
private WindowManagerView( WMViewParams params, IWindowManagerView view ) {
this.mParams = params;
mManagerView = view;
view.init( params );
}
public boolean isShowing() {
return mManagerView.isShowing();
}
public < T extends View > T findViewById( @IdRes int id ) {
return mParams.mContentView.findViewById( id );
}
public void attachTouchEvent( IWindowManagerView.OnViewClickListener listener ) {
mManagerView.handleTouchEvent(listener);
}
public void show() {
mManagerView.show();
}
public void dismiss() {
mManagerView.hide();
}
public static class Builder {
private WMViewParams mParams = null;
public Builder( Context context ) {
mParams = new WMViewParams();
mParams.mContext = context;
}
public Builder contentView( View contentView ) {
mParams.mContentView = contentView;
return this;
}
public Builder contentView( @LayoutRes int contentViewId ) {
mParams.mContentView = LayoutInflater.from( mParams.mContext ).inflate( contentViewId, null );
return this;
}
public Builder size( int width, int height ) {
mParams.mWidth = width;
mParams.mHeight = height;
return this;
}
public Builder position( int x, int y ) {
mParams.mX = x;
mParams.mY = y;
return this;
}
public Builder gravity( int gravity ) {
mParams.mGravity = gravity;
return this;
}
/**
* 默认dialog实现
*
* @return
*/
public WindowManagerView build() {
return showInDialog();
}
public WindowManagerView showInDialog() {
if ( mParams.mContentView == null ) {
throw new NullPointerException( "WMViewParams#mContentView must not be null." );
}
return new WindowManagerView( mParams, new DialogImpl() );
}
public WindowManagerView showInWindowManager() {
if ( mParams.mContentView == null ) {
throw new NullPointerException( "WMViewParams#mContentView must not be null." );
}
return new WindowManagerView( mParams, new WindowManagerImpl() );
}
}
public static class WMViewParams {
public View mContentView;
public Context mContext;
public int mWidth;
public int mHeight;
public int mX;
public int mY;
public int mGravity;
}
public void exchangeSizeAndPosition(int width, int height, int x, int y) {
if (isShowing()) {
mParams.mX = x;
mParams.mY = y;
mParams.mWidth = width;
mParams.mHeight = height;
mManagerView.update(mParams);
}
}
public void update(){
if ( mManagerView != null) {
mManagerView.update();
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/dp_30" />
<gradient android:startColor="#3F4057" android:endColor="#2A2B38"/>
</shape>

View File

@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"
>
<gradient
android:angle="180"
android:endColor="#3E7FFC"
android:startColor="#5CC1FF" />
<corners
android:bottomLeftRadius="@dimen/dp_30"
/>
</shape>

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient
android:angle="180"
android:endColor="#50526E"
android:startColor="#333F4057" />
<corners android:bottomRightRadius="@dimen/dp_30"/>
</shape>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:padding="1px"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<ImageView
android:id="@+id/iv_camera_traffic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/module_camera_real_time_traffic" />
</LinearLayout>

View File

@@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:padding="1px"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<FrameLayout
android:id="@+id/clMarkerTopView"
android:layout_width="@dimen/module_service_marker_bubble_width"
android:background="@drawable/module_services_marker_bkg"
android:layout_height="@dimen/module_service_marker_bubble_height">
<com.mogo.eagle.core.utilcode.mogo.imageloader.MogoImageView
android:id="@+id/ivIcon"
android:layout_width="@dimen/module_service_marker_bubble_icon_width"
android:layout_height="@dimen/module_service_marker_bubble_icon_height"
android:layout_gravity="center"
android:layout_marginBottom="@dimen/module_service_marker_bubble_icon_marginBottom"
tools:src="@drawable/icon_map_marker_road_block_up2" />
</FrameLayout>
<ImageView
android:id="@+id/ivCar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/module_service_marker_dot_marginTop"
android:src="@drawable/icon_map_marker_location_yellow" />
</LinearLayout>

View File

@@ -1,75 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:padding="1px">
<LinearLayout
android:id="@+id/clMarkerContent"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_90"
android:background="@drawable/bg_map_marker_yellow_info">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.mogo.eagle.core.utilcode.mogo.imageloader.MogoImageView
android:id="@+id/ivUserHead"
android:layout_width="@dimen/dp_76"
android:layout_height="@dimen/dp_76"
android:layout_gravity="center_vertical"
app:miv_failureHolder="@drawable/icon_default_user_head"
app:miv_overlayImageId="@drawable/icon_default_user_head"
app:miv_placeHolder="@drawable/icon_default_user_head"
app:miv_shape="circle" />
<com.mogo.eagle.core.utilcode.mogo.imageloader.MogoImageView
android:id="@+id/ivIcon"
android:layout_width="@dimen/module_service_marker_bubble_icon_width"
android:layout_height="@dimen/module_service_marker_bubble_icon_height"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/dp_15"
android:visibility="invisible"
tools:src="@drawable/icon_map_marker_road_block_up"
tools:visibility="visible" />
</FrameLayout>
<TextView
android:id="@+id/tvMarkerContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/dp_10"
android:textColor="#ffffff"
android:textSize="@dimen/sp_32" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
app:layout_constraintEnd_toEndOf="@+id/clMarkerContent"
app:layout_constraintStart_toStartOf="@+id/clMarkerContent"
app:layout_constraintTop_toBottomOf="@+id/clMarkerContent">
<ImageView
android:id="@+id/ivReverseTriangle"
android:layout_width="@dimen/module_service_marker_anchor_size"
android:layout_height="@dimen/module_service_marker_anchor_size"
android:src="@drawable/bg_shape_reverse_yellow" />
<ImageView
android:id="@+id/ivCar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_map_marker_location_yellow" />
</LinearLayout>
</LinearLayout>

View File

@@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:padding="1px"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<FrameLayout
android:id="@+id/clMarkerTopView"
android:layout_width="@dimen/module_service_marker_bubble_vr_width"
android:background="@drawable/module_services_marker_vr_bkg"
android:layout_height="@dimen/module_service_marker_bubble_vr_height">
<com.mogo.eagle.core.utilcode.mogo.imageloader.MogoImageView
android:id="@+id/ivIcon"
android:layout_width="@dimen/module_service_marker_bubble_icon_vr_width"
android:layout_height="@dimen/module_service_marker_bubble_icon_vr_height"
android:layout_gravity="center"
android:layout_marginBottom="@dimen/module_service_marker_bubble_icon_marginBottom"
tools:src="@drawable/icon_map_marker_road_block_up2" />
</FrameLayout>
<ImageView
android:id="@+id/ivCar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/module_service_marker_dot_marginTop"
android:src="@drawable/icon_map_marker_location_yellow_vr" />
</LinearLayout>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<ImageView
android:id="@+id/module_map_amap_my_location_bg_iv"
android:layout_width="@dimen/module_map_amap_my_location_bg_size"
android:layout_height="@dimen/module_map_amap_my_location_bg_size"
android:src="@drawable/module_common_my_location_bg"/>
<ImageView
android:id="@+id/module_map_amap_my_location_iv"
android:layout_width="@dimen/module_map_amap_my_location_icon_width"
android:layout_height="@dimen/module_map_amap_my_location_icon_height"
android:layout_gravity="center"
android:src="@drawable/module_map_amap_my_location_icon"/>
</FrameLayout>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/module_commons_marker_car_model"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>

View File

@@ -1,55 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/module_commons_dlg_bkg"
android:layout_gravity="center">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="@dimen/dp_790"
android:layout_height="@dimen/dp_440"
android:layout_gravity="center"
android:background="@drawable/module_commons_shape_dlg_round_bkg">
<TextView
android:id="@+id/module_commons_wm_dialog_content"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_56"
android:layout_marginTop="@dimen/dp_134"
android:maxLines="1"
android:textColor="@color/module_commons_wm_dialog_text_textColor"
android:textSize="@dimen/sp_40"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="是否退出导航导航导航导航导航导航导航导航导航导航导航导航导航导航导航导航?" />
<TextView
android:id="@+id/module_commons_wm_dialog_button_ok"
android:layout_width="@dimen/dp_395"
android:layout_height="@dimen/dp_128"
android:background="@drawable/module_commons_shape_left_btn_bkg"
android:gravity="center"
android:textColor="@color/module_commons_wm_dialog_text_textColor"
android:textSize="@dimen/dp_40"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
tools:text="确认" />
<TextView
android:id="@+id/module_commons_wm_dialog_button_cancel"
android:layout_width="@dimen/dp_395"
android:layout_height="@dimen/dp_128"
android:background="@drawable/module_commons_shape_right_btn_bkg"
android:gravity="center"
android:textColor="@color/module_commons_wm_dialog_text_textColor"
android:textSize="@dimen/dp_40"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:text="取消" />
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>

View File

@@ -1,64 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="heart_ratingbar_width">18px</dimen>
<dimen name="heart_ratingbar_height">16px</dimen>
<dimen name="v2x_panel_loading_top">120px</dimen>
<dimen name="v2x_share_btn_width">150px</dimen>
<dimen name="v2x_share_btn_height">48px</dimen>
<dimen name="share_item_address">17.5000px</dimen>
<dimen name="module_service_marker_anchor_size">16dp</dimen>
<dimen name="module_service_marker_dot_marginTop">2dp</dimen>
<dimen name="module_service_marker_bubble_width">70px</dimen>
<dimen name="module_service_marker_bubble_height">76px</dimen>
<dimen name="module_service_marker_bubble_icon_width">35px</dimen>
<dimen name="module_service_marker_bubble_icon_height">35px</dimen>
<dimen name="module_service_marker_bubble_icon_marginBottom">4px</dimen>
<dimen name="module_service_marker_bounds_leftMargin">550px</dimen>
<dimen name="module_service_marker_bounds_topMargin">208px</dimen>
<dimen name="module_service_marker_bounds_bottomMargin">100px</dimen>
<dimen name="module_service_marker_bounds_rightMargin">100px</dimen>
<dimen name="module_services_info_window_paddingStart">100px</dimen>
<dimen name="module_services_info_window_paddingEnd">10px</dimen>
<dimen name="module_services_info_window_height">54px</dimen>
<dimen name="module_service_user_header_width">44px</dimen>
<dimen name="module_service_user_header_height">44px</dimen>
<dimen name="module_service_content_textSize">14px</dimen>
<dimen name="module_service_tag_textSize">12px</dimen>
<dimen name="module_service_content_minWidth">64px</dimen>
<dimen name="module_service_id_marker_content_paddingRight">6.5px</dimen>
<dimen name="module_service_id_marker_content_paddingRight_widthoutCall">10px</dimen>
<dimen name="module_services_online_car_panel_marginTop">2px</dimen>
<dimen name="module_services_online_car_panel_marginBottom">2px</dimen>
<dimen name="module_services_online_car_panel_marginRight">6px</dimen>
<dimen name="module_services_online_car_panel_paddingLeft">28px</dimen>
<dimen name="module_services_online_car_panel_paddingBottom">16px</dimen>
<dimen name="module_services_online_car_panel_close_margin_top">20px</dimen>
<dimen name="module_services_online_car_panel_title_margin_top">28px</dimen>
<dimen name="module_services_online_car_panel_title_text_size">20px</dimen>
<dimen name="module_services_online_car_panel_recycler_view_margin_top">84px</dimen>
<dimen name="module_services_load_strategy_textSize">18px</dimen>
<dimen name="module_services_panel_item_avatar_size">58px</dimen>
<dimen name="module_services_panel_item_detail_textSize">14px</dimen>
<dimen name="module_services_panel_item_distance_textSize">16px</dimen>
<dimen name="module_services_panel_item_nickname_textSize">18px</dimen>
<dimen name="module_services_id_panel_item_avatar_border_width">5px</dimen>
<dimen name="module_services_panel_item_padding">20px</dimen>
<dimen name="module_services_panel_item_nickname_marginLeft">13px</dimen>
<dimen name="module_services_id_panel_item_distance_marginLeft">42px</dimen>
<dimen name="module_services_panel_item_detail_bkg_corner">8.89px</dimen>
<dimen name="module_services_panel_item_detail_padding">13px</dimen>
<dimen name="module_services_panel_item_marginBottom">16px</dimen>
<dimen name="module_services_panel_strategy_button_bkg_corner">25px</dimen>
<dimen name="module_services_load_strategy_paddingTop">13px</dimen>
<dimen name="module_services_load_strategy_paddingLeft">26px</dimen>
<dimen name="module_services_load_strategy_marginRight">40px</dimen>
<dimen name="module_services_empty_tip_textSize">18px</dimen>
<dimen name="module_services_empty_tip_marginTop">28px</dimen>
<dimen name="module_services_panel_strategy_button_marginTop">108px</dimen>
<dimen name="module_services_panel_item_corner">12.5px</dimen>
</resources>

View File

@@ -1057,24 +1057,7 @@
<dimen name="sp_48">48px</dimen>
<dimen name="sp_76">76px</dimen>
<dimen name="sp_120">120px</dimen>
<dimen name="module_common_shadow_width">-10px</dimen>
<dimen name="module_common_shadow_width_pos">10px</dimen>
<dimen name="heart_ratingbar_width">34px</dimen>
<dimen name="heart_ratingbar_height">30px</dimen>
<dimen name="v2x_panel_loading_top">300px</dimen>
<dimen name="v2x_share_btn_width">281px</dimen>
<dimen name="v2x_share_btn_height">90px</dimen>
<dimen name="share_item_address">32px</dimen>
<dimen name="panel_list_item_title_size">26px</dimen>
<dimen name="module_service_marker_anchor_size">20dp</dimen>
<dimen name="module_service_marker_dot_marginTop">4dp</dimen>
<dimen name="module_service_marker_bubble_width">120px</dimen>
<dimen name="module_service_marker_bubble_vr_width">55px</dimen>
<dimen name="module_service_marker_bubble_height">130px</dimen>
<dimen name="module_service_marker_bubble_vr_height">69px</dimen>
<dimen name="module_service_marker_bubble_icon_width">60px</dimen>
<dimen name="module_service_marker_bubble_icon_height">60px</dimen>
<dimen name="module_service_marker_bubble_icon_vr_width">35px</dimen>
<dimen name="module_service_marker_bubble_icon_vr_height">35px</dimen>
<dimen name="module_service_marker_bubble_icon_marginBottom">8px</dimen>
@@ -1094,11 +1077,6 @@
<dimen name="module_service_content_minWidth">120px</dimen>
<dimen name="module_service_id_marker_content_paddingRight_widthoutCall">20px</dimen>
<dimen name="module_services_online_car_panel_marginTop">20px</dimen>
<dimen name="module_services_online_car_panel_marginBottom">20px</dimen>
<dimen name="module_services_online_car_panel_marginRight">20px</dimen>
<dimen name="module_services_online_car_panel_paddingLeft">50px</dimen>
<dimen name="module_services_online_car_panel_paddingBottom">28px</dimen>
<dimen name="module_services_online_car_panel_close_margin_top">36px</dimen>
<dimen name="module_services_online_car_panel_title_margin_top">50px</dimen>

View File

@@ -1,39 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="DiscreteScrollView">
<attr name="dsv_orientation" format="enum">
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
</declare-styleable>
<declare-styleable name="CustomRatingBar">
<!---->
<attr name="elenmentWidth" format="dimension" />
<!---->
<attr name="elenmentHeight" format="dimension" />
<!--单元间距-->
<attr name="elenmentPadding" format="dimension" />
<!--单元总数-->
<attr name="elenmentCount" format="integer" />
<!--空资源-->
<attr name="elenmentEmpty" format="reference" />
<!--满资源-->
<attr name="elenmentFill" format="reference" />
<!--半资源-->
<attr name="elenmentHarf" format="reference" />
<!--是否可点击-->
<attr name="clickable" format="boolean" />
<!--当前进度-->
<attr name="elenmentStep" format="float" />
<!--进度方式 半个还是整个-->
<attr name="stepSize">
<enum name="Half" value="0" />
<enum name="Full" value="1" />
</attr>
<attr name="OtherHeartImg" format="boolean" />
</declare-styleable>
</resources>

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="module_commons_dlg_bkg">#99000000</color>
<color name="module_commons_wm_dialog_text_textColor">#FFFFFF</color>
<color name="v2x_FFF_666">#FFFFFF</color>
<color name="module_commons_FFF_333">#FFFFFF</color>
</resources>

View File

@@ -1045,19 +1045,7 @@
<dimen name="sp_40">21.8750px</dimen>
<dimen name="sp_42">22.9688px</dimen>
<dimen name="sp_48">26.2500px</dimen>
<dimen name="module_common_shadow_width">-8px</dimen>
<dimen name="module_common_shadow_width_pos">8px</dimen>
<dimen name="heart_ratingbar_width">18px</dimen>
<dimen name="heart_ratingbar_height">16px</dimen>
<dimen name="v2x_panel_loading_top">120px</dimen>
<dimen name="v2x_share_btn_width">150px</dimen>
<dimen name="v2x_share_btn_height">48px</dimen>
<dimen name="share_item_address">17.5000px</dimen>
<dimen name="panel_list_item_title_size">15.3125px</dimen>
<dimen name="ratingbar_padding">6px</dimen>
<dimen name="module_service_marker_anchor_size">16dp</dimen>
<dimen name="module_service_marker_dot_marginTop">2dp</dimen>
<dimen name="module_service_marker_bubble_width">70px</dimen>
<dimen name="module_service_marker_bubble_height">76px</dimen>
<dimen name="module_service_marker_bubble_icon_width">35px</dimen>
@@ -1079,11 +1067,6 @@
<dimen name="module_service_id_marker_content_paddingRight">6.5px</dimen>
<dimen name="module_service_id_marker_content_paddingRight_widthoutCall">10px</dimen>
<dimen name="module_services_online_car_panel_marginTop">2px</dimen>
<dimen name="module_services_online_car_panel_marginBottom">2px</dimen>
<dimen name="module_services_online_car_panel_marginRight">0px</dimen>
<dimen name="module_services_online_car_panel_paddingLeft">28px</dimen>
<dimen name="module_services_online_car_panel_paddingBottom">16px</dimen>
<dimen name="module_services_online_car_panel_close_margin_top">20px</dimen>
<dimen name="module_services_online_car_panel_title_margin_top">28px</dimen>

View File

@@ -1,6 +0,0 @@
<resources>
<string name="app_name">mogo-module-common</string>
<string name="module_commons_button_ok">确认</string>
<string name="module_commons_button_cancel">取消</string>
<string name="module_commons_exit_navi_content">是否退出导航?</string>
</resources>

View File

@@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="BaseFloatDialogStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowIsFloating">true</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:backgroundDimAmount">0.6</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:fullBright">@android:color/transparent</item>
<item name="android:fullDark">@android:color/transparent</item>
<item name="android:topBright">@android:color/transparent</item>
<item name="android:topDark">@android:color/transparent</item>
<item name="android:borderlessButtonStyle">@android:color/transparent</item>
</style>
<style name="customHeartHeartRatingBarStyle" parent="@style/Widget.AppCompat.RatingBar">
<item name="android:maxWidth">@dimen/heart_ratingbar_width</item>
<item name="android:minWidth">@dimen/heart_ratingbar_width</item>
<item name="android:minHeight">@dimen/heart_ratingbar_height</item>
<item name="android:maxHeight">@dimen/heart_ratingbar_height</item>
<item name="android:numStars">5</item>
<item name="android:rating">1</item>
<item name="android:stepSize">0.5</item>
<item name="android:progressDrawable">@drawable/module_commons_heart_ratingbar_drawable</item>
</style>
<declare-styleable name="RoundLayout">
<attr name="roundLayoutRadius" format="dimension" />
</declare-styleable>
</resources>

View File

@@ -1,10 +0,0 @@
# 刷新策略 + 地图事件点刷新
## 刷新策略:自动刷新、手动刷新、刷新接口
## 大而全数据:道路事件
## 在线车辆数据
## 大部分广播的接口小智语音广播、acc 状态

View File

@@ -42,9 +42,6 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation rootProject.ext.dependencies.androidxappcompat
implementation rootProject.ext.dependencies.androidxconstraintlayout
implementation rootProject.ext.dependencies.arouter
kapt rootProject.ext.dependencies.aroutercompiler

View File

@@ -1,7 +1 @@
#-----ServiceModule-----
-keep class com.mogo.eagle.core.data.autopilot.AutopilotCarStateInfo{*;}
-keep class com.mogo.module.service.network.bean.*{*;}
-keep class com.mogo.module.service.network.RefreshBody{*;}
-keep class com.mogo.module.service.websocket.*{*;}
-keep interface com.mogo.module.service.network.RefreshApiService{*;}
-keep interface com.mogo.module.service.network.RefreshCallback{*;}

View File

@@ -21,7 +21,3 @@
#-renamesourcefileattribute SourceFile
#-----ServiceModule-----
-keep class com.mogo.eagle.core.data.autopilot.AutopilotCarStateInfo.*{*;}
-keep class com.mogo.module.service.network.RefreshBody.*{*;}
-keep interface com.mogo.module.service.network.RefreshApiService
-keep interface com.mogo.module.service.network.RefreshCallback

View File

@@ -1,164 +0,0 @@
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public
/**
* @author congtaowang
* @since 2021/3/26
*
* 生成测试数据,执行指令
* java LocParse.java
*
* loc.txt
* adas0.txt
* adas1.txt
* adas2.txt
* adas3.txt
* adas4.txt
* adas5.txt
* adas6.txt
* adas7.txt
* adas8.txt
* adas9.txt
*
*/
class LocParse {
public static void main( String[] args ) {
new Thread( new Runnable() {
@Override
public void run() {
try {
LocParse.run();
} catch ( Exception e ) {
e.printStackTrace();
}
}
} ).run();
}
private static void run() throws Exception {
InputStreamReader isr = new InputStreamReader( new FileInputStream( "loc.csv" ) );
BufferedReader br = new BufferedReader( isr );
File loc = new File( "loc.txt" );
if ( loc.exists() ) {
loc.delete();
}
loc.createNewFile();
OutputStreamWriter locOsw = new OutputStreamWriter( new FileOutputStream( loc ) );
BufferedWriter locWr = new BufferedWriter( locOsw );
final int adasRecAmount = 10;
final int intervalLineAmount = 50;
BufferedWriter writers[] = new BufferedWriter[adasRecAmount];
for ( int i = 0; i < adasRecAmount; i++ ) {
File file = new File( "adas" + i + ".txt" );
if ( file.exists() ) {
file.delete();
}
file.createNewFile();
OutputStreamWriter osw = new OutputStreamWriter( new FileOutputStream( file ) );
writers[i] = new BufferedWriter( osw );
}
String line = null;
final int pLon = 1;
final int pLat = 2;
final int pAlt = 3;
final int pHeading = 4;
final int pSpeed = 6;
final int pDistance = 7;
final int pReceiverDataTime = 8;
final int pAdasSatelliteTime = 9;
final int pSystemTime = 10;
final int pSatelliteTime = 11;
int counter = 0;
while ( ( line = br.readLine() ) != null ) {
line = line.replace( " ", "" );
String seg[] = line.split( "," );
double lon = Double.parseDouble( seg[pLon] );
double lat = Double.parseDouble( seg[pLat] );
double alt = Double.parseDouble( seg[pAlt] );
double heading = Double.parseDouble( seg[pHeading] );
double speed = Double.parseDouble( seg[pSpeed] );
double distance = Double.parseDouble( seg[pDistance] );
long receiverDataTime = Long.parseLong( seg[pReceiverDataTime] );
long adasSatelliteTime = Long.parseLong( seg[pAdasSatelliteTime] );
long systemTime = Long.parseLong( seg[pSystemTime] );
long satelliteTime = Long.parseLong( seg[pSatelliteTime] );
// 定位
StringBuilder locJson = new StringBuilder( "{" );
locJson.append( "\"lon\":" + lon );
locJson.append( ",\"lat\":" + lat );
locJson.append( ",\"alt\":" + alt );
locJson.append( ",\"heading\":" + heading );
locJson.append( ",\"speed\":" + speed );
locJson.append( ",\"systemTime\":" + systemTime );
locJson.append( ",\"receiverDataTime\":" + receiverDataTime );
locJson.append( ",\"adasSatelliteTime\":" + adasSatelliteTime );
locJson.append( ",\"satelliteTime\":" + satelliteTime );
locJson.append( "}\n" );
locWr.write( locJson.toString() );
int writersCount = counter++ / intervalLineAmount;
if ( writersCount > adasRecAmount ) {
writersCount = adasRecAmount;
}
for ( int i = 0; i < writersCount; i++ ) {
int type = 3;
switch ( i ) {
case 1:
case 2:
case 3:
case 4:
case 6:
type = i;
break;
case 0:
case 5:
case 7:
case 8:
case 9:
type = 3;
break;
}
StringBuilder adasJson = new StringBuilder( "{" );
adasJson.append( "\"type\":" + type );
adasJson.append( ",\"uuid\":" + "\"2_" + i + "\"" );
adasJson.append( ",\"lon\":" + lon );
adasJson.append( ",\"lat\":" + lat );
adasJson.append( ",\"alt\":" + alt );
adasJson.append( ",\"heading\":" + heading );
adasJson.append( ",\"distance\":" + distance );
adasJson.append( ",\"speed\":" + speed );
adasJson.append( ",\"systemTime\":" + systemTime );
adasJson.append( ",\"satelliteTime\":" + satelliteTime );
adasJson.append( ",\"dataAccuracy\":" + 1 );
adasJson.append( "}\n" );
writers[i].write( adasJson.toString() );
}
// adas
}
locWr.flush();
locWr.close();
for ( BufferedWriter writer : writers ) {
writer.flush();
writer.close();
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,94 +0,0 @@
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":0.0,"lat":40.1992792853,"lon":116.7360711945,"alt":0.0,"systemTime":"1615802115111","satelliteTime":"0","distance":"0.000000","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":0.0,"lat":40.199242112,"lon":116.7357893264,"alt":0.0,"systemTime":"1615802255849","satelliteTime":"0","distance":"-1.00000","driveIn":false,"driveOut":true},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":0.0,"lat":40.1991613601,"lon":116.7354621421,"alt":0.0,"systemTime":"1615802049172","satelliteTime":"0","distance":"-1.00000","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":0.0,"lat":40.1991963756,"lon":116.7354438523,"alt":0.0,"systemTime":"1615802179568","satelliteTime":"0","distance":"0.000000","driveIn":false,"driveOut":true}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":0.0,"lat":40.1992785996,"lon":116.7360454327,"alt":0.0,"systemTime":"1615802115195","satelliteTime":"0","distance":"-1.00000","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":7.976769,"lat":40.199241415,"lon":116.7357845307,"alt":0.0,"systemTime":"1615802256063","satelliteTime":"0","distance":"39.35802","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":0.0,"lat":40.1991608088,"lon":116.7354678711,"alt":0.0,"systemTime":"1615802049248","satelliteTime":"0","distance":"-1.00000","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":0.0,"lat":40.19919746,"lon":116.7354478076,"alt":0.0,"systemTime":"1615802179647","satelliteTime":"0","distance":"-1.00000","driveIn":false,"driveOut":true}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":5.197315,"lat":40.1992783099,"lon":116.7360345412,"alt":0.0,"systemTime":"1615802115280","satelliteTime":"0","distance":"60.62180","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":9.083339,"lat":40.1992421043,"lon":116.7357659004,"alt":0.0,"systemTime":"1615802256139","satelliteTime":"0","distance":"37.77211","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":0.492678,"lat":40.1991604536,"lon":116.7354725043,"alt":0.0,"systemTime":"1615802049353","satelliteTime":"0","distance":"16.71913","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":1.396493,"lat":40.1991985536,"lon":116.7354532852,"alt":0.0,"systemTime":"1615802179832","satelliteTime":"0","distance":"12.92429","driveIn":false,"driveOut":true}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":6.08818,"lat":40.1992780983,"lon":116.7360265846,"alt":0.0,"systemTime":"1615802115360","satelliteTime":"0","distance":"59.94487","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":11.70002,"lat":40.1992415709,"lon":116.7357689945,"alt":0.0,"systemTime":"1615802256218","satelliteTime":"0","distance":"38.03761","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":1.412992,"lat":40.1991605551,"lon":116.735477607,"alt":0.0,"systemTime":"1615802049451","satelliteTime":"0","distance":"17.04613","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":1.823372,"lat":40.1991979254,"lon":116.7354572337,"alt":0.0,"systemTime":"1615802179912","satelliteTime":"0","distance":"13.24981","driveIn":false,"driveOut":true}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":7.775903,"lat":40.1992780983,"lon":116.7360265846,"alt":0.0,"systemTime":"1615802115565","satelliteTime":"0","distance":"59.94487","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":8.683455,"lat":40.1992406216,"lon":116.7357901818,"alt":0.0,"systemTime":"1615802256306","satelliteTime":"0","distance":"39.84204","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.369266,"lat":40.1991603937,"lon":116.7354826261,"alt":0.0,"systemTime":"1615802049553","satelliteTime":"0","distance":"17.39038","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":2.631431,"lat":40.1991979432,"lon":116.7354618011,"alt":0.0,"systemTime":"1615802179996","satelliteTime":"0","distance":"13.58699","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":5.198709,"lat":40.1992774364,"lon":116.7360262535,"alt":0.0,"systemTime":"1615802115648","satelliteTime":"0","distance":"59.91393","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":6.744348,"lat":40.1992408857,"lon":116.7357832719,"alt":0.0,"systemTime":"1615802256376","satelliteTime":"0","distance":"39.25378","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.966257,"lat":40.1991598498,"lon":116.735489104,"alt":0.0,"systemTime":"1615802049654","satelliteTime":"0","distance":"17.86260","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":2.559369,"lat":40.1991975733,"lon":116.7354663138,"alt":0.0,"systemTime":"1615802180079","satelliteTime":"0","distance":"13.94323","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":3.150123,"lat":40.1992783899,"lon":116.7360293288,"alt":0.0,"systemTime":"1615802115729","satelliteTime":"0","distance":"60.17929","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":6.142939,"lat":40.1992408781,"lon":116.7357688528,"alt":0.0,"systemTime":"1615802256521","satelliteTime":"0","distance":"38.02917","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.132745,"lat":40.1991594773,"lon":116.7354940671,"alt":0.0,"systemTime":"1615802049751","satelliteTime":"0","distance":"18.22459","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":2.797443,"lat":40.1991965731,"lon":116.7354736316,"alt":0.0,"systemTime":"1615802180156","satelliteTime":"0","distance":"14.54477","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":1.703178,"lat":40.199278689,"lon":116.7360243026,"alt":0.0,"systemTime":"1615802115815","satelliteTime":"0","distance":"59.75359","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":6.405643,"lat":40.1992410717,"lon":116.7357503253,"alt":0.0,"systemTime":"1615802256597","satelliteTime":"0","distance":"36.45465","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.140656,"lat":40.1991596927,"lon":116.7354993078,"alt":0.0,"systemTime":"1615802049833","satelliteTime":"0","distance":"18.56997","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":3.255543,"lat":40.1991959729,"lon":116.7354795512,"alt":0.0,"systemTime":"1615802180359","satelliteTime":"0","distance":"15.02264","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":1.51412,"lat":40.1992797845,"lon":116.7360172246,"alt":0.0,"systemTime":"1615802115901","satelliteTime":"0","distance":"59.15732","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":7.629035,"lat":40.1992413246,"lon":116.7357314335,"alt":0.0,"systemTime":"1615802256667","satelliteTime":"0","distance":"34.84896","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.984158,"lat":40.1991595924,"lon":116.7355039435,"alt":0.0,"systemTime":"1615802049955","satelliteTime":"0","distance":"18.89761","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":3.611005,"lat":40.1991953473,"lon":116.7354863853,"alt":0.0,"systemTime":"1615802180438","satelliteTime":"0","distance":"15.57338","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":2.312026,"lat":40.1992804138,"lon":116.7360027572,"alt":0.0,"systemTime":"1615802115981","satelliteTime":"0","distance":"57.93142","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":8.161798,"lat":40.1992409059,"lon":116.7357233552,"alt":0.0,"systemTime":"1615802256746","satelliteTime":"0","distance":"34.16544","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.86434,"lat":40.1991597707,"lon":116.7355095428,"alt":0.0,"systemTime":"1615802050042","satelliteTime":"0","distance":"19.27789","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":3.538996,"lat":40.1991954442,"lon":116.7354907334,"alt":0.0,"systemTime":"1615802180517","satelliteTime":"0","distance":"15.90115","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":3.907729,"lat":40.1992800515,"lon":116.7359977886,"alt":0.0,"systemTime":"1615802116074","satelliteTime":"0","distance":"57.50759","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":7.340135,"lat":40.1992406075,"lon":116.7357215643,"alt":0.0,"systemTime":"1615802256920","satelliteTime":"0","distance":"34.01516","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.998565,"lat":40.1991594486,"lon":116.7355155686,"alt":0.0,"systemTime":"1615802050174","satelliteTime":"0","distance":"19.72334","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":3.113875,"lat":40.1991957422,"lon":116.7354952727,"alt":0.0,"systemTime":"1615802180608","satelliteTime":"0","distance":"16.23603","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":4.999974,"lat":40.1992800347,"lon":116.7359838074,"alt":0.0,"systemTime":"1615802116156","satelliteTime":"0","distance":"56.31992","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":5.200541,"lat":40.1992402809,"lon":116.7357232415,"alt":0.0,"systemTime":"1615802256989","satelliteTime":"0","distance":"34.15955","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.206295,"lat":40.199159394,"lon":116.735521609,"alt":0.0,"systemTime":"1615802050247","satelliteTime":"0","distance":"20.15697","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":2.675883,"lat":40.1991960745,"lon":116.73549891,"alt":0.0,"systemTime":"1615802180698","satelliteTime":"0","distance":"16.50173","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":5.811615,"lat":40.1992797505,"lon":116.7359746716,"alt":0.0,"systemTime":"1615802116347","satelliteTime":"0","distance":"55.54251","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":3.123136,"lat":40.1992403585,"lon":116.7357215193,"alt":0.0,"systemTime":"1615802257060","satelliteTime":"0","distance":"34.01286","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.322045,"lat":40.1991592954,"lon":116.7355270276,"alt":0.0,"systemTime":"1615802050397","satelliteTime":"0","distance":"20.55203","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":2.395177,"lat":40.1991960878,"lon":116.7355034925,"alt":0.0,"systemTime":"1615802180783","satelliteTime":"0","distance":"16.85686","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":5.409781,"lat":40.1992792033,"lon":116.7359766385,"alt":0.0,"systemTime":"1615802116429","satelliteTime":"0","distance":"55.70686","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":2.106689,"lat":40.1992403795,"lon":116.7357155593,"alt":0.0,"systemTime":"1615802257254","satelliteTime":"0","distance":"33.50676","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.240801,"lat":40.1991594887,"lon":116.735532375,"alt":0.0,"systemTime":"1615802050472","satelliteTime":"0","distance":"20.92770","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":2.309028,"lat":40.1991962664,"lon":116.7355068965,"alt":0.0,"systemTime":"1615802180867","satelliteTime":"0","distance":"17.11418","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":4.403643,"lat":40.1992787253,"lon":116.7359741871,"alt":0.0,"systemTime":"1615802116597","satelliteTime":"0","distance":"55.49630","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":2.315907,"lat":40.1992399159,"lon":116.7357096847,"alt":0.0,"systemTime":"1615802257329","satelliteTime":"0","distance":"33.01102","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.067091,"lat":40.1991593388,"lon":116.7355372651,"alt":0.0,"systemTime":"1615802050564","satelliteTime":"0","distance":"21.29254","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":2.427744,"lat":40.1991961598,"lon":116.7355129668,"alt":0.0,"systemTime":"1615802180956","satelliteTime":"0","distance":"17.59382","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":2.855541,"lat":40.1992790002,"lon":116.73596991,"alt":0.0,"systemTime":"1615802116677","satelliteTime":"0","distance":"55.13432","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":3.073921,"lat":40.1992403739,"lon":116.7357025541,"alt":0.0,"systemTime":"1615802257403","satelliteTime":"0","distance":"32.40279","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.077654,"lat":40.1991589247,"lon":116.7355439239,"alt":0.0,"systemTime":"1615802050648","satelliteTime":"0","distance":"21.80402","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":2.730914,"lat":40.199195937,"lon":116.7355183297,"alt":0.0,"systemTime":"1615802181157","satelliteTime":"0","distance":"18.02466","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":2.553277,"lat":40.1992788057,"lon":116.7359569487,"alt":0.0,"systemTime":"1615802116762","satelliteTime":"0","distance":"54.03239","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":3.820083,"lat":40.1992406534,"lon":116.7356941332,"alt":0.0,"systemTime":"1615802257486","satelliteTime":"0","distance":"31.68620","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.255474,"lat":40.1991587671,"lon":116.7355498918,"alt":0.0,"systemTime":"1615802050778","satelliteTime":"0","distance":"22.25304","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":3.065778,"lat":40.1991960882,"lon":116.7355245014,"alt":0.0,"systemTime":"1615802181238","satelliteTime":"0","distance":"18.50527","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":2.791032,"lat":40.1992788709,"lon":116.7359590884,"alt":0.0,"systemTime":"1615802116842","satelliteTime":"0","distance":"54.21446","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.397587,"lat":40.1992407618,"lon":116.7356845996,"alt":0.0,"systemTime":"1615802257558","satelliteTime":"0","distance":"30.87628","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.439794,"lat":40.1991587888,"lon":116.7355561112,"alt":0.0,"systemTime":"1615802050858","satelliteTime":"0","distance":"22.71364","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":3.255493,"lat":40.1991954384,"lon":116.7355297941,"alt":0.0,"systemTime":"1615802181315","satelliteTime":"0","distance":"18.95062","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":3.744978,"lat":40.1992779107,"lon":116.7359401583,"alt":0.0,"systemTime":"1615802116917","satelliteTime":"0","distance":"52.60175","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.862971,"lat":40.1992408312,"lon":116.7356762034,"alt":0.0,"systemTime":"1615802257765","satelliteTime":"0","distance":"30.16320","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.307328,"lat":40.1991591331,"lon":116.7355600508,"alt":0.0,"systemTime":"1615802050972","satelliteTime":"0","distance":"22.98941","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":3.260365,"lat":40.1991953973,"lon":116.7355359587,"alt":0.0,"systemTime":"1615802181398","satelliteTime":"0","distance":"19.44161","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":4.676548,"lat":40.1992778641,"lon":116.7359322582,"alt":0.0,"systemTime":"1615802116996","satelliteTime":"0","distance":"51.93047","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":5.009202,"lat":40.199240604,"lon":116.7356674716,"alt":0.0,"systemTime":"1615802257843","satelliteTime":"0","distance":"29.42373","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.113706,"lat":40.1991592334,"lon":116.7355666946,"alt":0.0,"systemTime":"1615802051054","satelliteTime":"0","distance":"23.48290","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":3.110471,"lat":40.1991953826,"lon":116.7355397422,"alt":0.0,"systemTime":"1615802181558","satelliteTime":"0","distance":"19.74339","driveIn":true,"driveOut":false}]
[{"uuid":"786","carId":"0","type":"3","color":"0","inOutFlag":8,"heading":0.0,"speed":5.317314,"lat":40.1992775717,"lon":116.7359225584,"alt":0.0,"systemTime":"1615802117077","satelliteTime":"0","distance":"51.10509","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.636511,"lat":40.1992400082,"lon":116.7356622282,"alt":0.0,"systemTime":"1615802257916","satelliteTime":"0","distance":"28.98310","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.096209,"lat":40.1991589394,"lon":116.7355720516,"alt":0.0,"systemTime":"1615802051174","satelliteTime":"0","distance":"23.90218","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":5,"heading":0.0,"speed":3.012356,"lat":40.1991954061,"lon":116.735546403,"alt":0.0,"systemTime":"1615802181639","satelliteTime":"0","distance":"20.27430","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":8,"heading":0.0,"speed":0.0,"lat":40.1992791521,"lon":116.7359085211,"alt":0.0,"systemTime":"1615802117480","satelliteTime":"0","distance":"-1.00000","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":3.983068,"lat":40.199239568,"lon":116.7356565408,"alt":0.0,"systemTime":"1615802257992","satelliteTime":"0","distance":"28.50393","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.360256,"lat":40.1991585392,"lon":116.735579628,"alt":0.0,"systemTime":"1615802051252","satelliteTime":"0","distance":"24.49668","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.063223,"lat":40.1991953165,"lon":116.7355517732,"alt":0.0,"systemTime":"1615802181714","satelliteTime":"0","distance":"20.70771","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":8,"heading":0.0,"speed":2.271649,"lat":40.199278852,"lon":116.7358995485,"alt":0.0,"systemTime":"1615802117555","satelliteTime":"0","distance":"49.15743","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":3.311933,"lat":40.199239281,"lon":116.7356522482,"alt":0.0,"systemTime":"1615802258063","satelliteTime":"0","distance":"28.14207","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.666871,"lat":40.1991583736,"lon":116.7355858766,"alt":0.0,"systemTime":"1615802051374","satelliteTime":"0","distance":"24.98084","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.158866,"lat":40.199195218,"lon":116.735557361,"alt":0.0,"systemTime":"1615802181796","satelliteTime":"0","distance":"21.15993","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":8,"heading":0.0,"speed":2.86804,"lat":40.1992784959,"lon":116.735894219,"alt":0.0,"systemTime":"1615802117737","satelliteTime":"0","distance":"48.70289","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":3.481111,"lat":40.1992398335,"lon":116.7356407372,"alt":0.0,"systemTime":"1615802258241","satelliteTime":"0","distance":"27.16143","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.654301,"lat":40.1991582732,"lon":116.7355914933,"alt":0.0,"systemTime":"1615802051494","satelliteTime":"0","distance":"25.41531","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.05733,"lat":40.199195603,"lon":116.7355611353,"alt":0.0,"systemTime":"1615802181878","satelliteTime":"0","distance":"21.44982","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":8,"heading":0.0,"speed":4.810977,"lat":40.1992779922,"lon":116.7358790134,"alt":0.0,"systemTime":"1615802117819","satelliteTime":"0","distance":"47.40882","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.047473,"lat":40.1992402445,"lon":116.7356352855,"alt":0.0,"systemTime":"1615802258316","satelliteTime":"0","distance":"26.69582","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.558737,"lat":40.1991574452,"lon":116.7355977684,"alt":0.0,"systemTime":"1615802051656","satelliteTime":"0","distance":"25.93654","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":2.874259,"lat":40.1991952388,"lon":116.7355674545,"alt":0.0,"systemTime":"1615802181954","satelliteTime":"0","distance":"21.97229","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":8,"heading":0.0,"speed":5.524149,"lat":40.199277205,"lon":116.7358707005,"alt":0.0,"systemTime":"1615802117900","satelliteTime":"0","distance":"46.69860","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.319131,"lat":40.1992400809,"lon":116.7356278404,"alt":0.0,"systemTime":"1615802258390","satelliteTime":"0","distance":"26.06574","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.373051,"lat":40.1991575783,"lon":116.7356033378,"alt":0.0,"systemTime":"1615802051737","satelliteTime":"0","distance":"26.35902","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":2.887222,"lat":40.1991949277,"lon":116.735572198,"alt":0.0,"systemTime":"1615802182162","satelliteTime":"0","distance":"22.36629","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":8,"heading":0.0,"speed":5.967031,"lat":40.1992775306,"lon":116.7358600072,"alt":0.0,"systemTime":"1615802117981","satelliteTime":"0","distance":"45.79222","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.293089,"lat":40.1992400772,"lon":116.7356197552,"alt":0.0,"systemTime":"1615802258461","satelliteTime":"0","distance":"25.38020","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.323301,"lat":40.1991571316,"lon":116.7356091048,"alt":0.0,"systemTime":"1615802051816","satelliteTime":"0","distance":"26.82527","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.06316,"lat":40.1991950654,"lon":116.7355786841,"alt":0.0,"systemTime":"1615802182241","satelliteTime":"0","distance":"22.88663","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":8,"heading":0.0,"speed":5.494833,"lat":40.199277818,"lon":116.7358586075,"alt":0.0,"systemTime":"1615802118073","satelliteTime":"0","distance":"45.67495","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.218418,"lat":40.1992402857,"lon":116.7356116235,"alt":0.0,"systemTime":"1615802258668","satelliteTime":"0","distance":"24.68902","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.300756,"lat":40.1991577086,"lon":116.7356150517,"alt":0.0,"systemTime":"1615802051904","satelliteTime":"0","distance":"27.25990","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.171351,"lat":40.1991950974,"lon":116.7355834345,"alt":0.0,"systemTime":"1615802182317","satelliteTime":"0","distance":"23.27091","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":8,"heading":0.0,"speed":4.162639,"lat":40.199278146,"lon":116.7358632981,"alt":0.0,"systemTime":"1615802118155","satelliteTime":"0","distance":"46.07511","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.421367,"lat":40.1992398879,"lon":116.7356047083,"alt":0.0,"systemTime":"1615802258750","satelliteTime":"0","distance":"24.10630","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.226784,"lat":40.1991576846,"lon":116.7356201776,"alt":0.0,"systemTime":"1615802051981","satelliteTime":"0","distance":"27.65978","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.153336,"lat":40.1991951342,"lon":116.735589591,"alt":0.0,"systemTime":"1615802182394","satelliteTime":"0","distance":"23.77006","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":8,"heading":0.0,"speed":2.840005,"lat":40.1992786586,"lon":116.735863501,"alt":0.0,"systemTime":"1615802118342","satelliteTime":"0","distance":"46.09526","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.69259,"lat":40.1992402221,"lon":116.7355898673,"alt":0.0,"systemTime":"1615802258823","satelliteTime":"0","distance":"22.84557","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.037928,"lat":40.1991582271,"lon":116.7356243718,"alt":0.0,"systemTime":"1615802052056","satelliteTime":"0","distance":"27.96306","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.237472,"lat":40.1991948799,"lon":116.7355955536,"alt":0.0,"systemTime":"1615802182467","satelliteTime":"0","distance":"24.26368","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":8,"heading":0.0,"speed":1.647377,"lat":40.1992790599,"lon":116.7358606085,"alt":0.0,"systemTime":"1615802118416","satelliteTime":"0","distance":"45.85200","driveIn":false,"driveOut":true},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.941518,"lat":40.1992400572,"lon":116.7355858555,"alt":0.0,"systemTime":"1615802258896","satelliteTime":"0","distance":"22.50721","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.792672,"lat":40.1991586043,"lon":116.7356292168,"alt":0.0,"systemTime":"1615802052161","satelliteTime":"0","distance":"28.32586","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.241449,"lat":40.1991948029,"lon":116.7356008635,"alt":0.0,"systemTime":"1615802182542","satelliteTime":"0","distance":"24.69905","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":0.999643,"lat":40.1992799151,"lon":116.7358655423,"alt":0.0,"systemTime":"1615802118492","satelliteTime":"0","distance":"46.27602","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.793724,"lat":40.1992403587,"lon":116.7355763838,"alt":0.0,"systemTime":"1615802258970","satelliteTime":"0","distance":"21.70195","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.998442,"lat":40.1991579436,"lon":116.735637641,"alt":0.0,"systemTime":"1615802052244","satelliteTime":"0","distance":"29.01544","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.276191,"lat":40.1991947212,"lon":116.7356068267,"alt":0.0,"systemTime":"1615802182747","satelliteTime":"0","distance":"25.18854","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":0.663719,"lat":40.1992795137,"lon":116.7358592749,"alt":0.0,"systemTime":"1615802118569","satelliteTime":"0","distance":"45.74148","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.628361,"lat":40.1992402818,"lon":116.7355692058,"alt":0.0,"systemTime":"1615802259046","satelliteTime":"0","distance":"21.09473","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.477113,"lat":40.1991571504,"lon":116.735643502,"alt":0.0,"systemTime":"1615802052365","satelliteTime":"0","distance":"29.51006","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.325596,"lat":40.1991945331,"lon":116.735613504,"alt":0.0,"systemTime":"1615802182830","satelliteTime":"0","distance":"25.74035","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":1.245314,"lat":40.1992792911,"lon":116.7358488223,"alt":0.0,"systemTime":"1615802118662","satelliteTime":"0","distance":"44.85271","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.386057,"lat":40.1992402943,"lon":116.7355600948,"alt":0.0,"systemTime":"1615802259230","satelliteTime":"0","distance":"20.32314","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.694839,"lat":40.199156636,"lon":116.7356489357,"alt":0.0,"systemTime":"1615802052441","satelliteTime":"0","distance":"29.95976","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.31123,"lat":40.1991943333,"lon":116.7356179439,"alt":0.0,"systemTime":"1615802182905","satelliteTime":"0","distance":"26.10988","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":2.262741,"lat":40.1992791818,"lon":116.7358458909,"alt":0.0,"systemTime":"1615802118860","satelliteTime":"0","distance":"44.60317","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.633321,"lat":40.1992402664,"lon":116.7355531039,"alt":0.0,"systemTime":"1615802259303","satelliteTime":"0","distance":"19.73166","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.611957,"lat":40.1991559809,"lon":116.7356558043,"alt":0.0,"systemTime":"1615802052575","satelliteTime":"0","distance":"30.52908","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.24476,"lat":40.1991944342,"lon":116.7356240746,"alt":0.0,"systemTime":"1615802182982","satelliteTime":"0","distance":"26.60950","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":2.953721,"lat":40.1992799544,"lon":116.7358447571,"alt":0.0,"systemTime":"1615802118934","satelliteTime":"0","distance":"44.51173","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.622197,"lat":40.1992401671,"lon":116.7355435611,"alt":0.0,"systemTime":"1615802259372","satelliteTime":"0","distance":"18.92524","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.511434,"lat":40.1991558754,"lon":116.735662246,"alt":0.0,"systemTime":"1615802052654","satelliteTime":"0","distance":"31.04305","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.129088,"lat":40.1991945356,"lon":116.7356293619,"alt":0.0,"systemTime":"1615802183065","satelliteTime":"0","distance":"27.04063","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.127559,"lat":40.1992802176,"lon":116.7358350352,"alt":0.0,"systemTime":"1615802119012","satelliteTime":"0","distance":"43.68819","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.643083,"lat":40.1992402051,"lon":116.7355365938,"alt":0.0,"systemTime":"1615802259444","satelliteTime":"0","distance":"18.33548","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.805402,"lat":40.1991552353,"lon":116.7356703068,"alt":0.0,"systemTime":"1615802052772","satelliteTime":"0","distance":"31.70801","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.30228,"lat":40.1991942085,"lon":116.7356370333,"alt":0.0,"systemTime":"1615802183140","satelliteTime":"0","distance":"27.68053","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.286891,"lat":40.1992801525,"lon":116.7358255437,"alt":0.0,"systemTime":"1615802119089","satelliteTime":"0","distance":"42.88214","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.40361,"lat":40.1992401712,"lon":116.735529994,"alt":0.0,"systemTime":"1615802259649","satelliteTime":"0","distance":"17.77781","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.915542,"lat":40.1991557627,"lon":116.7356758082,"alt":0.0,"systemTime":"1615802052854","satelliteTime":"0","distance":"32.12452","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.513479,"lat":40.1991943051,"lon":116.7356421653,"alt":0.0,"systemTime":"1615802183327","satelliteTime":"0","distance":"28.10019","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":4.120306,"lat":40.199279515,"lon":116.7358174636,"alt":0.0,"systemTime":"1615802119167","satelliteTime":"0","distance":"42.19212","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.077891,"lat":40.1992402244,"lon":116.7355235069,"alt":0.0,"systemTime":"1615802259720","satelliteTime":"0","distance":"17.22884","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.399828,"lat":40.1991570232,"lon":116.7356778401,"alt":0.0,"systemTime":"1615802052975","satelliteTime":"0","distance":"32.23751","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.644802,"lat":40.1991941758,"lon":116.7356498443,"alt":0.0,"systemTime":"1615802183405","satelliteTime":"0","distance":"28.73649","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":4.357308,"lat":40.1992789976,"lon":116.7358121803,"alt":0.0,"systemTime":"1615802119365","satelliteTime":"0","distance":"41.74030","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.011987,"lat":40.1992402835,"lon":116.7355141819,"alt":0.0,"systemTime":"1615802259796","satelliteTime":"0","distance":"16.44022","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.72872,"lat":40.1991576327,"lon":116.735682825,"alt":0.0,"systemTime":"1615802053049","satelliteTime":"0","distance":"32.61240","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.493815,"lat":40.1991946095,"lon":116.7356535221,"alt":0.0,"systemTime":"1615802183482","satelliteTime":"0","distance":"29.02821","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.669352,"lat":40.1992790521,"lon":116.7358096916,"alt":0.0,"systemTime":"1615802119439","satelliteTime":"0","distance":"41.52941","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.32773,"lat":40.1992402438,"lon":116.7355065977,"alt":0.0,"systemTime":"1615802259878","satelliteTime":"0","distance":"15.80031","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.274866,"lat":40.1991582446,"lon":116.7356864519,"alt":0.0,"systemTime":"1615802053177","satelliteTime":"0","distance":"32.87971","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.169951,"lat":40.1991949346,"lon":116.7356591704,"alt":0.0,"systemTime":"1615802183558","satelliteTime":"0","distance":"29.48612","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":2.584403,"lat":40.1992793633,"lon":116.7358060875,"alt":0.0,"systemTime":"1615802119520","satelliteTime":"0","distance":"41.22556","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.698614,"lat":40.1992401773,"lon":116.7354971698,"alt":0.0,"systemTime":"1615802259952","satelliteTime":"0","distance":"15.00567","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.703485,"lat":40.1991562036,"lon":116.735698808,"alt":0.0,"systemTime":"1615802053258","satelliteTime":"0","distance":"33.94599","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":2.918437,"lat":40.1991946981,"lon":116.7356636703,"alt":0.0,"systemTime":"1615802183737","satelliteTime":"0","distance":"29.86426","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":2.225735,"lat":40.1992795693,"lon":116.7357965161,"alt":0.0,"systemTime":"1615802119598","satelliteTime":"0","distance":"40.41463","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.810998,"lat":40.199240297,"lon":116.7354895955,"alt":0.0,"systemTime":"1615802260160","satelliteTime":"0","distance":"14.36529","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.643549,"lat":40.1991560494,"lon":116.7357035949,"alt":0.0,"systemTime":"1615802053382","satelliteTime":"0","distance":"34.33592","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":2.962875,"lat":40.199195142,"lon":116.7356710014,"alt":0.0,"systemTime":"1615802183807","satelliteTime":"0","distance":"30.45956","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":2.832566,"lat":40.1992797683,"lon":116.7357873094,"alt":0.0,"systemTime":"1615802119675","satelliteTime":"0","distance":"39.63474","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.787498,"lat":40.1992400482,"lon":116.7354805102,"alt":0.0,"systemTime":"1615802260242","satelliteTime":"0","distance":"13.60369","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":4.016298,"lat":40.1991570187,"lon":116.7357067635,"alt":0.0,"systemTime":"1615802053461","satelliteTime":"0","distance":"34.55558","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.224998,"lat":40.1991951322,"lon":116.7356758104,"alt":0.0,"systemTime":"1615802183882","satelliteTime":"0","distance":"30.85817","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.659139,"lat":40.1992796698,"lon":116.7357816559,"alt":0.0,"systemTime":"1615802119755","satelliteTime":"0","distance":"39.15432","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.710055,"lat":40.199240007,"lon":116.7354734071,"alt":0.0,"systemTime":"1615802260322","satelliteTime":"0","distance":"13.00667","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.775972,"lat":40.1991568593,"lon":116.7357134195,"alt":0.0,"systemTime":"1615802053574","satelliteTime":"0","distance":"35.09735","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.459951,"lat":40.1991943953,"lon":116.7356835994,"alt":0.0,"systemTime":"1615802183958","satelliteTime":"0","distance":"31.52207","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.599107,"lat":40.1992795248,"lon":116.7357782983,"alt":0.0,"systemTime":"1615802119917","satelliteTime":"0","distance":"38.86838","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.700326,"lat":40.1992403527,"lon":116.7354636156,"alt":0.0,"systemTime":"1615802260401","satelliteTime":"0","distance":"12.17782","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.16311,"lat":40.1991579146,"lon":116.7357175953,"alt":0.0,"systemTime":"1615802053648","satelliteTime":"0","distance":"35.39727","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.427513,"lat":40.1991943792,"lon":116.7356872588,"alt":0.0,"systemTime":"1615802184131","satelliteTime":"0","distance":"31.82594","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.590058,"lat":40.1992793401,"lon":116.7357675394,"alt":0.0,"systemTime":"1615802119997","satelliteTime":"0","distance":"37.95417","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.784769,"lat":40.1992406815,"lon":116.735455875,"alt":0.0,"systemTime":"1615802260475","satelliteTime":"0","distance":"11.52207","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.556938,"lat":40.199158625,"lon":116.7357192674,"alt":0.0,"systemTime":"1615802053764","satelliteTime":"0","distance":"35.50783","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":2.979728,"lat":40.1991947275,"lon":116.7356910003,"alt":0.0,"systemTime":"1615802184203","satelliteTime":"0","distance":"32.12794","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":4.087134,"lat":40.1992789313,"lon":116.735758191,"alt":0.0,"systemTime":"1615802120076","satelliteTime":"0","distance":"37.15803","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":7,"heading":0.0,"speed":4.773538,"lat":40.1992409209,"lon":116.7354475587,"alt":0.0,"systemTime":"1615802260551","satelliteTime":"0","distance":"10.82012","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.537513,"lat":40.1991579636,"lon":116.7357272712,"alt":0.0,"systemTime":"1615802053844","satelliteTime":"0","distance":"36.17808","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":2.357381,"lat":40.199194841,"lon":116.7356932768,"alt":0.0,"systemTime":"1615802184284","satelliteTime":"0","distance":"32.31424","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":4.811716,"lat":40.1992791683,"lon":116.7357542908,"alt":0.0,"systemTime":"1615802120154","satelliteTime":"0","distance":"36.82886","driveIn":true,"driveOut":false},{"uuid":"949","carId":"0","type":"3","color":"0","inOutFlag":4,"heading":0.0,"speed":4.615699,"lat":40.1992408736,"lon":116.7354406484,"alt":0.0,"systemTime":"1615802260740","satelliteTime":"0","distance":"10.24227","driveIn":false,"driveOut":true},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.517359,"lat":40.1991584653,"lon":116.7357299471,"alt":0.0,"systemTime":"1615802053975","satelliteTime":"0","distance":"36.37789","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":2.182996,"lat":40.1991941699,"lon":116.7357042218,"alt":0.0,"systemTime":"1615802184363","satelliteTime":"0","distance":"33.23941","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":4.58601,"lat":40.1992794462,"lon":116.735751443,"alt":0.0,"systemTime":"1615802120358","satelliteTime":"0","distance":"36.58935","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.06026,"lat":40.1991578475,"lon":116.735739305,"alt":0.0,"systemTime":"1615802054056","satelliteTime":"0","distance":"37.15757","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":2.902358,"lat":40.1991945269,"lon":116.7357082993,"alt":0.0,"systemTime":"1615802184563","satelliteTime":"0","distance":"33.57009","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.672491,"lat":40.199279632,"lon":116.7357438557,"alt":0.0,"systemTime":"1615802120431","satelliteTime":"0","distance":"35.94716","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.626374,"lat":40.1991567429,"lon":116.7357491169,"alt":0.0,"systemTime":"1615802054165","satelliteTime":"0","distance":"37.99085","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.200551,"lat":40.1991952698,"lon":116.735713313,"alt":0.0,"systemTime":"1615802184638","satelliteTime":"0","distance":"33.97032","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.442311,"lat":40.1992790602,"lon":116.735737202,"alt":0.0,"systemTime":"1615802120504","satelliteTime":"0","distance":"35.37838","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":4.317677,"lat":40.1991565286,"lon":116.7357572212,"alt":0.0,"systemTime":"1615802054242","satelliteTime":"0","distance":"38.65684","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.179831,"lat":40.1991957711,"lon":116.7357175831,"alt":0.0,"systemTime":"1615802184714","satelliteTime":"0","distance":"34.31474","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":4.123498,"lat":40.199279384,"lon":116.7357249141,"alt":0.0,"systemTime":"1615802120590","satelliteTime":"0","distance":"34.33871","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":4.437632,"lat":40.1991565626,"lon":116.7357624193,"alt":0.0,"systemTime":"1615802054377","satelliteTime":"0","distance":"39.07896","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":2.656279,"lat":40.1991954964,"lon":116.7357227947,"alt":0.0,"systemTime":"1615802184796","satelliteTime":"0","distance":"34.75512","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":4.944893,"lat":40.1992790543,"lon":116.7357180548,"alt":0.0,"systemTime":"1615802120681","satelliteTime":"0","distance":"33.75436","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":4.152788,"lat":40.1991573606,"lon":116.7357698276,"alt":0.0,"systemTime":"1615802054455","satelliteTime":"0","distance":"39.65784","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.23597,"lat":40.1991935909,"lon":116.7357326558,"alt":0.0,"systemTime":"1615802184877","satelliteTime":"0","distance":"35.61899","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":5.0563,"lat":40.1992793154,"lon":116.7357132032,"alt":0.0,"systemTime":"1615802120764","satelliteTime":"0","distance":"33.34506","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.573127,"lat":40.1991578003,"lon":116.7357741717,"alt":0.0,"systemTime":"1615802054562","satelliteTime":"0","distance":"39.99897","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.640305,"lat":40.1991942363,"lon":116.7357364005,"alt":0.0,"systemTime":"1615802184959","satelliteTime":"0","distance":"35.91700","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":4.330799,"lat":40.1992792432,"lon":116.7357067926,"alt":0.0,"systemTime":"1615802120945","satelliteTime":"0","distance":"32.80090","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.587479,"lat":40.1991569306,"lon":116.7357832722,"alt":0.0,"systemTime":"1615802054644","satelliteTime":"0","distance":"40.76952","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":3.557845,"lat":40.199195183,"lon":116.735735494,"alt":0.0,"systemTime":"1615802185163","satelliteTime":"0","distance":"35.82095","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.994465,"lat":40.199279381,"lon":116.7356976163,"alt":0.0,"systemTime":"1615802121022","satelliteTime":"0","distance":"32.02410","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":4.142085,"lat":40.1991556391,"lon":116.7357975925,"alt":0.0,"systemTime":"1615802054764","satelliteTime":"0","distance":"41.98042","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":2.590332,"lat":40.1991955653,"lon":116.7357411941,"alt":0.0,"systemTime":"1615802185239","satelliteTime":"0","distance":"36.28857","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.81858,"lat":40.199279627,"lon":116.7356932344,"alt":0.0,"systemTime":"1615802121099","satelliteTime":"0","distance":"31.65479","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":5.118244,"lat":40.1991544035,"lon":116.7358089282,"alt":0.0,"systemTime":"1615802054846","satelliteTime":"0","distance":"42.94587","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":2.199256,"lat":40.1991952769,"lon":116.7357450592,"alt":0.0,"systemTime":"1615802185320","satelliteTime":"0","distance":"36.61736","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.900847,"lat":40.1992804946,"lon":116.7356855685,"alt":0.0,"systemTime":"1615802121181","satelliteTime":"0","distance":"31.01298","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":5.55582,"lat":40.199153539,"lon":116.7358154705,"alt":0.0,"systemTime":"1615802054964","satelliteTime":"0","distance":"43.50771","driveIn":false,"driveOut":true},{"uuid":"859","carId":"0","type":"3","color":"0","inOutFlag":6,"heading":0.0,"speed":2.218443,"lat":40.1991955315,"lon":116.7357500105,"alt":0.0,"systemTime":"1615802185405","satelliteTime":"0","distance":"37.02564","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.617652,"lat":40.1992804511,"lon":116.7356806913,"alt":0.0,"systemTime":"1615802121285","satelliteTime":"0","distance":"30.59935","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":4.969211,"lat":40.1991538807,"lon":116.7358154332,"alt":0.0,"systemTime":"1615802055047","satelliteTime":"0","distance":"43.49458","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.563988,"lat":40.1992802179,"lon":116.7356725741,"alt":0.0,"systemTime":"1615802121383","satelliteTime":"0","distance":"29.90947","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.904251,"lat":40.1991523158,"lon":116.735826276,"alt":0.0,"systemTime":"1615802055163","satelliteTime":"0","distance":"44.42982","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.686164,"lat":40.199279808,"lon":116.7356672887,"alt":0.0,"systemTime":"1615802121558","satelliteTime":"0","distance":"29.45782","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.484671,"lat":40.1991526147,"lon":116.7358289791,"alt":0.0,"systemTime":"1615802055254","satelliteTime":"0","distance":"44.64292","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.938946,"lat":40.1992796742,"lon":116.7356573255,"alt":0.0,"systemTime":"1615802121639","satelliteTime":"0","distance":"28.61257","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.244963,"lat":40.1991518658,"lon":116.7358360355,"alt":0.0,"systemTime":"1615802055393","satelliteTime":"0","distance":"45.24395","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.985659,"lat":40.199279895,"lon":116.7356537953,"alt":0.0,"systemTime":"1615802121712","satelliteTime":"0","distance":"28.31575","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.572601,"lat":40.1991512749,"lon":116.7358432634,"alt":0.0,"systemTime":"1615802055472","satelliteTime":"0","distance":"45.85466","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.872353,"lat":40.1992796948,"lon":116.7356450959,"alt":0.0,"systemTime":"1615802121792","satelliteTime":"0","distance":"27.57707","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.537741,"lat":40.1991506081,"lon":116.7358492109,"alt":0.0,"systemTime":"1615802055550","satelliteTime":"0","distance":"46.36247","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.877197,"lat":40.1992797071,"lon":116.7356384808,"alt":0.0,"systemTime":"1615802121875","satelliteTime":"0","distance":"27.01711","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":3.387744,"lat":40.1991522948,"lon":116.7358460624,"alt":0.0,"systemTime":"1615802055648","satelliteTime":"0","distance":"46.05576","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":3.969447,"lat":40.1992800247,"lon":116.735630632,"alt":0.0,"systemTime":"1615802121952","satelliteTime":"0","distance":"26.35609","driveIn":true,"driveOut":false},{"uuid":"643","carId":"0","type":"3","color":"0","inOutFlag":2,"heading":0.0,"speed":2.488923,"lat":40.1991533725,"lon":116.7358459409,"alt":0.0,"systemTime":"1615802055742","satelliteTime":"0","distance":"46.01549","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":5,"heading":0.0,"speed":4.22635,"lat":40.1992798694,"lon":116.7356235334,"alt":0.0,"systemTime":"1615802122149","satelliteTime":"0","distance":"25.75370","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":8,"heading":0.0,"speed":4.183265,"lat":40.19927966,"lon":116.7356157793,"alt":0.0,"systemTime":"1615802122223","satelliteTime":"0","distance":"25.09532","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":8,"heading":0.0,"speed":4.074504,"lat":40.199279581,"lon":116.7356102196,"alt":0.0,"systemTime":"1615802122295","satelliteTime":"0","distance":"24.62410","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":8,"heading":0.0,"speed":3.973487,"lat":40.1992799455,"lon":116.7356019047,"alt":0.0,"systemTime":"1615802122372","satelliteTime":"0","distance":"23.92511","driveIn":false,"driveOut":true}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":1,"heading":0.0,"speed":3.989798,"lat":40.1992800214,"lon":116.7355951976,"alt":0.0,"systemTime":"1615802122477","satelliteTime":"0","distance":"23.35903","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":1,"heading":0.0,"speed":4.230833,"lat":40.1992799853,"lon":116.7355860343,"alt":0.0,"systemTime":"1615802122553","satelliteTime":"0","distance":"22.58424","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":1,"heading":0.0,"speed":4.494411,"lat":40.1992800352,"lon":116.735578528,"alt":0.0,"systemTime":"1615802122759","satelliteTime":"0","distance":"21.95080","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":1,"heading":0.0,"speed":4.527164,"lat":40.1992797832,"lon":116.7355706568,"alt":0.0,"systemTime":"1615802122839","satelliteTime":"0","distance":"21.28286","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":1,"heading":0.0,"speed":4.376662,"lat":40.1992798646,"lon":116.7355642523,"alt":0.0,"systemTime":"1615802122910","satelliteTime":"0","distance":"20.74332","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.249522,"lat":40.1992799562,"lon":116.7355553346,"alt":0.0,"systemTime":"1615802122985","satelliteTime":"0","distance":"19.99221","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.150593,"lat":40.1992801342,"lon":116.7355499241,"alt":0.0,"systemTime":"1615802123075","satelliteTime":"0","distance":"19.53855","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.019808,"lat":40.1992800419,"lon":116.735542442,"alt":0.0,"systemTime":"1615802123156","satelliteTime":"0","distance":"18.90663","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":3.769295,"lat":40.1992800439,"lon":116.7355372524,"alt":0.0,"systemTime":"1615802123329","satelliteTime":"0","distance":"18.46951","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":3.664146,"lat":40.1992799942,"lon":116.7355292226,"alt":0.0,"systemTime":"1615802123406","satelliteTime":"0","distance":"17.79273","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":3.982035,"lat":40.1992799562,"lon":116.7355209949,"alt":0.0,"systemTime":"1615802123482","satelliteTime":"0","distance":"17.09997","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.412724,"lat":40.1992798039,"lon":116.7355119934,"alt":0.0,"systemTime":"1615802123566","satelliteTime":"0","distance":"16.34082","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.630624,"lat":40.1992796496,"lon":116.7355054741,"alt":0.0,"systemTime":"1615802123665","satelliteTime":"0","distance":"15.79063","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.539972,"lat":40.1992799876,"lon":116.7354966969,"alt":0.0,"systemTime":"1615802123753","satelliteTime":"0","distance":"15.06050","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.444885,"lat":40.1992800832,"lon":116.7354892595,"alt":0.0,"systemTime":"1615802123921","satelliteTime":"0","distance":"14.43942","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.430207,"lat":40.1992800748,"lon":116.7354813266,"alt":0.0,"systemTime":"1615802123998","satelliteTime":"0","distance":"13.77584","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.516784,"lat":40.1992798122,"lon":116.7354730486,"alt":0.0,"systemTime":"1615802124085","satelliteTime":"0","distance":"13.07911","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.629067,"lat":40.1992799876,"lon":116.735463914,"alt":0.0,"systemTime":"1615802124173","satelliteTime":"0","distance":"12.32186","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.639268,"lat":40.1992803948,"lon":116.7354575887,"alt":0.0,"systemTime":"1615802124259","satelliteTime":"0","distance":"11.80592","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.524597,"lat":40.1992803096,"lon":116.7354489189,"alt":0.0,"systemTime":"1615802124428","satelliteTime":"0","distance":"11.08557","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.408017,"lat":40.1992801134,"lon":116.7354414139,"alt":0.0,"systemTime":"1615802124505","satelliteTime":"0","distance":"10.46056","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.376606,"lat":40.1992803019,"lon":116.7354337727,"alt":0.0,"systemTime":"1615802124585","satelliteTime":"0","distance":"9.837222","driveIn":true,"driveOut":false}]
[{"uuid":"789","carId":"0","type":"1","color":"0","inOutFlag":3,"heading":0.0,"speed":4.208932,"lat":40.1992804239,"lon":116.735428194,"alt":0.0,"systemTime":"1615802124673","satelliteTime":"0","distance":"9.383926","driveIn":true,"driveOut":false}]

File diff suppressed because one or more lines are too long

View File

@@ -1,21 +0,0 @@
package com.mogo.module.service;
import android.content.Context;
import com.mogo.module.service.marker.MapMarkerManager;
/**
* author : donghongyu
* e-mail : 1358506549@qq.com
* date : 2020-01-0718:54
* desc : 持有服务接口实例
* version: 1.0
*/
public class MarkerServiceHandler {
private static final String TAG = "MarkerServiceHandler";
public static synchronized void init(final Context context) {
MapMarkerManager.getInstance().init(context);
}
}

View File

@@ -1,168 +0,0 @@
package com.mogo.module.service.marker;
import android.content.Context;
import android.graphics.Rect;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.debug.DebugConfig;
import com.mogo.commons.module.status.MogoStatusManager;
import com.mogo.eagle.core.data.map.MogoLatLng;
import com.mogo.eagle.core.data.map.MogoLocation;
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager;
import com.mogo.eagle.core.utilcode.mogo.toast.ResourcesHelper;
import com.mogo.eagle.core.utilcode.util.ThreadPoolService;
import com.mogo.eagle.core.utilcode.util.UiThreadHandler;
import com.mogo.map.MogoMapUIController;
import com.mogo.map.MogoMarkerManager;
import com.mogo.module.common.ModuleNames;
import com.mogo.module.common.entity.MarkerCardResult;
import com.mogo.module.common.entity.MarkerResponse;
import com.mogo.eagle.core.data.config.CloudPoiManager;
import com.mogo.module.service.R;
import com.mogo.module.service.network.RefreshModel;
/**
* author : donghongyu
* e-mail : 1358506549@qq.com
* date : 2020-02-1010:44
* desc : 大而全的Marker管理
* version: 1.0
*/
public class MapMarkerManager {
private static final String TAG = "MapMarkerManager";
private Context mContext;
private static MapMarkerManager mMarkerManager;
private RefreshModel mRefreshModel;
// 平滑移动事件间隔(单位:秒)
private static final int SMOOTH_DURATION = 15;
public static final int ONLINE_SEARCH_LIMIT = 20;
public static final int ONLINE_SEARCH_RADIUS = 2_000;
private Rect mMarkerDisplayBounds;
private MapMarkerManager() {
}
public static synchronized MapMarkerManager getInstance() {
synchronized (MapMarkerManager.class) {
if (mMarkerManager == null) {
mMarkerManager = new MapMarkerManager();
}
}
return mMarkerManager;
}
/**
* 初始化大而全的 Marker 管理
*
* @param context 上下文对象
*/
public void init(Context context) {
if (mContext != null) {
return;
}
mContext = context.getApplicationContext();
mRefreshModel = new RefreshModel(mContext);
CloudPoiManager.getInstance().updateFromConfig(context);
}
private final Runnable runnable = () -> {
MogoLocation location = CallerMapLocationListenerManager.INSTANCE.getCurrentLocation();
if (location != null) {
MogoLatLng mogoLatLng = new MogoLatLng(location.getLatitude(), location.getLongitude());
getOnlineCarDataImpl(mogoLatLng, false, false, ONLINE_SEARCH_LIMIT, ONLINE_SEARCH_RADIUS);
}
};
/**
* 搜索在线车辆
*
* @param latLng 搜索中心点
* @param onlyFocus 是否关注
* @param onlySameCity 是否是相同城市
* @param limit 条数限制
* @param radius 搜索半径
* @param fitBounds 是否显示在可视范围内
*/
private void getOnlineCarDataImpl(
MogoLatLng latLng,
boolean onlyFocus,
boolean onlySameCity,
int limit,
int radius) {
if (DebugConfig.isDebug()) {
if (!DebugConfig.isRequestOnlineCarData()) {
return;
}
}
if (latLng == null) {
return;
}
if (ignoreOnlineCarRequest()) {
removeCarMarkers();
return;
}
mRefreshModel.queryOnLineCarWithRoute(latLng, onlyFocus, onlySameCity, radius, limit, false, o -> {
MarkerResponse data = (MarkerResponse) o;
MarkerCardResult result = data.getResult();
if (result == null) {
return;
}
if (mMarkerDisplayBounds == null) {
mMarkerDisplayBounds = new Rect(
ResourcesHelper.getDimensionPixelSize(AbsMogoApplication.getApp(), R.dimen.module_service_marker_bounds_leftMargin),
ResourcesHelper.getDimensionPixelSize(AbsMogoApplication.getApp(), R.dimen.module_service_marker_bounds_topMargin),
ResourcesHelper.getDimensionPixelSize(AbsMogoApplication.getApp(), R.dimen.module_service_marker_bounds_rightMargin),
ResourcesHelper.getDimensionPixelSize(AbsMogoApplication.getApp(), R.dimen.module_service_marker_bounds_bottomMargin)
);
}
runOnTargetThread(() -> {
UiThreadHandler.postDelayed(runnable, SMOOTH_DURATION * 1000);
});
});
}
/**
* 忽略在线车辆请求策略
*
* @return
*/
private boolean ignoreOnlineCarRequest() {
return ignoreDrawRequest() || MogoStatusManager.getInstance().isVrMode();
}
/**
* 移除在线车辆 marker
*/
private void removeCarMarkers() {
MogoMarkerManager.getInstance(mContext).removeMarkers(ModuleNames.CARD_TYPE_USER_DATA);
}
/**
* 以下条件,不绘制 marker
*
* @return
*/
private boolean ignoreDrawRequest() {
return MogoStatusManager.getInstance().isV2XShow()
|| !MogoStatusManager.getInstance().isMainPageLaunched()
|| !MogoStatusManager.getInstance().isMainPageOnResume()
|| MogoMapUIController.getInstance().getCurrentMapVisualAngle().isLongSight();
}
private void runOnTargetThread(Runnable runnable) {
if (runnable == null) {
return;
}
ThreadPoolService.execute(runnable);
}
}

View File

@@ -1,27 +0,0 @@
package com.mogo.module.service.network;
import com.mogo.module.common.entity.MarkerResponse;
import java.util.Map;
import io.reactivex.Observable;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
/**
* @author congtaowang
* @since 2020-01-03
* <p>
* 接口描述
*/
public interface RefreshApiService {
/**
* 周边在线车辆
*/
@FormUrlEncoded
@POST("/yycp-launcherSnapshot/user/queryOnLineCarWithRoute")
Observable<MarkerResponse> queryOnLineCarWithRoute(@FieldMap Map<String, Object> parameters);
}

View File

@@ -1,35 +0,0 @@
package com.mogo.module.service.network;
import java.util.ArrayList;
import java.util.List;
/**
* @author congtaowang
* @since 2020-01-06
* <p>
* 刷新地图信息接口
*/
public class RefreshBody {
public List<String> dataType = new ArrayList<>(); // 要查询的类型
public int limit = 50; // 请求数量
public int radius = 2_000; // 地理围栏半径(米)
public LatLon location; // 坐标
public String sn;
public boolean onlyFocus; // 是否仅查询已关注的好友
public boolean onlySameCity; // 是否仅查询注册城市相同的同城用户
public boolean viewPush; // 是否走V2X通道 true-401011false -401001
public boolean onlyRealUser;
public static class LatLon {
private double lat;
private double lon;
public LatLon(double lat, double lon) {
this.lat = lat;
this.lon = lon;
}
}
}

View File

@@ -1,14 +0,0 @@
package com.mogo.module.service.network;
/**
* @author congtaowang
* @since 2020-01-03
* <p>
* 刷新回调
*/
public interface RefreshCallback <T> {
void onSuccess(T o);
default void onFail(){}
}

View File

@@ -1,103 +0,0 @@
package com.mogo.module.service.network;
import android.content.Context;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
import com.mogo.commons.network.ParamsProvider;
import com.mogo.eagle.core.data.map.MogoLatLng;
import com.mogo.eagle.core.network.MoGoRetrofitFactory;
import com.mogo.eagle.core.network.RequestOptions;
import com.mogo.eagle.core.network.SubscribeImpl;
import com.mogo.eagle.core.network.utils.GsonUtil;
import com.mogo.eagle.core.data.constants.HostConst;
import com.mogo.module.common.entity.MarkerResponse;
import java.util.Map;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* @author congtaowang
* @since 2020-01-03
* <p>
* 刷新数据
*/
public class RefreshModel {
private static final String TAG = "RefreshModel";
private final Context mContext;
private final RefreshApiService mRefreshApiService;
public static final String CARD_TYPE_USER_DATA = "CARD_TYPE_USER_DATA";
public RefreshModel(Context context) {
this.mContext = context;
this.mRefreshApiService = MoGoRetrofitFactory.getInstance(HostConst.LAUNCHER_SNAPSHOT_HOST).create(RefreshApiService.class);
}
/**
* 查询车辆 及路线
*
* @param latLng 经纬度
* @param onlyFocus 是否仅查询已关注的好友
* @param onlySameCity 是否仅查询注册城市相同的同城用户
* @param callback
* @param onlyRealUser 是否只查询真实用户
*/
public void queryOnLineCarWithRoute(MogoLatLng latLng,
boolean onlyFocus,
boolean onlySameCity,
int radius,
int limit,
boolean onlyRealUser,
final RefreshCallback callback) {
if (mRefreshApiService != null) {
final Map<String, Object> query = new ParamsProvider.Builder(mContext).build();
final RefreshBody refreshBody = new RefreshBody();
refreshBody.sn = MoGoAiCloudClientConfig.getInstance().getSn();
if (limit > 0) {
refreshBody.limit = limit;
}
refreshBody.radius = radius;
refreshBody.location = new RefreshBody.LatLon(latLng.lat, latLng.lon);
refreshBody.onlyFocus = onlyFocus;
refreshBody.onlySameCity = onlySameCity;
refreshBody.onlyRealUser = onlyRealUser;
refreshBody.dataType.add(CARD_TYPE_USER_DATA);
query.put("data", GsonUtil.jsonFromObject(refreshBody));
mRefreshApiService.queryOnLineCarWithRoute(query)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<MarkerResponse>(RequestOptions.create(mContext)) {
@Override
public void onSuccess(MarkerResponse o) {
super.onSuccess(o);
if (callback != null) {
callback.onSuccess(o);
}
}
@Override
public void onError(Throwable e) {
super.onError(e);
if (callback != null) {
callback.onFail();
}
}
@Override
public void onError(String message, int code) {
super.onError(message, code);
if (callback != null) {
callback.onFail();
}
}
});
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 714 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 455 B

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:angle="270"
android:endColor="#256BFF"
android:startColor="#5CC1FF" />
<corners android:radius="360dp" />
<padding
android:bottom="@dimen/dp_6"
android:left="@dimen/dp_6"
android:right="@dimen/dp_40"
android:top="@dimen/dp_6" />
</shape >

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:angle="270"
android:endColor="#3834FF"
android:startColor="#5985FF" />
<corners android:radius="360dp" />
<padding
android:bottom="@dimen/dp_6"
android:left="@dimen/dp_6"
android:right="@dimen/dp_40"
android:top="@dimen/dp_6" />
</shape >

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:angle="270"
android:endColor="#24A2C2"
android:startColor="#29F9B2" />
<corners android:radius="360dp" />
<padding
android:bottom="@dimen/dp_6"
android:left="@dimen/dp_6"
android:right="@dimen/dp_40"
android:top="@dimen/dp_6" />
</shape >

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:angle="270"
android:endColor="#36B565"
android:startColor="#5ADFB2" />
<corners android:radius="360dp" />
<padding
android:bottom="@dimen/dp_6"
android:left="@dimen/dp_6"
android:right="@dimen/dp_40"
android:top="@dimen/dp_6" />
</shape >

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:angle="90"
android:endColor="#B5B5B5"
android:startColor="#4D4F64 " />
<corners android:radius="360dp" />
<padding
android:bottom="@dimen/dp_6"
android:left="@dimen/dp_6"
android:right="@dimen/dp_40"
android:top="@dimen/dp_6" />
</shape >

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:angle="270"
android:endColor="#FB801E"
android:startColor="#FFB977" />
<corners android:radius="360dp" />
<padding
android:bottom="@dimen/dp_6"
android:left="@dimen/dp_6"
android:right="@dimen/dp_40"
android:top="@dimen/dp_6" />
</shape >

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:angle="270"
android:endColor="#6828E8"
android:startColor="#C843FF" />
<corners android:radius="360dp" />
<padding
android:bottom="@dimen/dp_6"
android:left="@dimen/dp_6"
android:right="@dimen/dp_40"
android:top="@dimen/dp_6" />
</shape >

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:angle="270"
android:endColor="#E52E4D"
android:startColor="#FA6577" />
<corners android:radius="360dp" />
<padding
android:bottom="@dimen/dp_6"
android:left="@dimen/dp_6"
android:right="@dimen/dp_40"
android:top="@dimen/dp_6" />
</shape >

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:angle="0"
android:endColor="#FFCC00"
android:startColor="#FFA417" />
<corners android:radius="90dp" />
<padding
android:bottom="@dimen/dp_6"
android:left="@dimen/dp_6"
android:right="@dimen/dp_40"
android:top="@dimen/dp_6" />
</shape >

View File

@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/shape_id" >
<!-- 倒三角 -->
<rotate
android:fromDegrees="45"
android:pivotX="135%"
android:pivotY="15%"
android:toDegrees="45" >
<shape android:shape="rectangle" >
<size android:width="@dimen/dp_20"
android:height="@dimen/dp_20"/>
<solid android:color="#256BFF" />
</shape >
</rotate >
</item >
</layer-list >

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/shape_id" >
<!-- 倒三角 -->
<rotate
android:fromDegrees="45"
android:pivotX="135%"
android:pivotY="15%"
android:toDegrees="45" >
<shape android:shape="rectangle" >
<solid android:color="#3834FF" />
</shape >
</rotate >
</item >
</layer-list >

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/shape_id" >
<!-- 倒三角 -->
<rotate
android:fromDegrees="45"
android:pivotX="135%"
android:pivotY="15%"
android:toDegrees="45" >
<shape android:shape="rectangle" >
<solid android:color="#249CC4" />
</shape >
</rotate >
</item >
</layer-list >

View File

@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/shape_id" >
<!-- 倒三角 -->
<rotate
android:fromDegrees="45"
android:pivotX="135%"
android:pivotY="15%"
android:toDegrees="45" >
<shape android:shape="rectangle" >
<solid android:color="#36B565" />
</shape >
</rotate >
</item >
</layer-list >

View File

@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/shape_id" >
<!-- 倒三角 -->
<rotate
android:fromDegrees="45"
android:pivotX="135%"
android:pivotY="15%"
android:toDegrees="45" >
<shape android:shape="rectangle" >
<solid android:color="#FB801E" />
</shape >
</rotate >
</item >
</layer-list >

View File

@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/shape_id" >
<!-- 倒三角 -->
<rotate
android:fromDegrees="45"
android:pivotX="135%"
android:pivotY="15%"
android:toDegrees="45" >
<shape android:shape="rectangle" >
<solid android:color="#6828E8" />
</shape >
</rotate >
</item >
</layer-list >

Some files were not shown because too many files have changed in this diff Show More