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

📄 shpfile.cpp

📁 本程序是用VC++ 开发出的比较底层的GIS系统代码。对于希望从底层学GIS开发的很有帮助
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			pPoint = (CMapPoint*)m_ObList.GetAt(pos);
			//判断要绘制的的对象是否在当前屏幕范围内
			if ( !m_CurMapExtent.IsPointIn(*pPoint)) 
            {
			
				m_ObList.GetNext(pos);
				continue;
            }
			DrawPointElement(pDC,pPoint,draw );
			m_ObList.GetNext(pos);

		}
		pDC->SelectObject(pOldBrush);
		
	} else if (	m_pRender->GetRenderType() == SIMPLE_RENDER )
	{
		m_pRender->GetSimpleRender(simpleRender);
		//pen.CreatePen(PS_SOLID,1,simpleRender.OutlineColor);
		if ( simpleRender.iIndex == 0 )
        {  
        	brSimple.CreateSolidBrush(simpleRender.FillColor);
			pOldBrush = pDC->SelectObject(&brSimple);
        }
        else
		{	
		   if (!brSimple.CreateHatchBrush( simpleRender.iIndex,
			                               simpleRender.FillColor))
		   { 
			  pOldBrush = pDC->SelectObject(&br);
		   } 
		   else
           {
			  pOldBrush = pDC->SelectObject(&brSimple);	
		   }   
		} 
		for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
		{  
			pPoint = (CMapPoint*)m_ObList.GetAt(pos);
			if ( !m_CurMapExtent.IsPointIn(*pPoint)) 
            {
				m_ObList.GetNext(pos);
				continue;
            }
			DrawPointElement(pDC,pPoint,draw );
			m_ObList.GetNext(pos);
		}
		pDC->SelectObject(pOldBrush);
		pen.DeleteObject();
		brSimple.DeleteObject(); 

        
    } 
	else if (	m_pRender->GetRenderType() == UNIQUE_RENDER )
    { 
		iField = m_pRender->GetFieldIndex();
		for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
		{  
			
			pPoint = (CMapPoint*)m_ObList.GetAt(pos);
			if ( !m_CurMapExtent.IsPointIn(*pPoint)) 
            {
				m_ObList.GetNext(pos);
				continue;
            }
            iIndex = pPoint->GetIndex();
            pRecordSet->Move(iIndex,BookmarkFirst);
			pFields = pRecordSet->GetFields(0);
			if ( iField >= 0 && iField < pFields->GetCout())   
			{  
				pField = pFields->GetField(iField);
				csValue = pField->GetValueAsString();
				rInfo = m_pRender->GetByValue(csValue);
				ASSERT(rInfo);
				CBrush brush(rInfo->clr); 
			    pOldBrush = pDC->SelectObject(&brush);
			    DrawPointElement(pDC,pPoint,draw );
                pDC->SelectObject(pOldBrush);
			}
			m_ObList.GetNext(pos);

		}


	}
}

/*************************************************
  描述:         绘制单个的点对象
  输入:         设备指针、点对象对象指针、
                坐标变换参数结构对象
  输出:        无
*************************************************/

void CShpFile::DrawPointElement(CDC*pDC,CMapPoint *pPoint, DrawParam& draw )
{
	int iX,iY;
	CRect rc;

	if ( pPoint == NULL )
		return;
	
	iX = (int)((pPoint->GetX()-draw.m_StartX )/draw.m_Scale);
	iY = (int)((draw.m_StartY-pPoint->GetY())/draw.m_Scale);

	rc.left = iX - 4;
	rc.right = iX  + 4;
	rc.top = iY  - 4;
	rc.bottom = iY  + 4;
	pDC->Rectangle(&rc); 

}

/*************************************************
  描述:         绘制线对象
  输入:         设备指针、图例对象指针、坐标变换参数结构对象
  输出:        无
*************************************************/
void CShpFile::DrawPLine(CDC*pDC ,  CMapRender* m_pRender , DrawParam& draw )
{
    int    iIndex,iField; 
	CPen   *pOldPen;
	SIMPLERENDER simpleRender;
	CPen   penSimple;
	CPen   pen(PS_SOLID,1,RGB(255,0,0));
	CBrush br(RGB(255,239,156));
	CMapFields *pFields;
    CMapField  *pField;
   	CMapLine *pLine;
	POSITION pos;
	CString csValue;
	CMapRectangle shpRC;
	RENDERINFO *rInfo;
	if ( m_pRender == NULL )
    {
		pOldPen = pDC->SelectObject(&pen);
		for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
		{  
			pLine = (CMapLine*)m_ObList.GetAt(pos);
            shpRC = pLine->GetExtent();
			if ( !m_CurMapExtent.IsInsercet(shpRC))
			{	
				m_ObList.GetNext(pos);
				continue;
			}
			DrawPLineElement(pDC,pLine,draw );
			m_ObList.GetNext(pos);

		}
		pDC->SelectObject(pOldPen);
		
	} else if (	m_pRender->GetRenderType() == SIMPLE_RENDER )
	{
		m_pRender->GetSimpleRender(simpleRender);
		if ( simpleRender.iIndex == 0 )
        {  
        	pOldPen = pDC->SelectObject(&pen);
        }
        else
		{	
		   if (!penSimple.CreatePen(PS_SOLID,1,simpleRender.FillColor))
		   { 
			  pOldPen = pDC->SelectObject(&pen);
		   } 
		   else
           {
			   pOldPen = pDC->SelectObject(&penSimple);	
		   }   
		} 
		for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
		{  
			pLine = (CMapLine*)m_ObList.GetAt(pos);
			shpRC = pLine->GetExtent();
			if ( !m_CurMapExtent.IsInsercet(shpRC))
			{	
				m_ObList.GetNext(pos);
				continue;
			}
			DrawPLineElement(pDC,pLine,draw );
			m_ObList.GetNext(pos);
		}
		pDC->SelectObject(pOldPen);

		if ( penSimple.GetSafeHandle() != NULL ) 
	         penSimple.DeleteObject();  
		
        
    } 
	else if (m_pRender->GetRenderType() == UNIQUE_RENDER )
    { 
		iField = m_pRender->GetFieldIndex();
		for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
		{  
			
			pLine = (CMapLine*)m_ObList.GetAt(pos); 
			shpRC = pLine->GetExtent();
			if ( !m_CurMapExtent.IsInsercet(shpRC))
			{	
				m_ObList.GetNext(pos);
				continue;
			}
            iIndex = pLine->GetIndex();
            pRecordSet->Move(iIndex,BookmarkFirst);
			pFields = pRecordSet->GetFields(0);
			if ( iField >= 0 && iField < pFields->GetCout())   
			{  
				pField = pFields->GetField(iField);
				csValue = pField->GetValueAsString();
				rInfo = m_pRender->GetByValue(csValue);
				ASSERT(rInfo);
				CPen penTemp(PS_SOLID,1,rInfo->clr); 
			    pOldPen = pDC->SelectObject(&penTemp);
			    DrawPLineElement(pDC,pLine,draw );
                pDC->SelectObject(pOldPen);
			}
			m_ObList.GetNext(pos);

		}


	}
			

}
/*************************************************
  描述:         绘制单个的线对象
  输入:         设备指针、线对象对象指针、
                坐标变换参数结构对象
  输出:        无
*************************************************/

void CShpFile::DrawPLineElement(CDC*pDC, CMapLine *pPline , DrawParam& draw )
{

	int i,j,k,iCount;
	CMapPoint *pPoint;
	CMapPoints *pPoints;
	CMapParts *pParts;
	CMapRectangle MapExtent;
	CPoint    *pPtArray;  //顶点数组

	if ( pPline == NULL )
		return;
	for ( i = 0 ; i < pPline->GetCount() ; i++ )
	{			
		pParts =  pPline->GetParts(i);
		for ( j = 0 ; j < pParts->GetCount() ; j++)
		{
			pPoints = pParts->Get(j); 
			iCount = pPoints->GetCount();
			pPtArray = new CPoint[iCount];
			if ( pPtArray == NULL )
				return ;
			for ( k = 0 ; k < iCount; k++)
			{	
				pPoint = pPoints->Get(k); 
				pPtArray[k].x = (int)((pPoint->GetX()-draw.m_StartX)/draw.m_Scale);
				pPtArray[k].y = (int)((draw.m_StartY - pPoint->GetY())/draw.m_Scale);
    
			}
		}	
	}
	//绘制多义线
	pDC->Polyline(pPtArray,pPoints->GetCount()); 
	delete []pPtArray;
				

}

/*************************************************
  描述:         绘制面对象
  输入:         设备指针、图例对象指针、坐标变换参数结构对象
  输出:        无
*************************************************/
void CShpFile::DrawPolygon(CDC*pDC ,  CMapRender* m_pRender , DrawParam& draw )
{
	int    iIndex,iField; 
	//CPen   *pOldPen;
	CBrush *pOldBrush;
	SIMPLERENDER simpleRender;
	CBrush brSimple;
	CPen   pen;
	CBrush br(RGB(255,239,156));
	CMapFields *pFields;
    CMapField  *pField;
   	POSITION pos;
	CString csValue;
	RENDERINFO *rInfo;
	CMapPolygon *pPolygon;
	CMapRectangle shpRC;

	if ( m_pRender == NULL )
    {
		pOldBrush = pDC->SelectObject(&br);
		for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
		{  
			pPolygon = (CMapPolygon*)m_ObList.GetAt(pos);
			shpRC = pPolygon->GetExtent(); 
			if ( !m_CurMapExtent.IsInsercet(shpRC))
			{
				//要绘制的对象外接矩形是不是与屏幕相交
				m_ObList.GetNext(pos);
				continue;
            }
			DrawPolygonElement(pDC,pPolygon,draw );
			m_ObList.GetNext(pos);

		}
		pDC->SelectObject(pOldBrush);
		
	} else if (	m_pRender->GetRenderType() == SIMPLE_RENDER )
	{
		m_pRender->GetSimpleRender(simpleRender);
		//pen.CreatePen(PS_SOLID,1,simpleRender.OutlineColor);
		if ( simpleRender.iIndex == 0 )
        {  
        	brSimple.CreateSolidBrush(simpleRender.FillColor);
			pOldBrush = pDC->SelectObject(&brSimple);
        }
        else
		{	
		   if (!brSimple.CreateHatchBrush( simpleRender.iIndex,
			                               simpleRender.FillColor))
		   { 
			  pOldBrush = pDC->SelectObject(&br);
		   } 
		   else
           {
			  pOldBrush = pDC->SelectObject(&brSimple);	
		   }   
		} 
		for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
		{  
			pPolygon = (CMapPolygon*)m_ObList.GetAt(pos);
			shpRC = pPolygon->GetExtent();
			if ( !m_CurMapExtent.IsInsercet(shpRC))
			{
				//要绘制的对象外接矩形是不是与屏幕相交
				m_ObList.GetNext(pos);
				continue;
            }
			DrawPolygonElement(pDC,pPolygon,draw );
			m_ObList.GetNext(pos);
		}
		pDC->SelectObject(pOldBrush);
		if ( brSimple.GetSafeHandle() != NULL )
			brSimple.DeleteObject(); 

        
    } 
	else if (	m_pRender->GetRenderType() == UNIQUE_RENDER )
    { 
		iField = m_pRender->GetFieldIndex();
		for( pos = m_ObList.GetHeadPosition(); pos != NULL; )
		{  
			
			pPolygon = (CMapPolygon*)m_ObList.GetAt(pos);
            shpRC = pPolygon->GetExtent(); 
			if ( !m_CurMapExtent.IsInsercet(shpRC))
			{
				//要绘制的对象外接矩形是不是与屏幕相交
				m_ObList.GetNext(pos);
				continue;
            }
	        iIndex = pPolygon ->GetIndex();
            pRecordSet->Move(iIndex,BookmarkFirst);
			pFields = pRecordSet->GetFields(0);
			if ( iField >= 0 && iField < pFields->GetCout())   
			{  
				pField = pFields->GetField(iField);
				csValue = pField->GetValueAsString();
				rInfo = m_pRender->GetByValue(csValue);
				ASSERT(rInfo != NULL);
				CBrush brush(rInfo->clr); 
			    pOldBrush = pDC->SelectObject(&brush);
			    DrawPolygonElement(pDC,pPolygon,draw );
                pDC->SelectObject(pOldBrush);
			}
			m_ObList.GetNext(pos);

		}


	}
}

/*************************************************
  描述:         绘制单个的面对象
  输入:         设备指针、面对象对象指针、
                坐标变换参数结构对象
  输出:        无
*************************************************/

void CShpFile::DrawPolygonElement(CDC*pDC , CMapPolygon* pPolygon , DrawParam& draw )
{
	int i,j,k,m,iCount;
	CMapPoint *pPoint;
	CMapPoints *pPoints;
	CMapParts *pParts;
	CPoint    *pPtArray;  //顶点数组
	int       *pPolygonCount; //每个多边型的顶点数组

	if ( pPolygon == NULL )
		return;
	iCount = pPolygon->GetCount(); //多边形个数
    pPolygonCount = new int[iCount];
    
	if ( pPolygonCount == NULL )
		return;
					
	//计算复合多边型每部分的顶点数,和总顶点数
	for ( m= 0,i = 0 ; i < pPolygon->GetCount() ; i++ )
	{
		pParts =  pPolygon->GetParts(i);
		k = 0;
		for ( j = 0 ; j < pParts->GetCount() ; j++)
		{
			pPoints = pParts->Get(j); 
            k += pPoints->GetCount();
		} 
		pPolygonCount[i] = k;
		m += k;
	}
	
	pPtArray = new CPoint[m];
    if ( pPtArray == NULL )
    { 
		delete []pPolygonCount;
		return ;
	}
	
	for ( m= 0 , i = 0 ; i < pPolygon->GetCount() ; i++ )
	{
		pParts =  pPolygon->GetParts(i);
		for ( j = 0 ; j < pParts->GetCount() ; j++)
		{
			pPoints = pParts->Get(j); 
            for ( k = 0 ; k < pPoints->GetCount(); k++ )
            {
				pPoint = pPoints->Get(k); 
				pPtArray[m].x = (int)((pPoint->GetX() - draw.m_StartX)/draw.m_Scale);
                pPtArray[m++].y =  (long)((draw.m_StartY - pPoint->GetY() )/draw.m_Scale);
				
			}	
		} 
		
	}
	if ( pPolygon->GetCount() > 1)
		pDC->PolyPolygon(pPtArray,pPolygonCount,iCount); //绘制复合多边形
	else
		pDC->Polygon(pPtArray, m); 		
	delete []pPolygonCount;
	delete []pPtArray;	 					

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -