diff --git a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt
index 0276195e..d46f6a77 100644
--- a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt
+++ b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt
@@ -1,6 +1,7 @@
 package com.navinfo.omqs.bean
 
 import com.google.gson.annotations.SerializedName
+import com.navinfo.collect.library.data.entity.HadLinkDvoBean
 import com.navinfo.omqs.Constant
 import com.navinfo.omqs.tools.FileManager
 import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus
@@ -8,7 +9,6 @@ import io.realm.RealmList
 import io.realm.RealmObject
 import io.realm.annotations.Ignore
 import io.realm.annotations.PrimaryKey
-import io.realm.annotations.RealmClass
 
 open class TaskBean @JvmOverloads constructor(
     /**
@@ -67,6 +67,6 @@ open class TaskBean @JvmOverloads constructor(
     var message: String = ""
 ) : RealmObject() {
     fun getDownLoadUrl(): String {
-        return "${Constant.SERVER_ADDRESS}devcp/download?fileStr=$id"
+        return "${Constant.SERVER_ADDRESS}devcp/download?fileStr=26"
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/db/MyRealmModule.kt b/app/src/main/java/com/navinfo/omqs/db/MyRealmModule.kt
index cab1956b..deb0ee86 100644
--- a/app/src/main/java/com/navinfo/omqs/db/MyRealmModule.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/MyRealmModule.kt
@@ -1,9 +1,9 @@
 package com.navinfo.omqs.db
 
-import com.navinfo.omqs.bean.HadLinkDvoBean
+import com.navinfo.collect.library.data.entity.HadLinkDvoBean
 import com.navinfo.omqs.bean.TaskBean
 import io.realm.annotations.RealmModule
 
-@RealmModule(classes = [TaskBean::class, HadLinkDvoBean::class])
+@RealmModule(classes = [TaskBean::class])
 class MyRealmModule {
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt
index 53ee23dd..b9dd9165 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt
@@ -1,11 +1,16 @@
 package com.navinfo.omqs.ui.fragment.tasklist
 
 import android.content.Context
+import android.graphics.Color
+import android.os.Build
 import android.util.Log
 import android.widget.Toast
+import androidx.annotation.RequiresApi
+import androidx.core.graphics.toColor
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
+import com.navinfo.collect.library.map.NIMapController
 import com.navinfo.omqs.bean.TaskBean
 import com.navinfo.omqs.http.NetResult
 import com.navinfo.omqs.http.NetworkService
@@ -19,7 +24,8 @@ import javax.inject.Inject
 
 @HiltViewModel
 class TaskListViewModel @Inject constructor(
-    private val networkService: NetworkService
+    private val networkService: NetworkService,
+    private val niMapController: NIMapController
 ) : ViewModel() {
 
     val liveDataTaskList = MutableLiveData<List<TaskBean>>()
@@ -70,6 +76,11 @@ class TaskListViewModel @Inject constructor(
             for (item in taskList) {
                 FileManager.checkOMDBFileInfo(item)
             }
+//            niMapController.lineHandler.omdbTaskLinkLayer.setLineColor(Color.rgb(0, 255, 0).toColor())
+//            taskList.forEach {
+//                niMapController.lineHandler.omdbTaskLinkLayer.addLineList(it.hadLinkDvoList)
+//            }
+//            niMapController.lineHandler.omdbTaskLinkLayer.update()
             liveDataTaskList.postValue(taskList)
         }
 
diff --git a/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt
similarity index 80%
rename from app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt
rename to collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt
index 28373667..7430050d 100644
--- a/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt
@@ -1,7 +1,6 @@
-package com.navinfo.omqs.bean
+package com.navinfo.collect.library.data.entity
 
 import io.realm.RealmObject
-import io.realm.annotations.RealmClass
 
 open class HadLinkDvoBean @JvmOverloads constructor(
     /**
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
index 7e5ab8b8..085a7766 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
@@ -108,6 +108,12 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePa
         }
     }
 
+    /**
+     * 初始化任务Link高亮的图层
+     * */
+    private fun initOMDBTaskVectorLayer() {
+    }
+
     /**
      * 切换基础底图样式
      */
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
index 8d0af45a..d5d2145f 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
@@ -7,6 +7,7 @@ import androidx.annotation.RequiresApi
 import androidx.appcompat.app.AppCompatActivity
 import com.navinfo.collect.library.R
 import com.navinfo.collect.library.map.NIMapView
+import com.navinfo.collect.library.map.layers.OmdbTaskLinkLayer
 import com.navinfo.collect.library.utils.GeometryTools
 import com.navinfo.collect.library.utils.StringUtil
 import org.locationtech.jts.geom.LineString
@@ -21,10 +22,11 @@ import org.oscim.layers.marker.MarkerInterface
 import org.oscim.layers.marker.MarkerItem
 import org.oscim.layers.marker.MarkerSymbol
 import org.oscim.layers.vector.PathLayer
+import org.oscim.layers.vector.VectorLayer
 import org.oscim.layers.vector.geometries.Style
 import org.oscim.map.Map
 
-@RequiresApi(Build.VERSION_CODES.M)
+@RequiresApi(Build.VERSION_CODES.N)
 class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView),
     Map.UpdateListener {
 
@@ -57,6 +59,19 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(
 
     private val mDefaultPathLayer: PathLayer
 
+    val omdbTaskLinkLayer by lazy {
+        val omdbTaskLinkLayer = OmdbTaskLinkLayer(mMapView.vtmMap,
+            Style.builder()
+//            .stippleColor(context.resources.getColor(R.color.draw_line_red_color, null))
+            .fillColor(context.resources.getColor(R.color.draw_line_red_color, null))
+            .fillAlpha(0.5f)
+            .strokeColor(context.resources.getColor(R.color.draw_line_red_color, null))
+                .strokeWidth(4f)
+            .fixed(true).build())
+        addLayer(omdbTaskLinkLayer, NIMapView.LAYER_GROUPS.VECTOR)
+        omdbTaskLinkLayer
+    }
+
     init {
         mMapView.vtmMap.events.bind(this)
 
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/MultiPathLayer.java b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/MultiPathLayer.java
new file mode 100644
index 00000000..8f3efc9b
--- /dev/null
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/MultiPathLayer.java
@@ -0,0 +1,170 @@
+package com.navinfo.collect.library.map.layers;
+
+import com.navinfo.collect.library.utils.GeometryTools;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.LineString;
+import org.oscim.core.GeoPoint;
+import org.oscim.layers.vector.PathLayer;
+import org.oscim.layers.vector.geometries.LineDrawable;
+import org.oscim.layers.vector.geometries.PolygonDrawable;
+import org.oscim.layers.vector.geometries.Style;
+import org.oscim.map.Map;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by xiaoxiao on 2018/3/26.
+ */
+
+public class MultiPathLayer extends PathLayer {
+    private List<LineDrawable> pathDrawableList;
+
+    public MultiPathLayer(Map map, Style style) {
+        super(map, style);
+        mStyle = style;
+        pathDrawableList = new ArrayList<>();
+    }
+
+    public MultiPathLayer(Map map, Style style, String name) {
+        this(map, style);
+    }
+
+    public MultiPathLayer(Map map, int lineColor, float lineWidth, int fillColor, float fillAlpha) {
+        this(map, Style.builder()
+                .stippleColor(lineColor)
+                .stipple(24)
+                .stippleWidth(lineWidth)
+                .strokeWidth(lineWidth)
+                .strokeColor(lineColor).fillColor(fillColor).fillAlpha(fillAlpha)
+                .fixed(true)
+                .randomOffset(false)
+                .build());
+    }
+
+    public MultiPathLayer(Map map, int lineColor, int fillColor, float fillAlpha) {
+        this(map, lineColor, 0.5f, fillColor, fillAlpha);
+    }
+
+    /**
+     * 设置polygon的点位
+     */
+    public void setPathList(List<List<GeoPoint>> pointListList) {
+        if (pointListList == null || pointListList.isEmpty()) {
+            return;
+        }
+        for (List<GeoPoint> pointList : pointListList) {
+            if (pointList == null || pointList.size() < 2) {
+                return;
+            }
+            synchronized (this) {
+                LineDrawable lineDrawable = new LineDrawable(pointList, mStyle);
+                add(lineDrawable);
+                pathDrawableList.add(lineDrawable);
+            }
+            mWorker.submit(0);
+            update();
+        }
+    }
+
+    /**
+     * 移除正在绘制的polygon的图形
+     */
+    public void removePathDrawable(int i) {
+        if (pathDrawableList != null && pathDrawableList.size() > i) {
+            remove(pathDrawableList.get(i));
+            update();
+        }
+    }
+
+    public void removePathDrawable(List<GeoPoint> geoPointList) {
+        LineString path = GeometryTools.getLineStrinGeo(geoPointList);
+        removePolygonDrawable(path);
+    }
+
+    public void removePathDrawable(String pathStr) {
+        LineString path = (LineString) GeometryTools.createGeometry(pathStr);
+        removePolygonDrawable(path);
+    }
+
+    public void removePolygonDrawable(Geometry path) {
+        if (pathDrawableList != null && !pathDrawableList.isEmpty()) {
+            Iterator iterator = pathDrawableList.iterator();
+            while (iterator.hasNext()) {
+                LineDrawable lineDrawable = (LineDrawable) iterator.next();
+                if (GeometryTools.createGeometry(lineDrawable.getGeometry().toString()).equals(path)) {
+                    remove(lineDrawable);
+                    iterator.remove();
+                    break;
+                }
+            }
+            mWorker.submit(0);
+            update();
+        }
+    }
+
+    public void addPathDrawable(List<GeoPoint> pointList) {
+        if (pathDrawableList != null) {
+            if (pointList == null || pointList.size() < 2) {
+                return;
+            }
+            synchronized (this) {
+                LineDrawable pathDrawable = new LineDrawable(pointList, mStyle);
+                add(pathDrawable);
+                pathDrawableList.add(pathDrawable);
+            }
+            mWorker.submit(0);
+        }
+        update();
+    }
+
+    public void addPathDrawable(LineString lineString) {
+        List<GeoPoint> geoPointList = GeometryTools.getGeoPoints(lineString.toString());
+        addPathDrawable(geoPointList);
+    }
+
+    public List<LineString> getAllPathList() {
+        if (pathDrawableList != null && !pathDrawableList.isEmpty()) {
+            List<LineString> pathList = new ArrayList<>();
+            for (LineDrawable pathDrawable : pathDrawableList) {
+                pathList.add((LineString) GeometryTools.createGeometry(pathDrawable.getGeometry().toString()));
+            }
+            return pathList;
+        }
+        return null;
+    }
+
+    public List<List<GeoPoint>> getAllPathGeoPointList() {
+        List<LineString> pathList = getAllPathList();
+        if (pathList != null) {
+            List<List<GeoPoint>> geopointList = new ArrayList<>();
+            for (LineString path : pathList) {
+                geopointList.add(GeometryTools.getGeoPoints(path.toString()));
+            }
+            return geopointList;
+        }
+        return null;
+    }
+
+    public List<LineDrawable> getPolygonDrawableList() {
+        return pathDrawableList;
+    }
+
+    public void setPolygonDrawableList(List<LineDrawable> pathDrawableList) {
+        this.pathDrawableList = pathDrawableList;
+    }
+
+    public void removeAllPathDrawable(){
+        if (pathDrawableList != null && !pathDrawableList.isEmpty()) {
+            Iterator iterator = pathDrawableList.iterator();
+            while (iterator.hasNext()) {
+                LineDrawable lineDrawable = (LineDrawable) iterator.next();
+                remove(lineDrawable);
+                iterator.remove();
+            }
+            mWorker.submit(0);
+            update();
+        }
+    }
+}
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt
new file mode 100644
index 00000000..02de5184
--- /dev/null
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt
@@ -0,0 +1,54 @@
+package com.navinfo.collect.library.map.layers
+
+import android.graphics.Color
+import com.navinfo.collect.library.R
+import com.navinfo.collect.library.data.entity.HadLinkDvoBean
+import com.navinfo.collect.library.utils.GeometryTools
+import org.locationtech.jts.geom.Geometry
+import org.oscim.layers.vector.VectorLayer
+import org.oscim.layers.vector.geometries.Drawable
+import org.oscim.layers.vector.geometries.LineDrawable
+import org.oscim.layers.vector.geometries.Style
+import org.oscim.map.Map
+
+class OmdbTaskLinkLayer(map: Map, private var style: Style) : VectorLayer(map) {
+    private val lineMap = HashMap<String, Drawable>()
+
+    fun addLine(hadLinkDvoBean: HadLinkDvoBean, style: Style = this.style) {
+        hadLinkDvoBean.let {
+            if (!lineMap.containsKey(it.linkPid)) {
+                // 添加geometry到图层上
+                val lineDrawable = LineDrawable(GeometryTools.createGeometry(it.geometry), style)
+                super.add(lineDrawable)
+                lineMap[it.linkPid] = lineDrawable
+            }
+        }
+    }
+
+    fun addLineList(hadLinkDvoBeanList: List<HadLinkDvoBean>, style: Style = this.style) {
+        hadLinkDvoBeanList.forEach {
+            addLine(it, style)
+        }
+    }
+
+    fun removeLine(linkPid: String):Boolean {
+        if (lineMap.containsKey(linkPid)) {
+            super.remove(lineMap[linkPid])
+            lineMap.remove(linkPid)
+        }
+        return false
+    }
+
+    fun removeLine(geometry: Geometry) {
+        super.remove(geometry)
+    }
+
+    fun setLineColor(color: Color) {
+        this.style = Style.builder()
+            .fillColor(color.toArgb())
+            .fillAlpha(0.5f)
+            .strokeColor(color.toArgb())
+            .strokeWidth(4f)
+            .fixed(true).build()
+    }
+}
\ No newline at end of file