#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 LayerOperator::getSelectedFeature(UGMap *pMap) { UGLayer* layer = NULL; UGString layerName; UGSelection* selection = NULL; UGRecordsetPtr res; UGVariant v; QStringList num; QMap 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 LayerOperator::getSelectedFeature3D(SceneControl *pSceneControl) { UGArray* pSelectionArr = NULL; UGSelection3D* selection = NULL; UGRecordsetPtr res; UGVariant v; QStringList num; QMap featureInfo; pSelectionArr = pSceneControl->GetGeoSelections(); for(int i = 0;iGetSize();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; }