⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gui_layer.cpp

📁 linux下一款GIS程序源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	    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 + -