diff --git a/displayroutedialog.cpp b/displayroutedialog.cpp
index 8146cb11..bd828c5d 100644
--- a/displayroutedialog.cpp
+++ b/displayroutedialog.cpp
@@ -60,7 +60,8 @@ void DisplayRouteDialog::addRouteTypeItem()
     if(!res) return;
     res->MoveFirst();
     UGVariant v;
-    QSet<int> typeset;
+//    QSet<int> typeset;
+    std::set<int> typeset;
     while(!res->IsEOF())
     {//获取航线类型唯一值
         res->GetFieldValue(_U("RouteType"),v);
@@ -221,19 +222,27 @@ void DisplayRouteDialog::showRoute3D()
     res->MoveFirst();
 
     UGLayer3Ds* layers = pSceneControl->GetUGLayer3Ds();
+    UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D();
     //添加到显示数据集
     UGString displayDtName = addGeometry3DToDisplayDataset(res,routeType.toInt());
     UGString displayLayerName = displayDtName + _U("@") + routeGVar.workspaceDataName.DatasourceName;
     int index = layers->FindNameInner(displayLayerName);
-    if(index>=0) layers->TreeRemoveAt(index); //移除已存在的图层
+    if(index>=0)
+    {
+        layers->TreeRemoveAt(index); //移除已存在的图层
+        //移除航点注记
+        trackingLayer3D->RemoveAll();
+    }
 //    UGLayer3D* displayLayer = pSceneControl->AddLayerFromDataset(routeGVar.workspaceDataName.DatasourceName,displayDtName);
     UGLayer3D* displayLayer = layers->AddLayer(displayLayerName);
+    gftOpt.addNodeLabel3D(res,trackingLayer3D);//添加航点注记
     UGStyle3D style3D = routeGVar.getRouteStyle3D(routeType.toInt());
     displayLayer->SetStyle3D(style3D);
 
     pSceneControl->Refresh(displayLayer);
     displayLayer = NULL;
     layers = NULL;
+    trackingLayer3D = NULL;
 
     /* TrackingLayer3D显示方式
     UGTrackingLayer3D* pTrackingLayer3D = pSceneControl->GetTrackingLayer3D();
diff --git a/geofeatureoperator.cpp b/geofeatureoperator.cpp
index ac69ab66..0d30fbce 100644
--- a/geofeatureoperator.cpp
+++ b/geofeatureoperator.cpp
@@ -1,9 +1,11 @@
 #include "geofeatureoperator.h"
 #include "Engine/UGDataSource.h"
 #include "Geometry/UGGeoLine.h"
+#include "Geometry3D/UGGeoPoint3D.h"
 #include "Map/UGMap.h"
 #include "MapEditor/UGMapEditorWnd.h"
 #include "qdebug.h"
+#include "qvector3d.h"
 #include "routeglobalvariant.h"
 #include "translator.h"
 #include "layeroperator.h"
@@ -202,7 +204,80 @@ int GeoFeatureOperator::importFeatureAttribute(UGDatasetVector *dv, UGGeometry*
 
 }
 
-//获取几何对象所有节点坐标
+/*@获取几何对象所有节点坐标
+ *@points 使用三维坐标存储航点
+ *@altitude 用于兼容二维点,默认为0
+ */
+void GeoFeatureOperator::getNodePoints(UGGeometry* pGeometry, QVector<QVector3D>&points,double altitude)
+{
+    QVector3D point;
+    int type = pGeometry->GetType();
+    switch (type) {
+    case UGGeometry::GeoLine:
+    {
+        UGGeoLine* line = (UGGeoLine*)pGeometry;
+        const UGPoint2D* p = line->GetPoints(); //节点指针
+        int nodeNum = line->GetPointCount(); //节点数
+        if (line->GetStartNode() == line->GetEndNode())
+        {//闭合航线,减去末尾重合航点
+            nodeNum--;
+        }
+        for(int i = 0;i<nodeNum;i++) //遍历一个要素所有节点
+        {
+            point.setX(p->x);
+            point.setY(p->y);
+            point.setZ(altitude);
+            points.append(point);
+            p++;
+        }
+        line = NULL;
+        p = NULL;
+        break;
+    }
+    case UGGeometry::GeoRegion:
+    {
+        UGGeoRegion* polygon = (UGGeoRegion*)pGeometry;
+        const UGPoint2D* p = polygon->GetPoints(); //节点指针
+        int nodeNum = polygon->GetPointCount()-1; //节点数
+        for(int i = 0;i<nodeNum;i++)
+        {
+            point.setX(p->x);
+            point.setY(p->y);
+            point.setZ(altitude);
+            points.append(point);
+            p++;
+        }
+        polygon = NULL;
+        p = NULL;
+        break;
+    }
+    case UGGeometry::GeoLine3D:
+    {
+        UGGeoLine3D* line3D = (UGGeoLine3D*)pGeometry;
+        const UGPoint3D* p = line3D->GetPoints(); //节点指针
+        int nodeNum = line3D->GetPointCount(); //节点数
+        if (line3D->GetStartNode() == line3D->GetEndNode())
+        {//闭合航线,减去末尾重合航点
+            nodeNum--;
+        }
+        for(int i = 0;i<nodeNum;i++)
+        {
+            point.setX(p->x);
+            point.setY(p->y);
+            point.setZ(p->z);
+            points.append(point);
+            p++;
+        }
+
+        line3D = NULL;
+        p = NULL;
+        break;
+    }
+    }
+}
+
+//获取几何对象所有节点坐标(废弃)
+/*
 void GeoFeatureOperator::getNodePoints(UGRecordsetPtr res, UGint geometryType, QVector<QPointF> &points)
 {
     res->MoveFirst(); //确保记录集指针是链表表头
@@ -250,7 +325,7 @@ void GeoFeatureOperator::getNodePoints(UGRecordsetPtr res, UGint geometryType, Q
     }
     }
 }
-
+*/
 
 //线要素绘制
 void GeoFeatureOperator::drawLine(QMapControl *qMapControl, UGDataSource *pDataSource, UGString datasetName)
@@ -289,7 +364,7 @@ void GeoFeatureOperator::drawLine(QMapControl *qMapControl, UGDataSource *pDataS
     lineLayer = NULL;
 }
 
-//3D线要素绘制
+//3D线要素绘制(废弃)
 void GeoFeatureOperator::drawLine3D(SceneView* pSceneView, UGString datasourceName, UGString datasetName)
 {
     SceneControl* pSceneControl = pSceneView->GetSceneControl();
@@ -330,7 +405,7 @@ void GeoFeatureOperator::drawLine3D(SceneView* pSceneView, UGString datasourceNa
     pSceneControl = NULL;
 
 }
-
+//3D线要素绘制
 void GeoFeatureOperator::drawLine3D(SceneView *pSceneView, UGString dataName)
 {
     SceneControl* pSceneControl = pSceneView->GetSceneControl();
@@ -373,10 +448,10 @@ void GeoFeatureOperator::drawLine3D(SceneView *pSceneView, UGString dataName)
     pSceneView->isEditStateFlag = true;
 
     //显示对话框
-//    emit pSceneView->showSettingFlightPointDialg();
+    emit pSceneView->showSettingFlightPointDialg();
 
-    qDebug()<<"*******************Cursor:"<<pSceneControl->GetSceneEditWnd()->Get3DCursorShape();
-    qDebug()<<"*******************Cursor:"<<pSceneControl->GetSceneEditWnd()->m_SceneWindow.m_n3DCursorShape;
+//    qDebug()<<"*******************Cursor:"<<pSceneControl->GetSceneEditWnd()->Get3DCursorShape();
+//    qDebug()<<"*******************Cursor:"<<pSceneControl->GetSceneEditWnd()->m_SceneWindow.m_n3DCursorShape;
 
 //    dv = NULL;
     lineLayer3D = NULL;
@@ -384,6 +459,56 @@ void GeoFeatureOperator::drawLine3D(SceneView *pSceneView, UGString dataName)
     pLayer3Ds = NULL;
 }
 
+//添加三维航点注记
+void GeoFeatureOperator::addNodeLabel3D(UGRecordsetPtr res, UGTrackingLayer3D *pTrackingLayer3D)
+{
+//    QMap<int, QVector3D> points;
+//    getNodePoints(res,points);
+    UGGeometry* pGeometry = NULL;
+    UGGeoLine3D* line3D = NULL;
+    UGPoint3D point;
+    UGString nodeTag;
+    UGVariant v;
+    res->MoveFirst();
+    while(!res->IsEOF())
+    {
+        res->GetGeometry(pGeometry);
+        res->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),v);
+        int type = v.ToInt();
+        res->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteNumber),v);
+        UGString number = v.ToString();
+
+        line3D = (UGGeoLine3D*)pGeometry;
+        int nodeCount = line3D->GetPointCount();
+        const UGPoint3D* points3D = line3D->GetPoints();
+        if(line3D->GetStartNode()==line3D->GetEndNode())
+            nodeCount--;
+        UGGeoText3D* geoText3D = new UGGeoText3D();
+        UGStyle3D style;
+        style.SetAltitudeMode(AltitudeMode::Absolute);
+        geoText3D->SetStyle3D(&style);
+        UGTextStyle textStyle = routeGVar.getLabelTextStyle(type);
+        geoText3D->SetTextStyle(textStyle);
+        for(int i = 0;i<nodeCount;i++)
+        {
+            nodeTag = number + _U("-") + Translator::QStr2UGStr(QString::number(i+1));
+            point.x = points3D->x;
+            point.y = points3D->y;
+            point.z = points3D->z;
+            geoText3D->AddSub(nodeTag,point);
+            points3D++;
+        }
+
+        UGString geoTextTag = Translator::QStr2UGStr(QString::number(type)) + _U("_") + number;
+        pTrackingLayer3D->Add(geoText3D,geoTextTag);
+
+        res->MoveNext();
+        geoText3D = NULL;
+    }
+    pGeometry = NULL;
+    line3D = NULL;
+}
+
 //添加三维几何对象到记录集
 void GeoFeatureOperator::addGeometry3DToDataset(UGDatasetVector *dv, UGGeometry *pGeometry)
 {
@@ -487,3 +612,15 @@ int GeoFeatureOperator::importGeometry3DAttribute(UGDatasetVector *dv, UGGeometr
         return 2;
     }
 }
+
+//创建三维地标对象
+UGGeoPlacemark *GeoFeatureOperator::createGeoPlacemark(QVector3D point, QString strName)
+{
+    UGGeoPlacemark* geoPlacemark = new UGGeoPlacemark();
+    UGGeoPoint3D* point3D = new UGGeoPoint3D();
+    geoPlacemark->SetGeometry(point3D);
+    geoPlacemark->SetPosition(UGPoint3D(point.x(),point.y(),point.z()));
+    geoPlacemark->SetName(Translator::QStr2UGStr(strName));
+
+    return geoPlacemark;
+}
diff --git a/geofeatureoperator.h b/geofeatureoperator.h
index 24353ea8..6c5b6e89 100644
--- a/geofeatureoperator.h
+++ b/geofeatureoperator.h
@@ -10,6 +10,9 @@
 #include "qmapcontrol.h"
 #include "scenecontrol.h"
 #include "sceneview.h"
+#include "routeglobalvariant.h"
+#include "Geometry3D/UGGeoPlacemark.h"
+#include "Scene/UGTrackingLayer3D.h"
 
 using namespace UGC;
 
@@ -29,7 +32,8 @@ public:
     int importFeatureAttribute(UGDatasetVector *dv, UGGeometry* pGeometry, QMap<QString,QString> fieldsValue,bool isAddGeometry = true);
 
      //获取几何对象所有节点坐标
-    void getNodePoints(UGRecordsetPtr res,UGint geometryType,QVector<QPointF>&points);
+//    void getNodePoints(UGRecordsetPtr res,UGint geometryType,QVector<QPointF>&points);
+    void getNodePoints(UGGeometry* pGeometry, QVector<QVector3D>&points,double altitude=0);
 
     //线要素绘制
     void drawLine(QMapControl* qMapControl,UGDataSource* pDataSource,UGString datasetName);
@@ -39,11 +43,19 @@ public:
 
     void drawLine3D(SceneView* pSceneView,UGString dataName);
 
+    //添加三维航点注记
+    void addNodeLabel3D(UGRecordsetPtr res,UGTrackingLayer3D* pTrackingLayer3D);
+
     //添加三维几何对象到记录集
     void addGeometry3DToDataset(UGDatasetVector* dv,UGGeometry* pGeometry);
 
     //添加三维几何对象
     int importGeometry3DAttribute(UGDatasetVector *dv, UGGeometry* pGeometry, QMap<QString,QString> fieldsValue);
+
+    //创建三维地标对象
+    UGGeoPlacemark* createGeoPlacemark(QVector3D point,QString strName);
+private:
+    RouteGlobalVariant routeGVar;
 };
 
 #endif // GEOFEATUREOPERATOR_H
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 92a73350..e74060f3 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -54,6 +54,7 @@
 #include "Base3D/UGBoundingBox.h"
 #include "Geometry/UGGeoPicture.h"
 #include "Geometry3D/UGGeoPlacemark.h"
+#include "Geometry3D/UGGeoBillboard.h"
 #include "Geometry3D/UGGeoLine3D.h"
 #include "GeometryPlot/UGGOLibraryManager.h"
 
@@ -1277,18 +1278,18 @@ void MainWindow::loadModelData()
 //    pDataSource = NULL;
 
     //模型移动测试
-    UGDatasetVector* dv = (UGDatasetVector*)pDataSource->GetDataset(_U("Plane")).get(); //Plane
+//    UGDatasetVector* dv = (UGDatasetVector*)pDataSource->GetDataset(_U("Plane")).get(); //Plane
 //    ShowPlane3D* plane3D = new ShowPlane3D(pSceneControl,dv);
 //    plane3D->setPlanesCount(1);
 //    plane3D->startFly();
 
-    if(!dv->IsOpen()) dv->Open();
-    UGQueryDef query;
-    UGRecordsetPtr res = dv->Query(query);
-    res->MoveFirst();
-    qDebug()<<"*****************RecordCount:"<<res->GetRecordCount();
-    UGGeometry* geometry = NULL;
-    res->GetGeometry(geometry); //geometryType: GeoModelPro
+//    if(!dv->IsOpen()) dv->Open();
+//    UGQueryDef query;
+//    UGRecordsetPtr res = dv->Query(query);
+//    res->MoveFirst();
+//    qDebug()<<"*****************RecordCount:"<<res->GetRecordCount();
+//    UGGeometry* geometry = NULL;
+//    res->GetGeometry(geometry); //geometryType: GeoModelPro
 //    qDebug()<<"*************geometryType:"<<geometry->GetType();
 //    UGRect2D rec = geometry->GetBounds();
 //    qDebug()<<"*************leftX:"<<rec.BottomLeft().x;
@@ -1337,8 +1338,8 @@ void MainWindow::loadModelData()
 
 ////    qDebug()<<"********************Type:"<<geometry->GetType();
 //    res->Edit();
-    UGGeoModelPro* model = (UGGeoModelPro*)geometry;
-    model->SetPosition(UGPoint3D(119.73,32.234539,25));
+//    UGGeoModelPro* model = (UGGeoModelPro*)geometry;
+//    model->SetPosition(UGPoint3D(119.73,32.234539,25));
 //    res->SetGeometry(*model);
 //    res->Update();
 //    model->SetStyle3D(&tmpSty);
@@ -1409,22 +1410,44 @@ void MainWindow::loadModelData()
 //    kmlLayer->SetEditable(true);
 //    UGLayer3DModel* modelLayer3D = (UGLayer3DModel*)kmlLayer;
 
-    UGGeoPlacemark* GP = new UGGeoPlacemark();
-//    UGGeoPoint3D* p = new UGGeoPoint3D();
-//    p->SetX(119.718567);
-//    p->SetY(32.234317);
-//    p->SetZ(20);
+//    UGGeoPlacemark* GP = new UGGeoPlacemark();
+    UGGeoPoint3D* p = new UGGeoPoint3D();
+    p->SetX(119.718567);
+    p->SetY(32.234317);
+    p->SetZ(20);
 //    GP->MakeWithGeometry(p);
-    GP->SetGeometry(model);
-    GP->SetPosition(UGPoint3D(119.718567,32.234317,20));
-    GP->SetName(_U("Test"));
+//    GP->SetGeometry(p);
+//    GP->SetPosition(UGPoint3D(119.718567,32.234317,20));
+//    GP->SetName(_U("Test"));
 //    UGStyle3D s;
 //    s.SetAltitudeMode(AltitudeMode::Absolute);
-    UGTextStyle t;
-    t.SetSize(64);
-    GP->SetNameTextStyle(&t);
-    pSceneControl->GetTrackingLayer3D()->Add(GP,_U("a"));
-
+//    s.SetFill3DMode(UGC::/*UGFill3DMode::*/FILL_FACE);
+//    s.SetPicturePath(_U("D:/Icon.png"));
+//    s.SetIconScale(5);
+//    s.SetPointSize(24);
+//    UGTextStyle t;
+//    t.SetSize(24);
+//    GP->SetNameTextStyle(&t);
+//    GP->SetStyle3D(&s);
+//    p->SetStyle3D(&s);
+//    UGGeoText3D* text3D = new UGGeoText3D();
+//    text3D->Make(_U("Text"),UGPoint3D(119.718567,32.234317,20));
+//    text3D->AddSub(_U("Text2"),UGPoint3D(119.719567,32.235317,20));
+//    RouteGlobalVariant routeGVar;
+//    text3D->SetTextStyle(routeGVar.getLabelTextStyle());
+//    UGGeoBillboard* billboard = new UGGeoBillboard();
+//    billboard->MakeWithGeometry(p);
+//    UGStyle3D bbsty;
+//    bbsty.SetPicturePath(_U("D:/Icon.png"));
+//    bbsty.SetAltitudeMode(AltitudeMode::Absolute);
+//    billboard->SetWidth(32);
+//    billboard->SetHeight(32);
+//    billboard->SetStyle3D(&bbsty);
+//    billboard->SetTag(0,_U("1-1"));
+//    billboard->SetPosition(UGPoint3D(119.718567,32.234317,20));
+//    pSceneControl->GetTrackingLayer3D()->Add(text3D,_U("a"));
+//    pSceneControl->GetTrackingLayer3D()->Remove(_U("a"));
+//    int i = text3D->IsValid();
 
 //    modelLayer3D->AddModel(model);
 //    int layertype = UGLayer3DType::l3dTree;
diff --git a/routeglobalvariant.cpp b/routeglobalvariant.cpp
index 2a79ced3..66b4686e 100644
--- a/routeglobalvariant.cpp
+++ b/routeglobalvariant.cpp
@@ -26,7 +26,7 @@ UGStyle RouteGlobalVariant::getRouteStyle(int routeType)
     UGStyle style;
     style.SetLineWidth(1);
     style.SetLineColor(getRouteTypeColor(routeType));
-
+//    style.SetLineCapStyle(1);
     return style;
 }
 //获取航线类型的Style3D
@@ -35,6 +35,7 @@ UGStyle3D RouteGlobalVariant::getRouteStyle3D(int routeType)
     UGStyle3D style3D;
     style3D.SetLineColor3D(getRouteTypeColor(routeType));
     style3D.SetLineWidth(2);
+//    style3D.SetLineCapStyle(0);
     style3D.SetAltitudeMode(AltitudeMode::Absolute);
 
     return style3D;
@@ -83,3 +84,19 @@ UGColor RouteGlobalVariant::getRouteTypeColor(int Type)
 
     return colors[Type];
 }
+
+//获取注记Style
+UGTextStyle RouteGlobalVariant::getLabelTextStyle(int routeType)
+{
+    UGTextStyle textStyle;
+    textStyle.SetSize(16);
+    textStyle.SetForeColor(getRouteTypeColor(routeType));
+    return textStyle;
+}
+
+UGTextStyle3D RouteGlobalVariant::getLabelTextStyle3D()
+{
+    UGTextStyle3D textStyle3D;
+    textStyle3D.m_dScale = 2;
+    return textStyle3D;
+}
diff --git a/routeglobalvariant.h b/routeglobalvariant.h
index e0215b52..11295eb5 100644
--- a/routeglobalvariant.h
+++ b/routeglobalvariant.h
@@ -2,9 +2,11 @@
 #define ROUTEGLOBALVARIANT_H
 
 #include "Base3D/UGStyle3D.h"
+#include "Toolkit/UGTextStyle.h"
 #include <QString>
 #include <QMap>
 #include <Toolkit/UGStyle.h>
+#include "Base3D/UGTextStyle3D.h"
 
 using namespace UGC;
 
@@ -50,6 +52,10 @@ public:
 
     UGColor getRouteTypeColor(int Type); //获取航线颜色
 
+    UGTextStyle getLabelTextStyle(int routeType=1);//获取注记Style
+
+    UGTextStyle3D getLabelTextStyle3D();//获取注记Style3D
+
 
 public:
 //    QMap<int,QString> RouteType; //航线类型