You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
286 lines
9.0 KiB
C++
286 lines
9.0 KiB
C++
#include "layeroperator.h"
|
|
#include "qdebug.h"
|
|
#include "routeglobalvariant.h"
|
|
|
|
#include "translator.h"
|
|
#include "Geometry/UGGeoLine.h"
|
|
#include "Geometry/UGGeoPoint.h"
|
|
#include "Scene/UGSelection3D.h"
|
|
#include "Render/UGRenderObject.h"
|
|
|
|
LayerOperator::LayerOperator()
|
|
{
|
|
|
|
}
|
|
|
|
QMap<int,QStringList> LayerOperator::getSelectedFeature(UGMap *pMap)
|
|
{
|
|
UGLayer* layer = NULL;
|
|
UGString layerName;
|
|
UGSelection* selection = NULL;
|
|
UGRecordsetPtr res;
|
|
UGVariant v;
|
|
QStringList num;
|
|
QMap<int,QStringList> featureInfo;
|
|
for(int i=1;i<=routeGVar.getRouteType().count();i++)
|
|
{
|
|
layerName = Translator::QStr2UGStr("RouteLayer" + QString::number(i));
|
|
if(!pMap->m_Layers.IsLayerExisted(layerName)) continue;
|
|
layer = pMap->m_Layers.GetLayer(layerName);
|
|
selection = layer->GetSelection();
|
|
if(selection->IsEmpty()) continue;
|
|
//获取选中要素的航线编号以及航线类型,用于数据集查询
|
|
res = selection->ToRecordset(false);
|
|
res->MoveFirst();
|
|
while(!res->IsEOF())
|
|
{
|
|
res->GetFieldValue(_U("RouteNumber"),v);
|
|
num << Translator::UGStr2QStr(v.ToString());
|
|
res->MoveNext();
|
|
}
|
|
|
|
featureInfo.insert(i,num);
|
|
num.clear();
|
|
selection = NULL;
|
|
}
|
|
selection = NULL;
|
|
layer = NULL;
|
|
return featureInfo;
|
|
}
|
|
|
|
//设置图层风格
|
|
void LayerOperator::setVectorLayerStyle(UGLayer *layer, UGDataset::DatasetType m_nType)
|
|
{
|
|
UGStyle sty;
|
|
switch(m_nType){
|
|
case (UGDataset::Point):
|
|
sty.SetMarkerStyle(1110);//设置点符号
|
|
sty.SetMarkerHeight(10); //设置符号高度
|
|
sty.SetMarkerWidth(10); //设置符号宽度
|
|
sty.SetLineColor(UGRGB(255,0,255)); //设置符号颜色
|
|
layer->SetStyle(sty); //给图层设置风格
|
|
break;
|
|
|
|
case (UGDataset::Line):
|
|
sty.SetLineStyle(6); //设置线样式
|
|
sty.SetLineColor(UGRGB(255,0,122)); //设置符号颜色
|
|
sty.SetLineWidth(1); //设置线宽度
|
|
layer->SetStyle(sty); //给图层设置风格
|
|
break;
|
|
|
|
case (UGDataset::Region):
|
|
sty.SetFillStyle(54); //设置填充符号样式
|
|
sty.SetLineStyle(19); //设置线条符号样式
|
|
sty.SetFillForeColor(UGRGB(122,50,63)); //设置填充符号颜色
|
|
sty.SetFillBackColor(UGRGB(1,1,1)); //设置背景填充颜色
|
|
layer->SetStyle(sty); //给图层设置风格
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
};
|
|
}
|
|
|
|
void LayerOperator::addGeometryInTrackingLayer(UGTrackingLayer *pTrackingLayer, UGRecordsetPtr res,UGStyle &sty)
|
|
{
|
|
res->MoveFirst();
|
|
UGGeometry* pGeometry = NULL;
|
|
int i = 1;
|
|
while (!res->IsEOF()) {
|
|
res->GetGeometry(pGeometry);
|
|
pGeometry->SetStyle(&sty);
|
|
pTrackingLayer->Add(pGeometry,Translator::QStr2UGStr("Geometry"+QString::number(i)));
|
|
qDebug()<<"*************:"<< ("Geometry"+QString::number(i));
|
|
res->MoveNext();
|
|
i++;
|
|
}
|
|
pGeometry = NULL;
|
|
}
|
|
|
|
void LayerOperator::addGeometryInDynamicLayer(UGDynamicLayer *pDyLayer, UGRecordsetPtr res, UGStyle &sty)
|
|
{
|
|
res->MoveFirst();
|
|
UGGeometry* pGeometry = NULL;
|
|
int i = 1;
|
|
while (!res->IsEOF()) {
|
|
res->GetGeometry(pGeometry);
|
|
pGeometry->SetStyle(&sty);
|
|
pDyLayer->Add(Translator::QStr2UGStr("Geometry"+QString::number(i)),pGeometry);
|
|
res->MoveNext();
|
|
i++;
|
|
pGeometry = NULL;
|
|
}
|
|
// pGeometry = NULL;
|
|
}
|
|
|
|
void LayerOperator::getDynamicLayer(UGMap *pMap, UGDynamicLayer *&pDyLayer, UGString dyLayerName)
|
|
{
|
|
if(pMap->m_DynamicLayers.GetDynamicLayer(dyLayerName)==NULL)
|
|
{
|
|
pDyLayer = new UGDynamicLayer();
|
|
pDyLayer->SetLayerName(dyLayerName);
|
|
}
|
|
else
|
|
{
|
|
pDyLayer = pMap->m_DynamicLayers.GetDynamicLayer(dyLayerName);
|
|
}
|
|
}
|
|
|
|
UGLayer *LayerOperator::appendDatasetToMap(UGDatasetPtr pDataset, UGMap *m_pMap)
|
|
{
|
|
// 判断数据有效性
|
|
if(pDataset == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
//获取到用于显示的qMapControl中的map
|
|
UGMap* pMap = m_pMap;
|
|
|
|
// 将Dataset添加到地图中
|
|
UGLayer* pLayer = pMap->m_Layers.AddDataset(pDataset, pDataset->GetType());
|
|
|
|
return pLayer;
|
|
}
|
|
|
|
//添加航点标记
|
|
void LayerOperator::addNodeLabel(UGGeoLine *pGeoline, UGDynamicLayer *pLabelDyLayer, QString routeType, QString routeNum)
|
|
{
|
|
int pointNum = pGeoline->GetPointCount();
|
|
const UGPoint2D* nodePoints = pGeoline->GetPoints(); //节点指针
|
|
if(pGeoline->GetStartNode() == pGeoline->GetEndNode()) pointNum--;
|
|
|
|
UGPoint2D point;
|
|
//labelStyle
|
|
UGTextStyle tSty;
|
|
tSty.SetBackColor(routeGVar.getRouteTypeColor(routeType.toInt()));
|
|
tSty.SetForeColor(routeGVar.getRouteTypeColor(routeType.toInt()));
|
|
tSty.SetSize(25);
|
|
tSty.SetFixedSize(true);
|
|
|
|
UGStyle sty;
|
|
sty.SetMarkerSize(8);
|
|
sty.SetFillForeColor(routeGVar.getRouteTypeColor(routeType.toInt()));
|
|
for(int i=1;i<=pointNum;i++)
|
|
{
|
|
point.x = nodePoints->x;
|
|
point.y = nodePoints->y;
|
|
|
|
auto pGeoText(new UGGeoText);
|
|
QString geoTextName = routeNum + "-" + QString::number(i);
|
|
auto text = UGSubText(Translator::QStr2UGStr(geoTextName));
|
|
pGeoText->Make(point, text);
|
|
pGeoText->SetTextStyle(tSty);
|
|
|
|
auto pGeoNode(new UGGeoPoint);
|
|
pGeoNode->Make(point);
|
|
pGeoNode->SetStyle(&sty);
|
|
|
|
pLabelDyLayer->Add(Translator::QStr2UGStr("LB"+geoTextName),pGeoText);
|
|
pLabelDyLayer->Add(Translator::QStr2UGStr("PT"+geoTextName),pGeoNode);
|
|
|
|
nodePoints++; //Node指针移动
|
|
}
|
|
}
|
|
|
|
//导入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;
|
|
}
|
|
|