添加了三维在线地图、地图定位、kml文件导入导出功能;修复了信号槽重复connect连接导致的文件导入菜单重复弹出的bug,修复了显示航线菜单中航线类型选项不固定问题。

master
cbwu 2 years ago
parent 42803d57a0
commit df6b22d7bd

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 9.0.2, 2023-06-14T09:00:44. -->
<!-- Written by QtCreator 10.0.1, 2023-06-14T11:25:10. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>

@ -26,7 +26,7 @@ DisplayRouteDialog::DisplayRouteDialog(QWidget *parent) :
RouteType = routeGVar.getRouteType();
mapType = 0;
this->is3DMap = false;
}
@ -44,11 +44,13 @@ void DisplayRouteDialog::setDataset(UGDatasetPtr dt)
void DisplayRouteDialog::setMapEditorWnd(UGMapEditorWnd *pMapEditorWnd)
{
this->pMapEditorWnd = pMapEditorWnd;
this->is3DMap = false;
}
void DisplayRouteDialog::setSceneControl(SceneControl *pSceneControl)
{
this->pSceneControl = pSceneControl;
this->is3DMap = true;
}
void DisplayRouteDialog::addRouteTypeItem()
@ -71,23 +73,12 @@ void DisplayRouteDialog::addRouteTypeItem()
}
}
void DisplayRouteDialog::setMapType(bool isMap3D)
{
if(isMap3D)
{
mapType = 1;
}
else
{
mapType = 0;
}
}
void DisplayRouteDialog::addRouteNumberItem(UGRecordsetPtr res)
{
ui->RouteNumberCbbox->clear();
QStringList strl;
UGVariant v;
res->MoveFirst();
if(res)
{
while (!res->IsEOF()) { //获取航线编号
@ -400,7 +391,7 @@ void DisplayRouteDialog::on_displayBtn_clicked()
// this->reject();
return;
}
if(mapType==1)
if(is3DMap)
{
showRoute3D();
}

@ -36,9 +36,6 @@ public:
void addRouteTypeItem(); // 添加航线类型
void setMapType(bool isMap3D = false); //设置是否三维地图类型
private slots:
void on_RouteTypeCbbox_currentIndexChanged(int index);
@ -76,7 +73,7 @@ private:
QMap<int,QList<QString>> routeTags;
int mapType;
bool is3DMap; //二三维标识
};
#endif // DISPLAYROUTEDIALOG_H

@ -9,6 +9,7 @@
#include "layeroperator.h"
#include "mapdatamaneger.h"
#include <QMessageBox>
#include "Geometry3D/UGGeoLine3D.h"
GeoFeatureOperator::GeoFeatureOperator()
@ -91,13 +92,35 @@ int GeoFeatureOperator::importFeatureAttribute(UGDatasetVector *dv, UGGeometry*
UGRecordsetPtr saveRes = queryFeature(dv,Translator::QStr2UGStr(queryFilter));
UGGeoLine l;
pGeometry->ConvertToLine(l,0);
UGGeoLine3D* l3D = NULL;
bool is3D = false;
if(pGeometry->GetType()==UGGeometry::GeoLine)
{
pGeometry->ConvertToLine(l,0);
}
else if(pGeometry->GetType()==UGGeometry::GeoLine3D)
{
is3D = true;
l3D = (UGGeoLine3D*) pGeometry;
}
if(isClosedRoute)
{//自动闭合线段
if(l.GetStartNode() != l.GetEndNode())
if(pGeometry->GetType()==UGGeometry::GeoLine)
{
UGPoint2D addPoint = l.GetStartNode();
l.InsertPoint(0,l.GetPointCount(),addPoint); //添加首节点
if(l.GetStartNode() != l.GetEndNode())
{
UGPoint2D addPoint = l.GetStartNode();
l.InsertPoint(0,l.GetPointCount(),addPoint); //添加首节点
}
}
else if(pGeometry->GetType()==UGGeometry::GeoLine3D)
{
if(l3D->GetStartNode() != l3D->GetEndNode())
{
UGPoint3D addPoint = l3D->GetStartNode();
l3D->InsertPoint(0,l3D->GetPointCount(),addPoint); //添加首节点
}
}
}
@ -117,8 +140,13 @@ int GeoFeatureOperator::importFeatureAttribute(UGDatasetVector *dv, UGGeometry*
if (ret == QMessageBox::Yes)
{
saveRes->Edit();
saveRes->SetGeometry(l);
saveRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteHeight),UGVariant(routeHeight));
if(is3D)
saveRes->SetGeometry(*l3D);
else
{
saveRes->SetGeometry(l);
saveRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteHeight),UGVariant(routeHeight));
}
saveRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.IsClosedRoute),UGVariant(isClosedRoute));
saveRes->Update();
@ -138,23 +166,34 @@ int GeoFeatureOperator::importFeatureAttribute(UGDatasetVector *dv, UGGeometry*
//添加航线
if(isAddGeometry)
{
int ss = allRes->AddNew(&l);
int ss;
if(is3D)
ss = allRes->AddNew(l3D);
else
ss = allRes->AddNew(&l);
if(ss<0) return 0;
}
//添加航线信息
allRes->MoveLast();
allRes->Edit();
if(isClosedRoute && !isAddGeometry) allRes->SetGeometry(l);
if(isClosedRoute && !isAddGeometry)
{
if(is3D)
allRes->SetGeometry(*l3D);
else
allRes->SetGeometry(l);
}
// UGVariant v;
// allRes->GetFieldValue(_U("RouteID"),v);
// qDebug()<<"**********************2:"<<v.ToInt();
allRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteID),UGVariant(routeID));
allRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteNumber),UGVariant(routeNumber));
allRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),UGVariant(routeType));
allRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteHeight),UGVariant(routeHeight));
allRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteName),UGVariant(routeName));
allRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.IsClosedRoute),UGVariant(isClosedRoute));
if(!is3D)
allRes->ModifyFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteHeight),UGVariant(routeHeight));
//提交记录修改
allRes->Update();

@ -63,6 +63,7 @@ bool GeoFileParser::importKMLData(UGDataSource *pDataSource, UGString datasetNam
kmlParams.SetDestDTName(datasetName); //设置目标数据集名称
kmlParams.SetFilePathName(Translator::QStr2UGStr(importPath));
kmlParams.SetDestCoordSys(UGPrjCoordSys (4326)); //设置坐标系:WGS-84
// kmlParams.SetOverWrite(true);
UGint ii = kmlParams.GetFileType();
int ss = UGExchangeParamsManager::IsValidImportParams(ii, kmlParams);
@ -81,6 +82,7 @@ bool GeoFileParser::exportKMLData(UGC::UGDataSource *pDataSource, QString datase
exportKMLParams.SetFilePathName(Translator::QStr2UGStr(savePath)); //导出文件全路径
exportKMLParams.SetDtNameToBeExported(Translator::QStr2UGStr(datasetName)); //要导出的数据集名称数据集坐标系必须为WGS-84
exportKMLParams.SetRecordFilter(Translator::QStr2UGStr(strRecordFilter)); //过滤条件
exportKMLParams.SetOverWrite(true); //强制覆盖
return exchange.Export(exportKMLParams);
}

@ -5,6 +5,8 @@
#include "translator.h"
#include "Geometry/UGGeoLine.h"
#include "Geometry/UGGeoPoint.h"
#include "Scene/UGSelection3D.h"
#include "Render/UGRenderObject.h"
LayerOperator::LayerOperator()
{
@ -13,8 +15,6 @@ LayerOperator::LayerOperator()
QMap<int,QStringList> LayerOperator::getSelectedFeature(UGMap *pMap)
{
RouteGlobalVariant routeGVar;
UGLayer* layer = NULL;
UGString layerName;
UGSelection* selection = NULL;
@ -43,7 +43,8 @@ QMap<int,QStringList> LayerOperator::getSelectedFeature(UGMap *pMap)
num.clear();
selection = NULL;
}
selection = NULL;
layer = NULL;
return featureInfo;
}
@ -150,7 +151,6 @@ void LayerOperator::addNodeLabel(UGGeoLine *pGeoline, UGDynamicLayer *pLabelDyLa
UGPoint2D point;
//labelStyle
RouteGlobalVariant routeGVar;
UGTextStyle tSty;
tSty.SetBackColor(routeGVar.getRouteTypeColor(routeType.toInt()));
tSty.SetForeColor(routeGVar.getRouteTypeColor(routeType.toInt()));
@ -182,3 +182,104 @@ void LayerOperator::addNodeLabel(UGGeoLine *pGeoline, UGDynamicLayer *pLabelDyLa
}
}
//导入kml文件时临时显示航线,仅用于二维地图
void LayerOperator::showKMLTemporary(QMapControl *qMapControl, UGRecordsetPtr kmlRes)
{
//添加航线到Tracking Layer
LayerOperator layerOperator;
UGStyle sty;
routeGVar.getTemporaryStyle(sty);
/* Tracking Layer
UGTrackingLayer* pTrackingLayer = &qMapControl->GetMap()->m_TrackingLayer;
layerOperator.addGeometryInTrackingLayer(pTrackingLayer,res,sty);
routeGVar.getHighLightStyle(sty);
UGGeoEvent* pGeoEvent = pTrackingLayer->GetAt(0);
pGeoEvent->SetStyle(sty); //设置第一条航线高亮
*/
//将kml航线临时展示在动态图层
UGMap* pMap = qMapControl->GetMap();
UGDynamicLayer* pDyLayer = NULL;
UGString kmlLayerName = _U("KMLDyLayer");
layerOperator.getDynamicLayer(pMap,pDyLayer,kmlLayerName);
layerOperator.addGeometryInDynamicLayer(pDyLayer,kmlRes,sty);
//设置第一条航线高亮
routeGVar.getHighLightStyle(sty);
pDyLayer->GetAt(0)->SetStyle(&sty);
pMap->m_DynamicLayers.Add(pDyLayer);
qMapControl->Refresh();
pMap = NULL;
}
//添加几何对象到三维追踪层
void LayerOperator::addGeometryToTrackingLayer3D(SceneControl *pSceneControl, UGRecordsetPtr kml3DRes)
{
UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D();
UGGeometry* pGeometry = NULL;
UGGeoLine3D* line3D = NULL;
UGRenderObject* ro = NULL;
UGStyle3D sty;
routeGVar.getHighLightStyle3D(sty);
//高亮当前正在导入的线段
int i = 1;
kml3DRes->MoveFirst();
kml3DRes->GetGeometry(pGeometry);
line3D = (UGGeoLine3D*)pGeometry;
line3D->SetStyle3D(&sty);
trackingLayer3D->Add(line3D,Translator::QStr2UGStr("Geometry"+QString::number(i)));
kml3DRes->MoveNext();
pGeometry = NULL;
line3D = NULL;
ro = NULL;
// 剩余默认风格
routeGVar.getTemporaryStyle3D(sty);
while (!kml3DRes->IsEOF()) {
i++;
kml3DRes->GetGeometry(pGeometry);
line3D = (UGGeoLine3D*)pGeometry;
line3D->SetStyle3D(&sty);
ro = trackingLayer3D->Add(line3D,Translator::QStr2UGStr("Geometry"+QString::number(i)));
// ro->SetStyle3D(&sty);
kml3DRes->MoveNext();
pGeometry = NULL;
line3D = NULL;
ro = NULL;
}
trackingLayer3D = NULL;
}
// 获取Layer3D中选中几何对象标记信息
QMap<int, QStringList> LayerOperator::getSelectedFeature3D(SceneControl *pSceneControl)
{
UGArray<UGSelection3D*>* pSelectionArr = NULL;
UGSelection3D* selection = NULL;
UGRecordsetPtr res;
UGVariant v;
QStringList num;
QMap<int,QStringList> featureInfo;
pSelectionArr = pSceneControl->GetGeoSelections();
for(int i = 0;i<pSelectionArr->GetSize();i++)
{//获取选中要素的航线编号以及航线类型,用于数据集查询
selection = pSelectionArr->GetAt(i);
res = pSceneControl->ToRecordset(selection);
res->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),v);
int type = v.ToInt();
res->MoveFirst();
while(!res->IsEOF())
{
res->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteNumber),v);
num << Translator::UGStr2QStr(v.ToString());
res->MoveNext();
}
featureInfo.insert(type,num);
num.clear();
selection = NULL;
res = NULL;
}
pSelectionArr = NULL;
return featureInfo;
}

@ -4,6 +4,9 @@
#include "Map/UGMap.h"
#include "Scene/UGLayer3D.h"
#include <QStringList>
#include "routeglobalvariant.h"
#include "qmapcontrol.h"
#include "scenecontrol.h"
using namespace UGC;
@ -30,6 +33,21 @@ public:
//添加航点标记
void addNodeLabel(UGGeoLine* pGeoline,UGDynamicLayer* pLabelDyLayer,QString routeType,QString routeNum);
//导入kml文件时临时显示航线
void showKMLTemporary(QMapControl* qMapControl,UGRecordsetPtr kmlRes);
public: //用于三维场景的函数
//导入kml3D文件时临时显示航线
void showKML3DTemporary(SceneControl* pSceneControl,UGRecordsetPtr kml3DRes);
//添加几何对象到三维追踪层
void addGeometryToTrackingLayer3D(SceneControl* pSceneControl,UGRecordsetPtr kml3DRes);
// 获取Layer3D中选中几何对象标记信息
QMap<int,QStringList> getSelectedFeature3D(SceneControl* pSceneControl);
private:
RouteGlobalVariant routeGVar;
};
#endif // LAYEROPERATOR_H

@ -50,6 +50,7 @@
#include "Scene/UGLayer3DManager.h"
#include "Render/UGRenderManager.h"
#include "Render/UGRenderModelPro.h"
#include "Render/UGRenderLine3D.h"
#include "Base3D/UGBoundingBox.h"
#include "Geometry/UGGeoPicture.h"
#include "Geometry3D/UGGeoPlacemark.h"
@ -801,7 +802,6 @@ void MainWindow::addSceneActionConnect()
DisplayRouteDialog displayRouteDlg;
displayRouteDlg.setDataset(Route3D_ds);
displayRouteDlg.setSceneControl(pSceneControl);
displayRouteDlg.setMapType(true);
displayRouteDlg.addRouteTypeItem();
displayRouteDlg.exec();
@ -809,9 +809,13 @@ void MainWindow::addSceneActionConnect()
});
// 连接信号actionImportRoute和槽导入
connect(actionImportRoute,&QAction::triggered,this,[=](){
importKMLData();
connect(actionSceneImportRoute,&QAction::triggered,this,[=](){
importKML3DData();
});
/********************场景右键属性菜单信号槽连接********************/
//连接actionExportFile与KML导出函数
connect(actionExportFile,&QAction::triggered,this,&MainWindow::exportKMLFile);
}
//Scene连接信号和槽的函数
@ -820,6 +824,9 @@ void MainWindow::addSceneConnect()
// connect(pSceneView,&SceneView::sendTrackedGeometry,this,&MainWindow::showSaveRoute3DDialog);
connect(pSceneView,&SceneView::showSettingFlightPointDialg,this,&MainWindow::showSettingFlightPoint3DDialog);
//连接右键属性菜单信号
connect(pSceneView,&SceneView::showAttributeMenu,this,&MainWindow::showAttributeMenu);
}
@ -870,18 +877,13 @@ void MainWindow::importKMLData()
GeoFeatureOperator geoFtOperator;
UGRecordsetPtr kmlRes = geoFtOperator.queryFeature(kmlDv);
//添加航线到Tracking Layer
LayerOperator layerOperator;
RouteGlobalVariant routeGVar;
UGStyle sty;
routeGVar.getTemporaryStyle(sty);
/* Tracking Layer
UGTrackingLayer* pTrackingLayer = &qMapControl->GetMap()->m_TrackingLayer;
layerOperator.addGeometryInTrackingLayer(pTrackingLayer,res,sty);
routeGVar.getHighLightStyle(sty);
UGGeoEvent* pGeoEvent = pTrackingLayer->GetAt(0);
pGeoEvent->SetStyle(sty); //设置第一条航线高亮
*/
// if(mapType==MapType::Map2D)
// layerOperator.showKMLTemporary(qMapControl,kmlRes);
//将kml航线临时展示在动态图层
UGMap* pMap = qMapControl->GetMap();
UGDynamicLayer* pDyLayer = NULL;
@ -920,17 +922,18 @@ void MainWindow::importKMLData()
//qDebug()<<"*******************RecordCount:"<<dstDV->GetObjectCount();
// kmlRes->MoveNext();
pGeometry = NULL;
kmlDv = NULL;
});
//高亮当前要导入的航线
connect(saveRouteDlg,&saveRouteDialog::highLightGeometry,this,[&](int currentGeometryID,int lastGeometryID){
// UGDynamicLayer* pDyLayer = qMapControl->GetMap()->m_DynamicLayers.GetDynamicLayer(kmlLayerName);
//取消原高亮几何对象
routeGVar.getTemporaryStyle(sty);
pDyLayer->GetAt(lastGeometryID-1)->SetStyle(&sty);
// 高亮新几何对象
routeGVar.getHighLightStyle(sty);
pDyLayer->GetAt(currentGeometryID-1)->SetStyle(&sty);
qMapControl->Refresh();
});
//显示弹窗
@ -941,9 +944,201 @@ void MainWindow::importKMLData()
pDataSource->DeleteDataset(dtName);
pDyLayer->RemoveAll();
qMapControl->Refresh();
pDyLayer = NULL;
pDataSource = NULL;
}
}
//导入三维KML数据
void MainWindow::importKML3DData()
{
//获取文件路径
QString qStrPath = QFileDialog::getOpenFileName(this,"导入KML/KMZ文件",
":/supermap-iobjectscpp/MyProject/MapDisplay/SampleData/",
"Google KML(*.kml *.kmz)");
if(qStrPath.isEmpty())
{
return;
}
//获取数据源
UGDataSource* pDataSource = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
if(pDataSource==NULL) return;
//打开KML文件
UGString dtName = pDataSource->GetUnoccupiedDatasetName(_U("KML3D"));//导入数据集名称
GeoFileParser GeoFP;
bool issucceed = GeoFP.importKMLData(pDataSource,dtName,qStrPath);
if(issucceed)
{
UGDatasetPtr kmlDt = pDataSource->GetDataset(dtName);
UGDatasetVector* kmlDv = (UGDatasetVector*) kmlDt.get();
if(!kmlDv->IsOpen()) kmlDv->Open();
GeoFeatureOperator geoFtOperator;
UGRecordsetPtr kml3DRes = geoFtOperator.queryFeature(kmlDv);
LayerOperator layerOperator;
RouteGlobalVariant routeGVar;
UGStyle3D defaultStyle;
UGStyle3D highLightStyle;
routeGVar.getTemporaryStyle3D(defaultStyle);
routeGVar.getHighLightStyle3D(highLightStyle);
// sty.SetAltitudeMode(AltitudeMode::Absolute);
UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D();
//添加到追踪层
// layerOperator.addGeometryToTrackingLayer3D(pSceneControl,kml3DRes);
//设置第一条航线高亮
UGGeoLine3D* line3D = NULL;
UGGeometry* pGeometry = NULL;
UGVariant v;
UGVariant v1;
UGString tag;
kml3DRes->MoveFirst();
kml3DRes->GetGeometry(pGeometry);
kml3DRes->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),v);
kml3DRes->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteNumber),v1);
tag = v.ToString() + _U("_") + v1.ToString();
line3D = (UGGeoLine3D*)pGeometry;
line3D->SetStyle3D(&highLightStyle);
trackingLayer3D->Add(line3D,tag);
//设置第一条航线高亮
// routeGVar.getHighLightStyle3D(sty);
// trackingLayer3D->GetAt(0)->SetStyle3D(&highLightStyle);
// UGStyle3D* sty = trackingLayer3D->GetAt(1)->GetStyle3D();
// trackingLayer3D->GetAt(0)->GetStyle3D()->SetLineColor3D(highLightStyle.GetLineColor3D());
// routeGVar.getTemporaryStyle3D(sty);
// trackingLayer3D->GetAt(0)->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D());
// routeGVar.getHighLightStyle3D(sty);
// trackingLayer3D->GetAt(1)->SetStyle3D(&sty);
// trackingLayer3D->GetAt(1)->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D());
// routeGVar.getTemporaryStyle3D(sty);
// trackingLayer3D->GetAt(1)->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D());
// routeGVar.getHighLightStyle3D(sty);
// trackingLayer3D->GetAt(1)->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D());
// trackingLayer3D->SetRefresh(false);
//航线属性信息导入
kml3DRes->MoveFirst();
UGDatasetVector* dstDV = (UGDatasetVector*)pDataSource->GetDataset(line3DSetAlias).get();
if(!dstDV->IsOpen()) dstDV->Open();
// UGGeometry* pGeometry = NULL;
QMap<QString,QString> fieldsValue;
saveRouteDialog* saveKMLDlg = new saveRouteDialog();
saveKMLDlg->setHeightVisible(false);
//连接航线导入状态信号
connect(this,&MainWindow::sendAddRouteState,saveKMLDlg,&saveRouteDialog::getAddRouteState,Qt::UniqueConnection);
//连接航线导入信号
connect(saveKMLDlg,&saveRouteDialog::importRoute,this,[&](int routeID,int routeType,int routeNumber,double routeHeight,int routeClosedState){
//移动指针到当前航线
kml3DRes->MoveTo(routeID-1);
//提取航线属性信息
GeoFeatureOperator geoFtOperator;
fieldsValue.insert(routeGVar.routeFieldsName.RouteID,QString::number(dstDV->GetObjectCount()+1));
fieldsValue.insert(routeGVar.routeFieldsName.RouteHeight,QString::number(routeHeight));
fieldsValue.insert(routeGVar.routeFieldsName.RouteNumber,QString::number(routeNumber));
fieldsValue.insert(routeGVar.routeFieldsName.RouteType,QString::number(routeType));
fieldsValue.insert(routeGVar.routeFieldsName.IsClosedRoute,QString::number(routeClosedState));
//导入数据集
kml3DRes->GetGeometry(pGeometry);
int ss = geoFtOperator.importFeatureAttribute(dstDV,pGeometry,fieldsValue);
emit sendAddRouteState(ss);
//qDebug()<<"*******************RecordCount:"<<dstDV->GetObjectCount();
// kmlRes->MoveNext();
pGeometry = NULL;
kmlDv = NULL;
});
//高亮当前要导入的航线
connect(saveKMLDlg,&saveRouteDialog::highLightGeometry,this,[&](int currentGeometryID,int lastGeometryID){
// qDebug()<<"********************currentGeometryID:"<<currentGeometryID;
// qDebug()<<"********************lastGeometryID:"<<lastGeometryID;
// qDebug()<<"***********************Count:"<<trackingLayer3D->GetCount();
trackingLayer3D->RemoveAll();
line3D = NULL;
pGeometry = NULL;
// trackingLayer3D->RemoveAt(currentGeometryID-1);
kml3DRes->MoveTo(currentGeometryID-1);
kml3DRes->GetGeometry(pGeometry);
line3D = (UGGeoLine3D*)pGeometry;
line3D->SetStyle3D(&highLightStyle);
kml3DRes->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteType),v);
kml3DRes->GetFieldValue(Translator::QStr2UGStr(routeGVar.routeFieldsName.RouteNumber),v1);
tag = v.ToString() + _U("_") + v1.ToString();
trackingLayer3D->Add(line3D,tag);
});
//connect(saveKMLDlg,&saveRouteDialog::highLightGeometry,this,&MainWindow::highLightKMLGeometry);
//显示弹窗
saveKMLDlg->setMaxValue(kml3DRes->GetRecordCount());
int ret = saveKMLDlg->exec();
// saveKMLDlg->show();
//清除数据集和临时航线图层
pDataSource->DeleteDataset(dtName);
trackingLayer3D->RemoveAll();
// trackingLayer3D->SetRefresh(false);
// routeGVar.getHighLightStyle3D(sty);
// trackingLayer3D->GetAt(0)->SetStyle3D(&sty);
// routeGVar.getTemporaryStyle3D(sty);
// trackingLayer3D->GetAt(0)->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D());
// trackingLayer3D->GetAt(0)->SetStyle3D(&sty);
// routeGVar.getHighLightStyle3D(sty);
// trackingLayer3D->GetAt(1)->SetStyle3D(&sty);
// trackingLayer3D->GetAt(1)->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D());
// pSceneControl->GetScene3D()->UpdateData();
// pSceneControl->GetScene3D()->Refresh();
// pSceneControl->Refresh();
// pDataSource->DeleteDataset(dtName);
delete saveKMLDlg;
pDataSource = NULL;
}
}
//导出KML文件
void MainWindow::exportKMLFile()
{
QString savePath = QFileDialog::getSaveFileName(this, tr("导出KML文件"),
"/航线1",
tr("Google KML(*.kml);;Google KML(*.kmz)"));
// qDebug()<<"*********************************导出被调用了!";
if(savePath.isEmpty()) return;
LayerOperator layerOpt;
QMap<int,QStringList> featureInfo;
if(mapType==MapType::Map2D)
featureInfo = layerOpt.getSelectedFeature(qMapControl->GetMap());
else if(mapType==MapType::Map3D)
featureInfo = layerOpt.getSelectedFeature3D(pSceneControl);
//构造SQL查询条件
QStringList filterlist;
QList<int> types = featureInfo.keys();
for(int i = 0; i < types.size(); i++)
{
filterlist<< "(RouteNumber in (" + featureInfo[types[i]].join(",") + ") and " + "RouteType = " + QString::number(types[i]) + ")";
}
QString filter = filterlist.join(" or ");
// 导出
UGDataSource* ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
if(!ds->IsOpen()) ds->Open();
GeoFileParser GeoFP;
RouteGlobalVariant routeGVar;
if(mapType==MapType::Map2D)
GeoFP.exportKMLData(ds,Translator::UGStr2QStr(routeGVar.workspaceDataName.LineDatasetName),savePath,filter);
else if(mapType==MapType::Map3D)
GeoFP.exportKMLData(ds,Translator::UGStr2QStr(routeGVar.workspaceDataName.Line3DDatasetName),savePath,filter);
ds = NULL;
}
//加载三维模型数据
void MainWindow::loadModelData()
{
@ -1082,7 +1277,7 @@ void MainWindow::loadModelData()
// pDataSource = NULL;
//模型移动测试
UGDatasetVector* dv = (UGDatasetVector*)pDataSource->GetDataset(_U("Plane")).get(); //FlightLines3D
// UGDatasetVector* dv = (UGDatasetVector*)pDataSource->GetDataset(_U("FlightLines3D")).get(); //FlightLines3D
// ShowPlane3D* plane3D = new ShowPlane3D(pSceneControl,dv);
// plane3D->setPlanesCount(1);
// plane3D->startFly();
@ -1165,11 +1360,11 @@ void MainWindow::loadModelData()
UGStyle3D style3D;
// style3D.SetMarker3D(true);
// style3D.SetScaleBySymbol(true);
style3D.SetFixedPixelSize(false);
style3D.SetFill3DMode(UGC::/*UGFill3DMode::*/FILL_FACE);
// style3D.SetFixedPixelSize(false);
// style3D.SetFill3DMode(UGC::/*UGFill3DMode::*/FILL_FACE);
style3D.SetAltitudeMode(AltitudeMode::Absolute);
// style3D.SetLineWidth(1);
// style3D.SetLineColor(UGRGB(255,0,0));
style3D.SetLineWidth(1);
style3D.SetLineColor(UGRGB(255,0,0));
// style3D.SetFillBackColor(UGRGB(255,0,0));
// style3D.SetFillForeColor(UGRGB(255,0,0));
// style3D.SetFillColor(UGRGB(255,0,0));
@ -1191,16 +1386,16 @@ void MainWindow::loadModelData()
bool ls1 = layer3DMag.LoadLayer3D(_U("D:/supermap-iobjectscpp/bin/bin_x64/SuLayer3DFile.l3d"));
// UGLayer3D* planeLayer = layer3DMag.CreateLayer3D(UGLayer3DType::l3dDynamicModel);
// UGLayer3DDynamic* dyLayer3D = (UGLayer3DDynamic*)planeLayer;
UGLayer3DDynamic* p_UGLayer3DDynamic = (UGLayer3DDynamic*)layers->AddLayer(UGC::UGLayer3DType::l3dDynamicModel, _U("AA@Route"), _U("BB"), TRUE);
// UGLayer3DDynamic* p_UGLayer3DDynamic = (UGLayer3DDynamic*)layers->AddLayer(UGC::UGLayer3DType::l3dDynamicModel, _U("AA@Route"), _U("BB"), TRUE);
// dyLayer3D->SetInitialized(true);
// UGLayer3DDynamic* dyLayer3D = new UGLayer3DDynamic();
UGDynamicObjectlState dyObjState;
dyObjState.ID = 0;
dyObjState.Altitude = 25;
dyObjState.Latitude = 32.234317;
dyObjState.Longitude = 119.718567;
p_UGLayer3DDynamic->AddObjectFromFile(_U("D:/plane.s3m"),dyObjState,1);
p_UGLayer3DDynamic->SetStyle3D(style3D);
// UGDynamicObjectlState dyObjState;
// dyObjState.ID = 0;
// dyObjState.Altitude = 25;
// dyObjState.Latitude = 32.234317;
// dyObjState.Longitude = 119.718567;
// p_UGLayer3DDynamic->AddObjectFromFile(_U("D:/plane.s3m"),dyObjState,1);
// p_UGLayer3DDynamic->SetStyle3D(style3D);
// dyLayer3D->SetStyle3D(style3D);
// bool ss = dyLayer3D->SaveKML(_U("E:/b.kml"));
// UGLayer3DModel* modelLayer3D = new UGLayer3DModel();
@ -1295,8 +1490,10 @@ void MainWindow::loadModelData()
// kmlLayer->Add(model,_U("model"));
// UGGeoLine3D* l = (UGGeoLine3D*)geometry;
// l->SetStyle3D(&style3D);
// UGStyle3D sty3D;
// sty3D.SetLineWidth(2);
// sty3D.SetLineColor3D(UGRGB(0,0,255));
// sty3D.SetAltitudeMode(AltitudeMode::Absolute);
// l->SetStyle3D(&sty3D);
@ -1309,14 +1506,14 @@ void MainWindow::loadModelData()
// pl->SetName(_U("Test"));
// pl->SetGeometry(model);
UGStyle3D sty3D;
// UGStyle3D sty3D;
// sty3D.SetMarkerStyle(318); //253268
//// sty3D.SetMarker3D(true);
sty3D.SetPointColor(UGRGB(255,0,0));
sty3D.SetMarkerSize(30);
// sty3D.SetPointColor(UGRGB(255,0,0));
// sty3D.SetMarkerSize(30);
// sty3D.SetFill3DMode(UGC::/*UGFill3DMode::*/FILL_FACE);
sty3D.SetAltitudeMode(AltitudeMode::Absolute);
sty3D.SetBottomAltitude(20);
// sty3D.SetAltitudeMode(AltitudeMode::Absolute);
// sty3D.SetBottomAltitude(20);
// p->SetStyle3D(&sty3D);
// pl->SetStyle3D(&sty3D);
// plotLayer->Add(p,_U("point"));
@ -1353,12 +1550,15 @@ void MainWindow::loadModelData()
// UGGeoPicture* pt = (UGGeoPicture*) geometry;
// UGGeoLine3D* l = (UGGeoLine3D*) geometry;
// l->SetStyle3D(&style3D);
UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D();
// UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D();
// trackingLayer3D->SetAlwaysRender(true);
// trackingLayer3D->SetWorkspace(m_pWorkspace);
// trackingLayer3D->SetUseGeoStyle(true);
// qDebug()<<"**************TrackingCount0:"<<trackingLayer3D->GetCount();
// trackingLayer3D->Add(GP,_U("picture"));
// trackingLayer3D->Add(l,_U("picture"));
// UGStyle3D* sty1 = trackingLayer3D->GetAt(0)->GetStyle3D();
// sty1->SetLineColor(UGRGB(0,0,255));
// trackingLayer3D->GetAt(0)->SetStyle3D(&sty3D);
// pSceneControl->GetSceneEditWnd()->SetUserAction(UGSceneUserAction::suaEdit,UGEditType3D::ET3D_PolyLine); //
// trackingLayer3D->SetEditable(true);
// trackingLayer3D->SetRefresh(false);
@ -1392,9 +1592,9 @@ void MainWindow::loadModelData()
// qDebug()<<"**************RenderObjectSize1:"<<rol->GetSize();
// UGRenderObject* ro = trackingLayer3D->GetAt(0);
// qDebug()<<"**************RenderObjectVisible:"<<ro->IsVisible();
pSceneControl->Refresh();
// pSceneControl->Refresh();
// scene->UpdateData();
scene->Refresh();
// scene->Refresh();
// pSceneControl->GetScene3D()->GetCamera(_U("Camera"))->FlyTo(model);
// pSceneControl->GetScene3D()->Refresh();
@ -1445,33 +1645,7 @@ void MainWindow::showOnlineMapDialog()
void MainWindow::showAttributeMenu()
{
rMenuType = RBtnMenuType::AttributeMenu;
connect(actionExportFile,&QAction::triggered,this,[=](){
QString savePath = QFileDialog::getSaveFileName(this, tr("导出KML文件"),
"/航线1",
tr("Google KML(*.kml);;Google KML(*.kmz)"));
if(savePath.isEmpty()) return;
UGMap* pMap = qMapControl->GetMap();
LayerOperator layerOpt;
QMap<int,QStringList> featureInfo;
featureInfo = layerOpt.getSelectedFeature(pMap);
//构造SQL查询条件
QStringList filterlist;
QList<int> types = featureInfo.keys();
for(int i = 0; i < types.size(); i++)
{
filterlist<< "(RouteNumber in (" + featureInfo[types[i]].join(",") + ") and " + "RouteType = " + QString::number(types[i]) + ")";
}
QString filter = filterlist.join(" or ");
// 导出
UGDataSource* ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));
if(!ds->IsOpen()) ds->Open();
GeoFileParser GeoFP;
GeoFP.exportKMLData(ds,"FlightLines",savePath,filter);
// qDebug()<<"****************Succes:"<<exportKMLData(ds,"temp0",savePath); //,"RouteNumber = 1 and RouteType=1"
});
connect(actionExportFile,&QAction::triggered,this,&MainWindow::exportKMLFile,Qt::UniqueConnection);
attributeRBtnMenu->exec(QCursor::pos());
rMenuType = RBtnMenuType::DefaultMenu;
}
@ -1837,6 +2011,37 @@ void MainWindow::showSaveRoute3DDialog(UGGeometry* pGeometry)
dv = NULL;
}
//高亮当前导入的KML 3D几何对象
void MainWindow::highLightKMLGeometry(int currentGeometryID, int lastGeometryID)
{
UGTrackingLayer3D* trackingLayer3D = pSceneControl->GetTrackingLayer3D();
qDebug()<<"********************currentGeometryID:"<<currentGeometryID;
qDebug()<<"********************lastGeometryID:"<<lastGeometryID;
qDebug()<<"***********************Count:"<<trackingLayer3D->GetCount();
RouteGlobalVariant routeGVar;
UGStyle3D sty;
// 取消原高亮几何对象
// routeGVar.getHighLightStyle3D(sty);
routeGVar.getTemporaryStyle3D(sty);
UGRenderObject* ro = trackingLayer3D->GetAt(lastGeometryID-1); //
// ro->SetAffectedByGlobalEffects(false);
// ro->SetStyle3D(&sty);
ro->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D()); //
// qDebug()<<"********************R:"<<ro->GetStyle3D()->GetLineColor3D().r;
// qDebug()<<"********************g:"<<ro->GetStyle3D()->GetLineColor3D().g;
// qDebug()<<"********************b:"<<ro->GetStyle3D()->GetLineColor3D().b;
// qDebug()<<"********************Type:"<<ro->GetType();
// 高亮新几何对象
routeGVar.getHighLightStyle3D(sty);
UGRenderObject* ro1 = trackingLayer3D->GetAt(currentGeometryID-1);//
// ro1->SetAffectedByGlobalEffects(false);
// ro1->SetStyle3D(&sty);
ro1->GetStyle3D()->SetLineColor3D(sty.GetLineColor3D()); //
// pSceneControl->GetScene3D()->UpdateData();
// pSceneControl->GetScene3D()->Refresh();
// pSceneControl->Refresh();
}
//右键菜单处理函数
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
@ -1847,6 +2052,7 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
if(rMenuType==RBtnMenuType::DefaultMenu && mapType == MapType::Map3D)
{
/*
UGCameraWorld* camera = pSceneControl->GetScene3D()->GetCamera(_U("Camera"));
UGCameraState cs = camera->m_StateCamera;
pSceneControl->GetCameraWorld()->GetCamera(cs);
@ -1878,6 +2084,7 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
qDebug()<<"*************q.y:"<<q.y;
qDebug()<<"*************q.z:"<<q.z;
qDebug()<<"*************q.w:"<<q.w;
*/
// if(pSceneControl->GetSceneEditWnd()->GetUserAction() != 105) return;
@ -1977,13 +2184,19 @@ void MainWindow::viewEntire()
//平移浏览地图操作
void MainWindow::pan()
{
qMapControl->Pan();
if(mapType==MapType::Map2D)
qMapControl->Pan();
else if(mapType==MapType::Map3D)
pSceneControl->Pan();
}
//选择要素操作
void MainWindow::Select()
{
qMapControl->Select();
if(mapType==MapType::Map2D)
qMapControl->Select();
else if(mapType==MapType::Map3D)
pSceneControl->Select();
}
#pragma endregion }
@ -2057,12 +2270,6 @@ void MainWindow::drawPoint()
//绘制线
void MainWindow::drawLine()
{
// int count = pSceneControl->GetSceneEditWnd()->GetScene3D()->m_Layers.GetInnerCount();
// for(int n=0;n<count; n++)
// {
// qDebug()<<"*******************:"<<Translator::UGStr2QStr(pSceneControl->GetSceneEditWnd()->GetScene3D()->m_Layers.GetLayerInnerAt(n)->GetName());
// }
//获取数据源
UGDataSource* ds = m_pWorkspace->GetDataSource(Translator::QStr2UGStr(routeName));

@ -95,7 +95,11 @@ private:
UGbool DirExist(QString fullPath); //判断文件夹是否存在
void importKMLData(); //导入KML
void importKMLData(); //导入KML,仅用于二维地图
void importKML3DData(); //导入KML,仅用于三维地图
void exportKMLFile(); //导出KML文件
//加载模型文件
void loadModelData();
@ -246,5 +250,7 @@ public slots:
void showSaveRoute3DDialog(UGGeometry* pGeometry); //显示三维航线保存对话框
void highLightKMLGeometry(int currentGeometryID,int lastGeometryID); //高亮当前导入的KML 3D几何对象
};
#endif // MAINWINDOW_H

@ -40,6 +40,22 @@ UGStyle3D RouteGlobalVariant::getRouteStyle3D(int routeType)
return style3D;
}
void RouteGlobalVariant::getTemporaryStyle3D(UGStyle3D &temporaryStyle)
{
temporaryStyle.SetLineStyle(6);
temporaryStyle.SetLineColor3D(UGRGB(255,255,255));
temporaryStyle.SetLineWidth(1);
temporaryStyle.SetAltitudeMode(AltitudeMode::Absolute);
}
void RouteGlobalVariant::getHighLightStyle3D(UGStyle3D &highLightStyle)
{
highLightStyle.SetLineStyle(6);
highLightStyle.SetLineColor3D(UGRGB(0,0,255));
highLightStyle.SetLineWidth(1);
highLightStyle.SetAltitudeMode(AltitudeMode::Absolute);
}
//获取航线类型
QMap<int, QString> RouteGlobalVariant::getRouteType()
{
@ -66,28 +82,4 @@ UGColor RouteGlobalVariant::getRouteTypeColor(int Type)
colors[6] = UGRGB(152,78,163); //跑道航线
return colors[Type];
/*
switch (Type) {
case 1:
return colors[1];
break;
case 2:
return colors[2];
break;
case 3:
return colors[3];
break;
case 4:
return colors[4];
break;
case 5:
return colors[5];
break;
case 6:
return colors[6];
break;
default:
break;
}
*/
}

@ -42,6 +42,10 @@ public:
UGStyle3D getRouteStyle3D(int routeType);
void getTemporaryStyle3D(UGStyle3D &temporaryStyle); //获取临时显示风格
void getHighLightStyle3D(UGStyle3D &highLightStyle); //获取高亮风格
QMap<int,QString> getRouteType(); // 获取航线类型
UGColor getRouteTypeColor(int Type); //获取航线颜色

@ -279,7 +279,7 @@ void SceneControl::Refresh()
pLayer->SetInitialized(false);
pLayers->RefreshRasterLayer(pLayer);
}
pLayers = NULL;
}
void SceneControl::Refresh(UGLayer3D *pLayer)
@ -287,6 +287,8 @@ void SceneControl::Refresh(UGLayer3D *pLayer)
UGLayer3Ds* pLayers = GetUGLayer3Ds();
pLayer->SetInitialized(false);
pLayers->RefreshRasterLayer(pLayer);
pLayers = NULL;
}
void SceneControl::RenderInTimer() {
@ -610,43 +612,46 @@ UGArray<UGSelection3D*>* SceneControl::GetGeoSelections()
}
pSelectionArr->Add(pSelection);
}
pLayer = NULL;
pSelection = NULL;
}
pLayers = NULL;
return pSelectionArr;
}
UGRecordset* SceneControl::ToRecordset(UGSelection3D* pSelection, bool isEditable /*= false*/)
UGRecordsetPtr SceneControl::ToRecordset(UGSelection3D* pSelection, bool isEditable /*= false*/)
{
UGRecordset* pRecordset = NULL;
UGRecordsetPtr pRecordset = NULL;
if (NULL != pSelection && pSelection->GetSize() > 0)
{
UGLayer3D* pLayer = pSelection->GetLayer3D();
UGDatasetVector* pDataset = NULL;
// UGDatasetVector* pDataset = NULL;
UGDatasetPtr pDataset = NULL;
UGLayer::UGLayerType type = (UGLayer::UGLayerType)pLayer->GetType();
switch (type)
{
case UGC::/*UGLayer3DType::*/l3dDatasetVector:
{
UGLayer3DDatasetVector* pLayer3DDatasetVector = (UGLayer3DDatasetVector*)(pLayer);
pDataset = (UGDatasetVector*)pLayer3DDatasetVector->GetDataset().get();
pDataset = pLayer3DDatasetVector->GetDataset();
break;
}
case UGC::/*UGLayer3DType::*/l3dDatasetModelPro:
{
UGLayer3DDatasetModelPro* pLayer3DDatasetModel = (UGLayer3DDatasetModelPro*)(pLayer);
pDataset = (UGDatasetVector*)pLayer3DDatasetModel->GetDataset().get();
pDataset = pLayer3DDatasetModel->GetDataset();
break;
}
case UGC::/*UGLayer3DType::*/l3dDatasetVectorPoint:
{
UGLayer3DDatasetVectorPoint* pLayer3DDatasetPoint = (UGLayer3DDatasetVectorPoint*)(pLayer);
pDataset = (UGDatasetVector*)pLayer3DDatasetPoint->GetDataset().get();
pDataset = pLayer3DDatasetPoint->GetDataset();
break;
}
case UGC::/*UGLayer3DType::*/l3dDatasetVectorLR:
{
UGLayer3DDatasetVectorLR* pLayer3DDatasetRegion = (UGLayer3DDatasetVectorLR*)(pLayer);
pDataset = (UGDatasetVector*)pLayer3DDatasetRegion->GetDataset().get();
pDataset = pLayer3DDatasetRegion->GetDataset();
break;
}
@ -692,11 +697,12 @@ UGRecordset* SceneControl::ToRecordset(UGSelection3D* pSelection, bool isEditabl
queryDef.m_nMode = UGQueryDef::GeneralQuery;
queryDef.m_nCursorType = UGQueryDef::OpenDynamic; // OpenStatic, 用于读取数据OpenDynamic, 用于数据增删改
UGDatasetVector* dv = (UGDatasetVector*)pDataset.get();
UGFieldInfos fieldInfos;
pDataset->GetFieldInfos(fieldInfos); // 获取字段信息可用来添加或删除非系统字段只是用于查找字段值也可通过UGRecordset获取
int countOld = pDataset->GetRecordsetCount();
dv->GetFieldInfos(fieldInfos); // 获取字段信息可用来添加或删除非系统字段只是用于查找字段值也可通过UGRecordset获取
int countOld = dv->GetRecordsetCount();
pRecordset = pDataset->Query(queryDef).get();
pRecordset = dv->Query(queryDef);
}
}
@ -898,7 +904,10 @@ void SceneControl::ZoomFree()
void SceneControl::Select()
{
m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaPointSelect);
// m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaPointSelect);
// m_pUGSceneWnd->m_SceneWindow.SetUserAction(UGSceneUserAction::suaRectSelect);
m_pUGSceneWnd->SetUserAction(UGSceneUserAction::suaPointSelect);
// qDebug()<<"*********************:"<<m_pUGSceneWnd->GetUserAction();
}
void SceneControl::ViewEntire()

@ -266,7 +266,7 @@ using namespace UGC;
* @pSelection UGSelection3D*
* @isEditable false,
*/
UGRecordset* ToRecordset(UGSelection3D* pSelection, bool isEditable=false);
UGRecordsetPtr ToRecordset(UGSelection3D* pSelection, bool isEditable=false);
// 全幅显示指定图层
void ViewToLayer(UGLayer3D* pLayer);

@ -181,6 +181,11 @@ void SceneView::mouseReleaseEvent(QMouseEvent* event)
else if (event->button() == Qt::RightButton)
{// RightButton
m_pSceneControl->OnRMouseUp(flag, event->x(), event->y());
if(m_pSceneControl->GetGeoSelections()!=NULL)
{//当前有选中状态,则右键弹出属性菜单
// qDebug()<<"********************右键菜单被调用了";
emit showAttributeMenu();
}
}
else if (event->button() == Qt::MidButton)
{// MidButton

@ -68,6 +68,7 @@ signals:
void sendTrackedGeometry(UGGeometry* pGeometry); //发送绘制完的3D几何对象信号
void sendTrackingGeometry(UGGeometry* pGeometry);
void showSettingFlightPointDialg(); //显示航点信息信号
void showAttributeMenu(); //显示右键属性菜单
public slots:
void RenderInTimer();

Loading…
Cancel
Save