📄 gui_layer.cpp
字号:
else { UGKError(ET_Failure,UGKErr_OutOfMemory, "GUI_Layer::ReadGeomDataFromFile()"); return ; } pGeoLine->addLine(0,pPoints,numPT); pFeaData->setGeometryData(pGeoLine); break; case wkbMultiPolygon: pGeoLine = new GUI_GeometryLine; m_UGKMultiPolygon = (UGKMultiPolygon *)pGeoData; pGeoLine->setGeoNum(m_UGKMultiPolygon->getNumGeometries()); for(m=0;m<m_UGKMultiPolygon->getNumGeometries();m++) { m_UGKPolygon = (UGKPolygon *)(m_UGKMultiPolygon->getGeometryRef(m)); m_UGKLineString = m_UGKPolygon->getExteriorRing(); numPT = m_UGKLineString->getNumPoints(); pPoints = NULL; pPoints =(RawPoint *)UGK_Calloc(numPT,sizeof(RawPoint)); if(pPoints) { for(n=0;n<numPT;n++) { (pPoints+n)->x = m_UGKLineString->getX(n); (pPoints+n)->y = m_UGKLineString->getY(n); } } else { UGKError(ET_Failure,UGKErr_OutOfMemory, "GUI_Layer::ReadGeomDataFromFile()"); return ; } pGeoLine->addLine(m,pPoints,numPT); } pFeaData->setGeometryData(pGeoLine); break; case wkbMultiPoint: case wkbGeometryCollection: case wkbLinearRing: case wkbUnknown: case wkbNone: default : ; } }/*************************************************************** 读文件,初始化地图数据***************************************************************/int GUI_Layer::InitDataFromFile(){ printf("Init Map Data from File\n"); if(m_FileName==NULL) { UGKError(ET_Failure,UGKErr_FileIO, "GUI_Layer::InitDataFromFile(),file name not specified!"); return -1; } TABFile *m_tabFile= new TABFile; if( (m_tabFile->Open(m_FileName,"r")) !=0) { UGKError(ET_Failure,UGKErr_FileIO, "GUI_Layer::InitDataFromFile(),file read failed!!"); return -1; } /* 图层区域在 setLayerAttr()中已经设置 */ //UGKEnvelope lyrExtent; //m_tabFile->GetExtent(&lyrExtent,0); //setLayerExtent(lyrExtent.MaxX,lyrExtent.MinX,lyrExtent.MaxY,lyrExtent.MinY); // ----ZGQ 这个视野 地图中心 应该由图层管理器来告诉 //setLayerView(lyrExtent.MaxX-lyrExtent.MinX,lyrExtent.MaxY-lyrExtent.MinY); //setLayerCenter( (lyrExtent.MaxX+lyrExtent.MinX)/2, (lyrExtent.MaxY+lyrExtent.MinY)/2 ); m_tabFile->ResetReading(); m_tabFile->SetUseSpatialIndex(FALSE); setFeatureNum(m_tabFile->GetFeatureCount(1) ); TABMAPFile *pMapFile = m_tabFile->GetMAPFileRef(); pMapFile->InitDrawingTools(); //先读取所有的绘图工具定义表 TABToolDefTable *pToolDef = pMapFile->GetToolDefTableRef(); CopyToolDefTable( pToolDef ); UGKFeature *pUGKFeature; GUI_FeatureData *pFeaData; TABPoint *m_PointFea; TABFontPoint *m_FontPointFea; TABText *m_TextFea; TABPolyline *m_PolylineFea; TABRegion *m_RegionFea; // 开始逐个访问Feature while( (pUGKFeature = m_tabFile->GetNextFeature()) != NULL ) { pFeaData= new GUI_FeatureData; //========= 读取该Feature的字段名 ================= UGKFeatureDefn *pUGKFeatureDefn = m_tabFile->GetLayerDefn(); int ifield,numField = pUGKFeatureDefn->GetFieldCount(); if(numField==1) { pFeaData->setLabelText(pUGKFeature->GetFieldAsString(0)); } else { for(ifield=0;ifield<numField;ifield++) { if(m_tabFile->GetFieldIndexNumber(ifield) != 0) { pFeaData->setLabelText(pUGKFeature->GetFieldAsString(ifield)); break; } } if(ifield>=numField) //没有字段 pFeaData->setLabelText("");// } UGKGeometry *m_UGKGeometry = pUGKFeature->GetGeometryRef(); //==== 根据不同几何对象 初始化绘图工具 TABFeature *m_TabFeature = (TABFeature *)pUGKFeature; double labelX,labelY; switch(m_TabFeature->GetFeatureClass()) { case TABFCNoGeomFeature: //printf("Feature has no Geometry!!!!!!!!!!!\n"); delete pFeaData; //不添加就删除 break; case TABFCPoint: m_PointFea =(TABPoint *)m_TabFeature; pFeaData->setSymbolDefIndex(m_PointFea->GetSymbolDefIndex() ); pFeaData->setFeaType(FEA_POINT); labelX = m_PointFea->GetX(); labelY = m_PointFea->GetY(); pFeaData->setLabelPoint(labelX,labelY); ReadGeomDataFromFile(m_UGKGeometry,pFeaData); AddFeatureData(pFeaData); break; case TABFCFontPoint: case TABFCCustomPoint: m_FontPointFea =(TABFontPoint *)m_TabFeature; pFeaData->setFontDefIndex(m_FontPointFea->GetFontDefIndex() ); pFeaData->setFeaType(FEA_FONTPOINT); labelX = m_FontPointFea->GetX(); labelY = m_FontPointFea->GetY(); pFeaData->setLabelPoint(labelX,labelY); pFeaData->setFontSymbolNo( m_FontPointFea->GetSymbolNo() ); pFeaData->setFontPointSize( m_FontPointFea->GetSymbolSize() ); pFeaData->setFontColor( m_FontPointFea->GetSymbolColor() ); ReadGeomDataFromFile(m_UGKGeometry,pFeaData); AddFeatureData(pFeaData); break; case TABFCText: m_TextFea =(TABText *)m_TabFeature; pFeaData->setLabelText(m_TextFea->GetTextString()); pFeaData->setPenDefIndex(m_TextFea->GetPenDefIndex()); pFeaData->setFontDefIndex(m_TextFea->GetFontDefIndex()); pFeaData->setFeaType(FEA_TEXT); ReadGeomDataFromFile(m_UGKGeometry,pFeaData); AddFeatureData(pFeaData); break; case TABFCPolyline: m_PolylineFea =(TABPolyline *)m_TabFeature; pFeaData->setPenDefIndex(m_PolylineFea->GetPenDefIndex() ); pFeaData->setFeaType(FEA_LINE); m_PolylineFea->GetCenter(labelX,labelY); pFeaData->setLabelPoint(labelX,labelY); ReadGeomDataFromFile(m_UGKGeometry,pFeaData); AddFeatureData(pFeaData); break; case TABFCRegion: //========================= case TABFCRectangle: // 暂时对于Reganble Ellipse case TABFCEllipse: // 按照Region来处理 m_RegionFea = (TABRegion *)m_TabFeature; pFeaData->setPenDefIndex(m_RegionFea->GetPenDefIndex()); pFeaData->setBrushDefIndex(m_RegionFea->GetBrushDefIndex()); pFeaData->setFeaType(FEA_REGION); m_RegionFea->GetCenter(labelX,labelY); pFeaData->setLabelPoint(labelX,labelY); ReadGeomDataFromFile(m_UGKGeometry,pFeaData); AddFeatureData(pFeaData); break; case TABFCArc: //暂时不支持 case TABFCMultiPoint: //暂时不支持 printf("Not Supported Now!!\n"); delete pFeaData; break; default: delete pFeaData; } // end switch }//end while printf("Init File success!!!\n"); b_DataInited = TRUE; delete m_tabFile; return 0;}/******************************************* 判断Feature是否在当前视野内*******************************************/bool GUI_Layer::FeatureInView(GUI_FeatureData *feaData){ assert(feaData!=NULL); double left,right,top,bottom; feaData->getFeaBound(left,right,top,bottom); if( ( left-(m_XCenter+m_Xview/2) )>0 ) return FALSE; if( ( right-(m_XCenter-m_Xview/2) )<0 ) return FALSE; if( ( top-(m_YCenter+m_Yview/2) )>0 ) return FALSE; if( ( bottom-(m_YCenter-m_Yview/2) )<0 ) return FALSE; return TRUE; }/******************************************* 判断此图层是否在当前视野内*******************************************/bool GUI_Layer::LayerInView(){ if(b_VisibleAllways) return TRUE; int lyrView = int( (m_Xview<m_Yview)?m_Xview:m_Yview ); if( (lyrView<m_MinVisibleView)||(lyrView>m_MaxVisibleView) ) return FALSE; else return TRUE;}/******************************************* 判断在当前视野内是否需要标记*******************************************/bool GUI_Layer::FeatureNeedLabel(){ if(!b_Label) return FALSE; int lyrView = int( (m_Xview<m_Yview)?m_Xview:m_Yview ); if( (lyrView<m_MinLabelView)||(lyrView>m_MaxLabelView) ) return FALSE; else return TRUE;}void GUI_Layer::Draw(QPaintDevice *pd){ printf("GUI_Layer::Draw\n"); // 是否可见 if(!b_Visible) return; if(!LayerInView()) return; if( !b_DataInited ) { printf("File not Inited So Far!!\n"); //如果没初始化,先初始化 if(InitDataFromFile() !=0 ) { printf("GUI_Layer::InitDataFromFile() Failed!\n"); return; } } GUI_FeatureData *singleFea=NULL; int countFea = m_AddedFea; //printf("Feature numger= %d\n",countFea); for(int i=0;i<countFea;i++) { singleFea =*(m_FeaData+i); if(!FeatureInView(singleFea)) //不在视野内 continue; singleFea->m_ToolDefRef = m_ToolDefTable; singleFea->setScreenCenter(m_XCenter,m_YCenter); singleFea->setDistPerPixel(m_DistperPixel); //告诉GUI_FeatureData 绘图区域 singleFea->setPaintRect(m_paintTop,m_paintLeft, m_paintWidth, m_paintHeight ); singleFea->Draw( pd ); } UGKPainter p(pd); QPen pen("black"); p.setPen(pen); //======================================= // 在所有Feature绘制完后才绘制标记 // 避免标记被Feature遮挡 bool bFeaLabel = FeatureNeedLabel(); singleFea=NULL; if(bFeaLabel) //需要标记 { for(int i=0;i<countFea;i++) { singleFea =*(m_FeaData+i); if(!FeatureInView(singleFea)) //不在视野内 continue; if(singleFea->getFeaType()==FEA_TEXT) //文本Feature不需要标记 continue; if(singleFea->IsTooSmall()) //在改视野中太小 continue; double lX,lY; singleFea->getLabelPoint(lX,lY); int sx,sy; singleFea->mapCoord2scrCoord(lX,lY,sx,sy); const char *label= singleFea->getLableText(); QString labelStr =ACSII2Unicode(label); if( (singleFea->getFeaType()==FEA_POINT) || (singleFea->getFeaType()==FEA_FONTPOINT) ) p.drawText(sx-8,sy-8,labelStr); //点对象 标记时加点偏移 else p.drawText(sx,sy,labelStr); } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -