diff --git a/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/map/AMapUtil.java b/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/map/AMapUtil.java
new file mode 100755
index 0000000000..45f188e363
--- /dev/null
+++ b/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/map/AMapUtil.java
@@ -0,0 +1,268 @@
+package com.mogo.tanlu.map;
+
+import android.text.Html;
+import android.text.Spanned;
+import android.widget.EditText;
+
+import com.amap.api.maps.model.LatLng;
+import com.amap.api.services.core.LatLonPoint;
+import com.amap.api.services.route.BusPath;
+import com.amap.api.services.route.BusStep;
+import com.amap.api.services.route.RouteBusLineItem;
+import com.amap.api.services.route.RouteRailwayItem;
+import com.mogo.tanlu.R;
+
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class AMapUtil {
+ /**
+ * 判断edittext是否null
+ */
+ public static String checkEditText(EditText editText) {
+ if (editText != null && editText.getText() != null
+ && !(editText.getText().toString().trim().equals(""))) {
+ return editText.getText().toString().trim();
+ } else {
+ return "";
+ }
+ }
+
+ public static Spanned stringToSpan(String src) {
+ return src == null ? null : Html.fromHtml(src.replace("\n", "
"));
+ }
+
+ public static String colorFont(String src, String color) {
+ StringBuffer strBuf = new StringBuffer();
+
+ strBuf.append("").append(src)
+ .append("");
+ return strBuf.toString();
+ }
+
+ public static String makeHtmlNewLine() {
+ return "
";
+ }
+
+ public static String makeHtmlSpace(int number) {
+ final String space = " ";
+ StringBuilder result = new StringBuilder();
+ for (int i = 0; i < number; i++) {
+ result.append(space);
+ }
+ return result.toString();
+ }
+
+ public static String getFriendlyLength(int lenMeter) {
+ if (lenMeter > 10000) // 10 km
+ {
+ int dis = lenMeter / 1000;
+ return dis + ChString.Kilometer;
+ }
+
+ if (lenMeter > 1000) {
+ float dis = (float) lenMeter / 1000;
+ DecimalFormat fnum = new DecimalFormat("##0.0");
+ String dstr = fnum.format(dis);
+ return dstr + ChString.Kilometer;
+ }
+
+ if (lenMeter > 100) {
+ int dis = lenMeter / 50 * 50;
+ return dis + ChString.Meter;
+ }
+
+ int dis = lenMeter / 10 * 10;
+ if (dis == 0) {
+ dis = 10;
+ }
+
+ return dis + ChString.Meter;
+ }
+
+ public static boolean IsEmptyOrNullString(String s) {
+ return (s == null) || (s.trim().length() == 0);
+ }
+
+ /**
+ * 把LatLng对象转化为LatLonPoint对象
+ */
+ public static LatLonPoint convertToLatLonPoint(LatLng latlon) {
+ return new LatLonPoint(latlon.latitude, latlon.longitude);
+ }
+
+ /**
+ * 把LatLonPoint对象转化为LatLon对象
+ */
+ public static LatLng convertToLatLng(LatLonPoint latLonPoint) {
+ return new LatLng(latLonPoint.getLatitude(), latLonPoint.getLongitude());
+ }
+
+ /**
+ * 把集合体的LatLonPoint转化为集合体的LatLng
+ */
+ public static ArrayList convertArrList(List shapes) {
+ ArrayList lineShapes = new ArrayList();
+ for (LatLonPoint point : shapes) {
+ LatLng latLngTemp = AMapUtil.convertToLatLng(point);
+ lineShapes.add(latLngTemp);
+ }
+ return lineShapes;
+ }
+
+ /**
+ * long类型时间格式化
+ */
+ public static String convertToTime(long time) {
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ Date date = new Date(time);
+ return df.format(date);
+ }
+
+ public static final String HtmlBlack = "#000000";
+ public static final String HtmlGray = "#808080";
+
+ public static String getFriendlyTime(int second) {
+ if (second > 3600) {
+ int hour = second / 3600;
+ int miniate = (second % 3600) / 60;
+ return hour + "小时" + miniate + "分钟";
+ }
+ if (second >= 60) {
+ int miniate = second / 60;
+ return miniate + "分钟";
+ }
+ return second + "秒";
+ }
+
+ //路径规划方向指示和图片对应
+ public static int getDriveActionID(String actionName) {
+ if (actionName == null || actionName.equals("")) {
+ return R.drawable.dir3;
+ }
+ if ("左转".equals(actionName)) {
+ return R.drawable.dir2;
+ }
+ if ("右转".equals(actionName)) {
+ return R.drawable.dir1;
+ }
+ if ("向左前方行驶".equals(actionName) || "靠左".equals(actionName)) {
+ return R.drawable.dir6;
+ }
+ if ("向右前方行驶".equals(actionName) || "靠右".equals(actionName)) {
+ return R.drawable.dir5;
+ }
+ if ("向左后方行驶".equals(actionName) || "左转调头".equals(actionName)) {
+ return R.drawable.dir7;
+ }
+ if ("向右后方行驶".equals(actionName)) {
+ return R.drawable.dir8;
+ }
+ if ("直行".equals(actionName)) {
+ return R.drawable.dir3;
+ }
+ if ("减速行驶".equals(actionName)) {
+ return R.drawable.dir4;
+ }
+ return R.drawable.dir3;
+ }
+
+ public static int getWalkActionID(String actionName) {
+ if (actionName == null || actionName.equals("")) {
+ return R.drawable.dir13;
+ }
+ if ("左转".equals(actionName)) {
+ return R.drawable.dir2;
+ }
+ if ("右转".equals(actionName)) {
+ return R.drawable.dir1;
+ }
+ if ("向左前方".equals(actionName) || "靠左".equals(actionName) || actionName.contains("向左前方")) {
+ return R.drawable.dir6;
+ }
+ if ("向右前方".equals(actionName) || "靠右".equals(actionName) || actionName.contains("向右前方")) {
+ return R.drawable.dir5;
+ }
+ if ("向左后方".equals(actionName) || actionName.contains("向左后方")) {
+ return R.drawable.dir7;
+ }
+ if ("向右后方".equals(actionName) || actionName.contains("向右后方")) {
+ return R.drawable.dir8;
+ }
+ if ("直行".equals(actionName)) {
+ return R.drawable.dir3;
+ }
+ if ("通过人行横道".equals(actionName)) {
+ return R.drawable.dir9;
+ }
+ if ("通过过街天桥".equals(actionName)) {
+ return R.drawable.dir11;
+ }
+ if ("通过地下通道".equals(actionName)) {
+ return R.drawable.dir10;
+ }
+
+ return R.drawable.dir13;
+ }
+
+ public static String getBusPathTitle(BusPath busPath) {
+ if (busPath == null) {
+ return String.valueOf("");
+ }
+ List busSetps = busPath.getSteps();
+ if (busSetps == null) {
+ return String.valueOf("");
+ }
+ StringBuffer sb = new StringBuffer();
+ for (BusStep busStep : busSetps) {
+ StringBuffer title = new StringBuffer();
+ if (busStep.getBusLines().size() > 0) {
+ for (RouteBusLineItem busline : busStep.getBusLines()) {
+ if (busline == null) {
+ continue;
+ }
+
+ String buslineName = getSimpleBusLineName(busline.getBusLineName());
+ title.append(buslineName);
+ title.append(" / ");
+ }
+// RouteBusLineItem busline = busStep.getBusLines().get(0);
+
+ sb.append(title.substring(0, title.length() - 3));
+ sb.append(" > ");
+ }
+ if (busStep.getRailway() != null) {
+ RouteRailwayItem railway = busStep.getRailway();
+ sb.append(railway.getTrip() + "(" + railway.getDeparturestop().getName()
+ + " - " + railway.getArrivalstop().getName() + ")");
+ sb.append(" > ");
+ }
+ }
+ return sb.substring(0, sb.length() - 3);
+ }
+
+ public static String getBusPathDes(BusPath busPath) {
+ if (busPath == null) {
+ return String.valueOf("");
+ }
+ long second = busPath.getDuration();
+ String time = getFriendlyTime((int) second);
+ float subDistance = busPath.getDistance();
+ String subDis = getFriendlyLength((int) subDistance);
+ float walkDistance = busPath.getWalkDistance();
+ String walkDis = getFriendlyLength((int) walkDistance);
+ return String.valueOf(time + " | " + subDis + " | 步行" + walkDis);
+ }
+
+ public static String getSimpleBusLineName(String busLineName) {
+ if (busLineName == null) {
+ return String.valueOf("");
+ }
+ return busLineName.replaceAll("\\(.*?\\)", "");
+ }
+
+
+}
diff --git a/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/map/ChString.java b/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/map/ChString.java
new file mode 100755
index 0000000000..8a1b3bc67c
--- /dev/null
+++ b/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/map/ChString.java
@@ -0,0 +1,26 @@
+package com.mogo.tanlu.map;
+
+public class ChString {
+ public static final String Kilometer = "\u516c\u91cc";// "公里";
+ public static final String Meter = "\u7c73";// "米";
+ public static final String ByFoot = "\u6b65\u884c";// "步行";
+ public static final String To = "\u53bb\u5f80";// "去往";
+ public static final String Station = "\u8f66\u7ad9";// "车站";
+ public static final String TargetPlace = "\u76ee\u7684\u5730";// "目的地";
+ public static final String StartPlace = "\u51fa\u53d1\u5730";// "出发地";
+ public static final String About = "\u5927\u7ea6";// "大约";
+ public static final String Direction = "\u65b9\u5411";// "方向";
+
+ public static final String GetOn = "\u4e0a\u8f66";// "上车";
+ public static final String GetOff = "\u4e0b\u8f66";// "下车";
+ public static final String Zhan = "\u7ad9";// "站";
+
+ public static final String cross = "\u4ea4\u53c9\u8def\u53e3"; // 交叉路口
+ public static final String type = "\u7c7b\u522b"; // 类别
+ public static final String address = "\u5730\u5740"; // 地址
+ public static final String PrevStep = "\u4e0a\u4e00\u6b65";
+ public static final String NextStep = "\u4e0b\u4e00\u6b65";
+ public static final String Gong = "\u516c\u4ea4";
+ public static final String ByBus = "\u4e58\u8f66";
+ public static final String Arrive = "\u5230\u8FBE";// 到达
+}
diff --git a/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/map/DrivingRouteOverlay.java b/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/map/DrivingRouteOverlay.java
new file mode 100755
index 0000000000..bb1fc2df84
--- /dev/null
+++ b/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/map/DrivingRouteOverlay.java
@@ -0,0 +1,384 @@
+package com.mogo.tanlu.map;
+
+import android.content.Context;
+import android.graphics.Color;
+
+import com.amap.api.maps.AMap;
+import com.amap.api.maps.model.BitmapDescriptor;
+import com.amap.api.maps.model.BitmapDescriptorFactory;
+import com.amap.api.maps.model.LatLng;
+import com.amap.api.maps.model.LatLngBounds;
+import com.amap.api.maps.model.Marker;
+import com.amap.api.maps.model.MarkerOptions;
+import com.amap.api.maps.model.PolylineOptions;
+import com.amap.api.services.core.LatLonPoint;
+import com.amap.api.services.route.DrivePath;
+import com.amap.api.services.route.DriveStep;
+import com.amap.api.services.route.TMC;
+import com.mogo.tanlu.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * 导航路线图层类
+ */
+public class DrivingRouteOverlay extends RouteOverlay {
+ private DrivePath drivePath;
+ private List throughPointList;
+ private List throughPointMarkerList = new ArrayList();
+ private boolean throughPointMarkerVisible = true;
+ private List tmcs;
+ private PolylineOptions mPolylineOptions;
+ private PolylineOptions mPolylineOptionscolor;
+ private Context mContext;
+ private boolean isColorfulline = true;
+ private float mWidth = 4;
+ private List mLatLngsOfPath;
+
+ public void setIsColorfulline(boolean iscolorfulline) {
+ this.isColorfulline = iscolorfulline;
+ }
+
+ /**
+ * 根据给定的参数,构造一个导航路线图层类对象。
+ *
+ * @param amap 地图对象。
+ * @param path 导航路线规划方案。
+ * @param context 当前的activity对象。
+ */
+ public DrivingRouteOverlay(Context context, AMap amap, DrivePath path,
+ LatLonPoint start, LatLonPoint end, List throughPointList) {
+ super(context);
+ mContext = context;
+ mAMap = amap;
+ this.drivePath = path;
+ startPoint = AMapUtil.convertToLatLng(start);
+ endPoint = AMapUtil.convertToLatLng(end);
+ this.throughPointList = throughPointList;
+
+ initBitmapDescriptor();
+ }
+
+ public float getRouteWidth() {
+ return mWidth;
+ }
+
+ /**
+ * 设置路线宽度
+ *
+ * @param mWidth 路线宽度,取值范围:大于0
+ */
+ public void setRouteWidth(float mWidth) {
+ this.mWidth = mWidth;
+ }
+
+ /**
+ * 添加驾车路线添加到地图上显示。
+ */
+ public void addToMap() {
+ initPolylineOptions();
+ try {
+ if (mAMap == null) {
+ return;
+ }
+
+ if (mWidth == 0 || drivePath == null) {
+ return;
+ }
+ mLatLngsOfPath = new ArrayList();
+ tmcs = new ArrayList();
+ List drivePaths = drivePath.getSteps();
+ mPolylineOptions.add(startPoint);
+ for (int i = 0; i < drivePaths.size(); i++) {
+ DriveStep step = drivePaths.get(i);
+ List latlonPoints = step.getPolyline();
+ List tmclist = step.getTMCs();
+ tmcs.addAll(tmclist);
+ addDrivingStationMarkers(step, convertToLatLng(latlonPoints.get(0)));
+ for (LatLonPoint latlonpoint : latlonPoints) {
+ mPolylineOptions.add(convertToLatLng(latlonpoint));
+ mLatLngsOfPath.add(convertToLatLng(latlonpoint));
+ }
+ }
+ mPolylineOptions.add(endPoint);
+ if (startMarker != null) {
+ startMarker.remove();
+ startMarker = null;
+ }
+
+ if (endMarker != null) {
+ endMarker.remove();
+ endMarker = null;
+ }
+// addStartAndEndMarker();
+// addThroughPointMarker();
+ if (isColorfulline && tmcs.size() > 0) {
+ colorWayUpdate(tmcs);
+ showcolorPolyline();
+ } else {
+ showPolyline();
+ }
+
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 初始化线段属性
+ */
+ private void initPolylineOptions() {
+ mPolylineOptions = null;
+ mPolylineOptions = new PolylineOptions();
+ mPolylineOptions.color(getDriveColor()).width(getRouteWidth());
+ }
+
+ private void showPolyline() {
+ addPolyLine(mPolylineOptions);
+ }
+
+ private void showcolorPolyline() {
+ addPolyLine(mPolylineOptionscolor);
+ }
+
+ /**
+ * 根据不同的路段拥堵情况展示不同的颜色
+ *
+ * @param tmcSection
+ */
+ private void colorWayUpdate(List tmcSection) {
+ if (mAMap == null) {
+ return;
+ }
+ if (tmcSection == null || tmcSection.size() <= 0) {
+ return;
+ }
+ TMC segmentTrafficStatus;
+ mPolylineOptionscolor = null;
+ mPolylineOptionscolor = new PolylineOptions();
+ mPolylineOptionscolor.width(getRouteWidth());
+ List colorList = new ArrayList();
+ List bitmapDescriptors = new ArrayList();
+ List points = new ArrayList<>();
+ List texIndexList = new ArrayList();
+// mPolylineOptionscolor.add(startPoint);
+// mPolylineOptionscolor.add(AMapUtil.convertToLatLng(tmcSection.get(0).getPolyline().get(0)));
+
+ points.add(startPoint);
+ points.add(AMapUtil.convertToLatLng(tmcSection.get(0).getPolyline().get(0)));
+ colorList.add(getDriveColor());
+ bitmapDescriptors.add(defaultRoute);
+
+ BitmapDescriptor bitmapDescriptor = null;
+ int textIndex = 0;
+ texIndexList.add(textIndex);
+ texIndexList.add(++textIndex);
+ for (int i = 0; i < tmcSection.size(); i++) {
+ segmentTrafficStatus = tmcSection.get(i);
+ int color = getcolor(segmentTrafficStatus.getStatus());
+ bitmapDescriptor = getTrafficBitmapDescriptor(segmentTrafficStatus.getStatus());
+ List mployline = segmentTrafficStatus.getPolyline();
+ for (int j = 0; j < mployline.size(); j++) {
+// mPolylineOptionscolor.add(AMapUtil.convertToLatLng(mployline.get(j)));
+ points.add(AMapUtil.convertToLatLng(mployline.get(j)));
+ colorList.add(color);
+
+ texIndexList.add(++textIndex);
+ bitmapDescriptors.add(bitmapDescriptor);
+ }
+ }
+
+ points.add(endPoint);
+ colorList.add(getDriveColor());
+ bitmapDescriptors.add(defaultRoute);
+ texIndexList.add(++textIndex);
+ mPolylineOptionscolor.addAll(points);
+ mPolylineOptionscolor.colorValues(colorList);
+
+// mPolylineOptionscolor.setCustomTextureIndex(texIndexList);
+// mPolylineOptionscolor.setCustomTextureList(bitmapDescriptors);
+ }
+
+ private BitmapDescriptor defaultRoute = null;
+ private BitmapDescriptor unknownTraffic = null;
+ private BitmapDescriptor smoothTraffic = null;
+ private BitmapDescriptor slowTraffic = null;
+ private BitmapDescriptor jamTraffic = null;
+ private BitmapDescriptor veryJamTraffic = null;
+
+ private void initBitmapDescriptor() {
+ defaultRoute = BitmapDescriptorFactory.fromResource(R.drawable.amap_route_color_texture_6_arrow);
+ smoothTraffic = BitmapDescriptorFactory.fromResource(R.drawable.amap_route_color_texture_4_arrow);
+ unknownTraffic = BitmapDescriptorFactory.fromResource(R.drawable.amap_route_color_texture_0_arrow);
+ slowTraffic = BitmapDescriptorFactory.fromResource(R.drawable.amap_route_color_texture_3_arrow);
+ jamTraffic = BitmapDescriptorFactory.fromResource(R.drawable.amap_route_color_texture_2_arrow);
+ veryJamTraffic = BitmapDescriptorFactory.fromResource(R.drawable.amap_route_color_texture_9_arrow);
+ }
+
+ private BitmapDescriptor getTrafficBitmapDescriptor(String status) {
+ if (status.equals("畅通")) {
+ return smoothTraffic;
+ } else if (status.equals("缓行")) {
+ return slowTraffic;
+ } else if (status.equals("拥堵")) {
+ return jamTraffic;
+ } else if (status.equals("严重拥堵")) {
+ return veryJamTraffic;
+ } else {
+ return defaultRoute;
+ }
+ }
+
+
+ private int getcolor(String status) {
+ if (status.equals("畅通")) {
+ return Color.GREEN;
+ } else if (status.equals("缓行")) {
+ return Color.YELLOW;
+ } else if (status.equals("拥堵")) {
+ return Color.RED;
+ } else if (status.equals("严重拥堵")) {
+ return Color.parseColor("#990033");
+ } else {
+ return Color.GREEN;
+ }
+ }
+
+ public LatLng convertToLatLng(LatLonPoint point) {
+ return new LatLng(point.getLatitude(), point.getLongitude());
+ }
+
+ /**
+ * @param driveStep
+ * @param latLng
+ */
+ private void addDrivingStationMarkers(DriveStep driveStep, LatLng latLng) {
+ addStationMarker(new MarkerOptions()
+ .position(latLng)
+ .title("\u65B9\u5411:" + driveStep.getAction()
+ + "\n\u9053\u8DEF:" + driveStep.getRoad())
+ .snippet(driveStep.getInstruction()).visible(nodeIconVisible)
+ .anchor(0.5f, 0.5f).icon(getDriveBitmapDescriptor()));
+ }
+
+ @Override
+ protected LatLngBounds getLatLngBounds() {
+ LatLngBounds.Builder b = LatLngBounds.builder();
+ b.include(new LatLng(startPoint.latitude, startPoint.longitude));
+ b.include(new LatLng(endPoint.latitude, endPoint.longitude));
+ if (this.throughPointList != null && this.throughPointList.size() > 0) {
+ for (int i = 0; i < this.throughPointList.size(); i++) {
+ b.include(new LatLng(
+ this.throughPointList.get(i).getLatitude(),
+ this.throughPointList.get(i).getLongitude()));
+ }
+ }
+ return b.build();
+ }
+
+ public void setThroughPointIconVisibility(boolean visible) {
+ try {
+ throughPointMarkerVisible = visible;
+ if (this.throughPointMarkerList != null
+ && this.throughPointMarkerList.size() > 0) {
+ for (int i = 0; i < this.throughPointMarkerList.size(); i++) {
+ this.throughPointMarkerList.get(i).setVisible(visible);
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void addThroughPointMarker() {
+ if (this.throughPointList != null && this.throughPointList.size() > 0) {
+ LatLonPoint latLonPoint = null;
+ for (int i = 0; i < this.throughPointList.size(); i++) {
+ latLonPoint = this.throughPointList.get(i);
+ if (latLonPoint != null) {
+ throughPointMarkerList.add(mAMap
+ .addMarker((new MarkerOptions())
+ .position(
+ new LatLng(latLonPoint
+ .getLatitude(), latLonPoint
+ .getLongitude()))
+ .visible(throughPointMarkerVisible)
+ .icon(getThroughPointBitDes())
+ .title("\u9014\u7ECF\u70B9")));
+ }
+ }
+ }
+ }
+
+ private BitmapDescriptor getThroughPointBitDes() {
+ return BitmapDescriptorFactory.fromResource(R.drawable.amap_through);
+
+ }
+
+ /**
+ * 获取两点间距离
+ *
+ * @param start
+ * @param end
+ * @return
+ */
+ public static int calculateDistance(LatLng start, LatLng end) {
+ double x1 = start.longitude;
+ double y1 = start.latitude;
+ double x2 = end.longitude;
+ double y2 = end.latitude;
+ return calculateDistance(x1, y1, x2, y2);
+ }
+
+ public static int calculateDistance(double x1, double y1, double x2, double y2) {
+ final double NF_pi = 0.01745329251994329; // 弧度 PI/180
+ x1 *= NF_pi;
+ y1 *= NF_pi;
+ x2 *= NF_pi;
+ y2 *= NF_pi;
+ double sinx1 = Math.sin(x1);
+ double siny1 = Math.sin(y1);
+ double cosx1 = Math.cos(x1);
+ double cosy1 = Math.cos(y1);
+ double sinx2 = Math.sin(x2);
+ double siny2 = Math.sin(y2);
+ double cosx2 = Math.cos(x2);
+ double cosy2 = Math.cos(y2);
+ double[] v1 = new double[3];
+ v1[0] = cosy1 * cosx1 - cosy2 * cosx2;
+ v1[1] = cosy1 * sinx1 - cosy2 * sinx2;
+ v1[2] = siny1 - siny2;
+ double dist = Math.sqrt(v1[0] * v1[0] + v1[1] * v1[1] + v1[2] * v1[2]);
+
+ return (int) (Math.asin(dist / 2) * 12742001.5798544);
+ }
+
+
+ //获取指定两点之间固定距离点
+ public static LatLng getPointForDis(LatLng sPt, LatLng ePt, double dis) {
+ double lSegLength = calculateDistance(sPt, ePt);
+ double preResult = dis / lSegLength;
+ return new LatLng((ePt.latitude - sPt.latitude) * preResult + sPt.latitude, (ePt.longitude - sPt.longitude) * preResult + sPt.longitude);
+ }
+
+ /**
+ * 去掉DriveLineOverlay上的线段和标记。
+ */
+ @Override
+ public void removeFromMap() {
+ try {
+ super.removeFromMap();
+ if (this.throughPointMarkerList != null
+ && this.throughPointMarkerList.size() > 0) {
+ for (int i = 0; i < this.throughPointMarkerList.size(); i++) {
+ this.throughPointMarkerList.get(i).remove();
+ }
+ this.throughPointMarkerList.clear();
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/map/RouteOverlay.java b/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/map/RouteOverlay.java
new file mode 100755
index 0000000000..af1b169592
--- /dev/null
+++ b/modules/mogo-module-tanlu/src/main/java/com/mogo/tanlu/map/RouteOverlay.java
@@ -0,0 +1,236 @@
+package com.mogo.tanlu.map;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Color;
+
+import com.amap.api.maps.AMap;
+import com.amap.api.maps.CameraUpdateFactory;
+import com.amap.api.maps.model.BitmapDescriptor;
+import com.amap.api.maps.model.BitmapDescriptorFactory;
+import com.amap.api.maps.model.LatLng;
+import com.amap.api.maps.model.LatLngBounds;
+import com.amap.api.maps.model.Marker;
+import com.amap.api.maps.model.MarkerOptions;
+import com.amap.api.maps.model.Polyline;
+import com.amap.api.maps.model.PolylineOptions;
+import com.mogo.tanlu.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class RouteOverlay {
+ protected List stationMarkers = new ArrayList();
+ protected List allPolyLines = new ArrayList();
+ protected Marker startMarker;
+ protected Marker endMarker;
+ protected LatLng startPoint;
+ protected LatLng endPoint;
+ protected AMap mAMap;
+ private Context mContext;
+ private Bitmap startBit, endBit, busBit, walkBit, driveBit;
+ protected boolean nodeIconVisible = true;
+
+ public RouteOverlay(Context context) {
+ mContext = context;
+ }
+
+ /**
+ * 去掉BusRouteOverlay上所有的Marker。
+ *
+ * @since V2.1.0
+ */
+ public void removeFromMap() {
+ if (startMarker != null) {
+ startMarker.remove();
+
+ }
+ if (endMarker != null) {
+ endMarker.remove();
+ }
+ for (Marker marker : stationMarkers) {
+ marker.remove();
+ }
+ for (Polyline line : allPolyLines) {
+ line.remove();
+ }
+ destroyBit();
+ }
+
+ private void destroyBit() {
+ if (startBit != null) {
+ startBit.recycle();
+ startBit = null;
+ }
+ if (endBit != null) {
+ endBit.recycle();
+ endBit = null;
+ }
+ if (busBit != null) {
+ busBit.recycle();
+ busBit = null;
+ }
+ if (walkBit != null) {
+ walkBit.recycle();
+ walkBit = null;
+ }
+ if (driveBit != null) {
+ driveBit.recycle();
+ driveBit = null;
+ }
+ }
+
+ /**
+ * 给起点Marker设置图标,并返回更换图标的图片。如不用默认图片,需要重写此方法。
+ *
+ * @return 更换的Marker图片。
+ * @since V2.1.0
+ */
+ protected BitmapDescriptor getStartBitmapDescriptor() {
+ return BitmapDescriptorFactory.fromResource(R.drawable.amap_start);
+ }
+
+ /**
+ * 给终点Marker设置图标,并返回更换图标的图片。如不用默认图片,需要重写此方法。
+ *
+ * @return 更换的Marker图片。
+ * @since V2.1.0
+ */
+ protected BitmapDescriptor getEndBitmapDescriptor() {
+ return BitmapDescriptorFactory.fromResource(R.drawable.amap_end);
+ }
+
+ /**
+ * 给公交Marker设置图标,并返回更换图标的图片。如不用默认图片,需要重写此方法。
+ *
+ * @return 更换的Marker图片。
+ * @since V2.1.0
+ */
+ protected BitmapDescriptor getBusBitmapDescriptor() {
+ return BitmapDescriptorFactory.fromResource(R.drawable.amap_bus);
+ }
+
+ /**
+ * 给步行Marker设置图标,并返回更换图标的图片。如不用默认图片,需要重写此方法。
+ *
+ * @return 更换的Marker图片。
+ * @since V2.1.0
+ */
+ protected BitmapDescriptor getWalkBitmapDescriptor() {
+ return BitmapDescriptorFactory.fromResource(R.drawable.amap_man);
+ }
+
+ protected BitmapDescriptor getDriveBitmapDescriptor() {
+ return BitmapDescriptorFactory.fromResource(R.drawable.amap_car);
+ }
+
+ protected void addStartAndEndMarker() {
+ startMarker = mAMap.addMarker((new MarkerOptions())
+ .position(startPoint).icon(getStartBitmapDescriptor())
+ .title("\u8D77\u70B9"));
+ // startMarker.showInfoWindow();
+
+ endMarker = mAMap.addMarker((new MarkerOptions()).position(endPoint)
+ .icon(getEndBitmapDescriptor()).title("\u7EC8\u70B9"));
+ // mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(startPoint,
+ // getShowRouteZoom()));
+ }
+
+ /**
+ * 移动镜头到当前的视角。
+ *
+ * @since V2.1.0
+ */
+ public void zoomToSpan() {
+ if (startPoint != null) {
+ if (mAMap == null)
+ return;
+ try {
+ LatLngBounds bounds = getLatLngBounds();
+ mAMap.animateCamera(CameraUpdateFactory
+ .newLatLngBounds(bounds, 50));
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ protected LatLngBounds getLatLngBounds() {
+ LatLngBounds.Builder b = LatLngBounds.builder();
+ b.include(new LatLng(startPoint.latitude, startPoint.longitude));
+ b.include(new LatLng(endPoint.latitude, endPoint.longitude));
+ for (Polyline polyline : allPolyLines) {
+ for (LatLng point : polyline.getPoints()) {
+ b.include(point);
+ }
+ }
+ return b.build();
+ }
+
+ /**
+ * 路段节点图标控制显示接口。
+ *
+ * @param visible true为显示节点图标,false为不显示。
+ * @since V2.3.1
+ */
+ public void setNodeIconVisibility(boolean visible) {
+ try {
+ nodeIconVisible = visible;
+ if (this.stationMarkers != null && this.stationMarkers.size() > 0) {
+ for (int i = 0; i < this.stationMarkers.size(); i++) {
+ this.stationMarkers.get(i).setVisible(visible);
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+
+ protected void addStationMarker(MarkerOptions options) {
+ if (options == null) {
+ return;
+ }
+ Marker marker = mAMap.addMarker(options);
+ if (marker != null) {
+ stationMarkers.add(marker);
+ }
+
+ }
+
+ protected void addPolyLine(PolylineOptions options) {
+ if (options == null) {
+ return;
+ }
+ Polyline polyline = mAMap.addPolyline(options);
+ if (polyline != null) {
+ allPolyLines.add(polyline);
+ }
+ }
+
+ protected float getRouteWidth() {
+ return 18f;
+ }
+
+ protected int getWalkColor() {
+ return Color.parseColor("#6db74d");
+ }
+
+ /**
+ * 自定义路线颜色。
+ * return 自定义路线颜色。
+ *
+ * @since V2.2.1
+ */
+ protected int getBusColor() {
+ return Color.parseColor("#537edc");
+ }
+
+ protected int getDriveColor() {
+ return Color.parseColor("#537edc");
+ }
+
+ // protected int getShowRouteZoom() {
+ // return 15;
+ // }
+}