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++

#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;
}