亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? shpfile.cpp

?? windows mobile gis system
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
#include "stdafx.h"
//#include <d3dtypes.h>
#include "shpFile.h"
#include "MapPoint.h"
#include "MapPoints.h"
#include "MapLine.h"
#include "MapPolygon.h"
#include "MapFields.h"


CShpFile::CShpFile() 
{
	int i;
	bShpOpen = FALSE;
	bShxOpen = FALSE;
	m_shpType = NULLSHP;

	/* -------------------------------------------------------------------- */
            /*	Establish the byte order on this machine.			*/
    /* -------------------------------------------------------------------- */
    i = 1;
    if( *((uchar *) &i) == 1 )
		m_bBigEndian = FALSE;
	else
		m_bBigEndian = TRUE;
}

CShpFile::~CShpFile()
{
	
	 CMapPoint*    pPt;
	 CMapPoints*   pPts;
	 CMapLine*     pLine;
	 CMapPolygon*  pPolygon;

	 while(!m_ObList.IsEmpty())
	 {
		switch ( m_shpType )
        {  
			case POINT:
				pPt =(CMapPoint*)m_ObList.RemoveTail();
				delete pPt;
				break;
            case MULTIPOINT:
				pPts =(CMapPoints*)m_ObList.RemoveTail();
				delete pPts;
				break;

			case POLYLINE:
                pLine =(CMapLine*)m_ObList.RemoveTail();
				delete pLine;
				break;
			case POLYGON:
                pPolygon =(CMapPolygon*)m_ObList.RemoveTail();
				delete pPolygon;
				break;
            default:
				m_ObList.RemoveTail();
				break;
 
		}
     }    
	 if ( bShpOpen )
		fShp.Close();
	 if (bShxOpen)
		fShx.Close();
	 if ( pRecordSet )
		 delete pRecordSet;
	 
}

/*************************************************
  描述:         讀入Shp、shx文件 格式 參閱ESRI技術白皮書
  輸入:         文件名(全路徑) 
  輸出:        成功返回TRUE 失敗返回FALSE
*************************************************/


BOOL CShpFile::ReadShp(CString& csFileName)
{
	int	  iTemp;
	CString csShxName;
	CFileException fe;
    SHPHEADER varHeader;
	
	//打開主文件
	if ( !fShp.Open(csFileName, CFile::modeRead|CFile::shareDenyWrite,&fe))
		return FALSE;
	bShpOpen = TRUE;
    
	//打開索引文件
	csShxName = csFileName.Left(csFileName.GetLength() - 3);
	
	csShxName = csShxName + "shx";
    if ( !fShx.Open(csShxName, CFile::modeRead|CFile::shareDenyWrite,&fe))
		return FALSE;
	bShxOpen = TRUE;
       

	TRY
    {
	    //讀主文件頭 長100字節
		if ( fShp.Read(&varHeader , sizeof(SHPHEADER))!= sizeof(SHPHEADER))
			return FILE_READERR;
		
        iTemp = varHeader.iFileCode; 
		if ( !m_bBigEndian )
			SwapWord(sizeof(int),&iTemp);
		if ( iTemp != 9994 ) //是否是shp文件
			return FILE_CODEERR;
        if ( varHeader.iVersion != FILE_VERSION ) //文件版本是否正確
			return FILE_VERSIONERR;
        
		//shp 類型  		
		m_shpType = varHeader.iShpType;  
		m_shpFileLength = varHeader.iFileLength;
	    if ( !m_bBigEndian )
			SwapWord(sizeof(int),&m_shpFileLength);
		
		//保存數據最大矩形范圍
		m_Extent.SetLeft(varHeader.dbXMin);
		m_Extent.SetRight(varHeader.dbXMax);
		m_Extent.SetTop(varHeader.dbYMin);
		m_Extent.SetBottom(varHeader.dbYMax);
        
		//讀索引文件頭 長100字節
		if ( fShx.Read(&varHeader , sizeof(SHPHEADER))!= sizeof(SHPHEADER))
			return FILE_READERR;
		iTemp = varHeader.iFileCode; 
		if ( !m_bBigEndian )
			SwapWord(sizeof(int),&iTemp);
		if ( iTemp != 9994 ) //是否是shx文件
			return FILE_CODEERR;
        if ( varHeader.iVersion != FILE_VERSION ) //文件版本是否正確
			return FILE_VERSIONERR;
		m_shxFileLength = varHeader.iFileLength; 
		if ( !m_bBigEndian )
			SwapWord(sizeof(int),&m_shxFileLength);
		//通過索引文件計算主文件記錄個數 文件長度數值以16位計
		m_iRecordCount = ((m_shxFileLength - 50 )*2)/sizeof(SHXRECORD);
		
		if ( !ReadRecord() )
			return FILE_READERR;
         if ( !ReadDBF(csFileName))
			 return FALSE;
	}
	CATCH(CFileException ,eload)
    {
		fShp.Abort();
		return FALSE;
    }
	END_CATCH
	
	
	return TRUE;

}
/*************************************************
  描述:         讀入DBF文件格式 
  輸入:         文件名(全路徑) 
  輸出:        成功返回TRUE 失敗返回FALSE
*************************************************/
BOOL CShpFile::ReadDBF(CString& csFileName)
{
	CString csDbfName;
	BOOL bResult;
	//創建記錄集對象
	pRecordSet = new CMapRecordSet;
	ASSERT ( pRecordSet != NULL ); 
	csDbfName = csFileName.Left(csFileName.GetLength() - 3);
	csDbfName = csDbfName + "dbf";
	//打開DBF文件
	bResult =  pRecordSet->openDBF(csDbfName); 
    if ( !bResult )
		delete pRecordSet;
	return bResult;
}

/*************************************************
  描述:         獲得當前地圖文件最大矩形范圍 
  輸入:         無
  輸出:        地圖矩形范圍   
*************************************************/

CMapRectangle CShpFile::GetExtent()
{
	return m_Extent;
}

/*************************************************
  描述:         設置地圖文件最大矩形范圍 
  輸入:         地圖矩形范圍
  輸出:        無   
*************************************************/
void CShpFile::SetExtent(CMapRectangle& extent )
{
	m_Extent.SetLeft(extent.GetLeft());  
    m_Extent.SetRight(extent.GetRight());
	m_Extent.SetTop(extent.GetTop()); 
    m_Extent.SetBottom(extent.GetBottom());
}

/*************************************************
  描述:         設置Shp對象類型 
  輸入:         shp 類型
  輸出:        無   
*************************************************/
void CShpFile::SetShpType(int& iShpType)
{
	m_shpType = iShpType;
}

/*************************************************
  描述:         讀入Shp對象坐標 
  輸入:         無
  輸出:        成功返回TRUE 失敗返回FALSE  
*************************************************/

BOOL CShpFile::ReadRecord()
{
	int i,j,k,m;
	int iDataLen,iLength,iIndex;
	int *pIParts;
	double dbTmp;
	char *pszBuffer,*lpVer;
	BOOL bEof;
	SHPINFO shpIn;
	SHPRECORDHEADER RecordHeader;
    CMapRectangle objRectangle;
    CMapPoint   *pPoint;
	CMapPoints  *pPoints;
	CMapParts   *pParts;
	CMapLine    *pLine;
	CMapPolygon *pPolygon;
	
	bEof = FALSE;
	switch ( m_shpType )
	{
		case NULLSHP:	
			return FALSE;
			break;
        case POINT:
			{
				
				SHPPTCONTENT point;
				//讀入點記錄
				for ( i = 1 ; i <= m_iRecordCount ; i++ ) 
				{	
					iLength = SetRecordPos(i);
					if ( iLength <= 0 )
						return FALSE;

					//獲得記錄頭信息
					if (!GetRecordHeader(RecordHeader))
						return FALSE;
					//記錄內容長度是否與shp實體大小一致,索引記錄長度是否與記錄內容長度一致				
					if ( RecordHeader.iContentLength*2 != sizeof(point)||
						RecordHeader.iContentLength*2 != iLength)
						return FALSE;
					if(fShp.Read(&point,sizeof(point))!= sizeof(point))
							return FALSE;
					pPoint = new CMapPoint;
					iIndex = i - 1;
				    pPoint->SetIndex(iIndex); 
					if ( pPoint == NULL )
						return FALSE;
					//類型是否匹配
					if ( point.iShpType != m_shpType) 
						return FALSE;
                    pPoint->SetX(point.dbX );
					pPoint->SetY(point.dbY );
					m_ObList.AddTail(pPoint);  
								    
				 } 
			} 	
			break;
        case POLYLINE:
		    
			pszBuffer = new char [MAX_BUFFER_SIZE]; //分配緩沖區
			if ( pszBuffer == NULL )
				return FALSE;
			memset(pszBuffer , 0 , MAX_BUFFER_SIZE);
            
			//讀入線記錄
			for ( i = 1 ; i <= m_iRecordCount ; i++ ) //m_iRecordCount
			{	
			
				iLength = SetRecordPos(i);
				if ( iLength <= 0 )
					return FALSE;

				pLine = new CMapLine();
				iIndex = i - 1;
				pLine->SetIndex(iIndex); 
				if ( pLine == NULL )
					return FALSE;
				//獲得記錄頭信息
				if (!GetRecordHeader(RecordHeader))
					return FALSE;
				if ( !GetShpInfo(shpIn))
					return FALSE;
				 if (shpIn.ishpType != POLYLINE )//類型不匹配
                 {  
                      delete pLine;
					  continue;
				 }
				 if ( shpIn.iNumParts*sizeof(int) > MAX_BUFFER_SIZE )
                 {
					 //多義線段數大于最大緩沖區長度,忽略該對象
					 delete pLine;
					 continue;
                 } 
				 //計算對象內容實際長度
				 j = sizeof(SHPINFO) + shpIn.iNumParts*sizeof(int) ;
				 j += shpIn.iNumPoints*sizeof(SHPPOINT);  
                 
				 //判斷實際長度是否與索引文件中記錄的一致 
				 if ( RecordHeader.iContentLength*2 != j )
                 {
				     delete pLine;
					 continue;
				 }	 
				 //設置shp矩形范圍
				 objRectangle.SetLeft(shpIn.Box[0].dbX);
				 objRectangle.SetTop(shpIn.Box[0].dbY);
				 objRectangle.SetRight(shpIn.Box[1].dbX);
				 objRectangle.SetBottom(shpIn.Box[1].dbY);
				 pLine->SetExtent(objRectangle);
				 pIParts = new int[shpIn.iNumParts];
				 if ( pIParts == NULL )
                 {
					delete pLine;
					return FALSE;
				 }
				 //讀入多義線段索引
				 if ( fShp.Read(pIParts,shpIn.iNumParts*4) != (uint)(shpIn.iNumParts*4))
				 {
					delete pLine;
					return FALSE;
				 }

				 //點坐標存儲所占字節數
				 iLength = shpIn.iNumPoints*sizeof(SHPPOINT);
				 //初始化緩沖區數據
				 iDataLen = ReadPoint(pszBuffer,iLength,bEof);
				 if ( iDataLen < 0 )
                 {
					  delete pLine;
					  delete pIParts;
					  return FALSE;
				 
				 }	 
				 lpVer = pszBuffer;
				 for ( j = 0 ;  j < shpIn.iNumParts ; j++ )
				 {
					pParts  = new CMapParts();
					pPoints = new CMapPoints();
 					if ( pParts == NULL || pPoints == NULL)
						return FALSE;
					if ( j == shpIn.iNumParts - 1 )
                    {
					    k = pIParts[j];        //本段第一個頂點索引
					    m = shpIn.iNumPoints ; //下一個段第一個頂點索引 
                    }
              	    else
                    {
						k = pIParts[j];
						m = pIParts[j+1];
					}
					//處理第i段的頂點
				    for ( ; k < m ; k++)
                    {   
						pPoint = new CMapPoint();
						if ( pPoint == NULL )
							return FALSE;
						
						//需要讀入數據更新緩沖區
						if ( lpVer == pszBuffer + iDataLen && !bEof)
						{
							iDataLen = ReadPoint(pszBuffer,iLength,bEof);
							if ( iDataLen < 0 )
							{
								delete pPoint;
								delete pPoints;
								delete pLine;
								delete pIParts;
								
								return FALSE;
				 
							}	 
							lpVer = pszBuffer;
						}	
						dbTmp = *(double*)lpVer;
					    pPoint->SetX(dbTmp);
                        lpVer += 8;
						//需要讀入數據更新緩沖區
						if ( lpVer == pszBuffer + iDataLen && !bEof)
						{
							iDataLen = ReadPoint(pszBuffer,iLength,bEof);
							if ( iDataLen < 0 )
							{
								delete pPoint;
								delete pPoints;
								delete pLine;
								delete pIParts;
								return FALSE;
				 
							}	 
							lpVer = pszBuffer;
						}	
						dbTmp = *(double*)(lpVer);
						lpVer += 8;
                        pPoint->SetY(dbTmp); 
						pPoints->Add(pPoint); 
						
					}  
                    pParts->Add(pPoints);   
				    pLine->Add(pParts); 

				 }
				 m_ObList.AddTail( pLine);
				 delete []pIParts;
			
            }
			delete []pszBuffer;

			break;
        case POLYGON:
			pszBuffer = new char [MAX_BUFFER_SIZE]; //分配緩沖區
			if ( pszBuffer == NULL )
				return FALSE;
			memset(pszBuffer , 0 , MAX_BUFFER_SIZE);
            
			//讀入多邊形記錄
			for ( i = 1 ; i <= m_iRecordCount ; i++ ) //m_iRecordCount
			{	
				iLength = SetRecordPos(i);
				if ( iLength <= 0 )
					return FALSE;

				pPolygon = new CMapPolygon();
				iIndex = i - 1;
                pPolygon->SetIndex(iIndex);
				if (pPolygon == NULL )
					return FALSE;
				//獲得記錄頭信息
				if (!GetRecordHeader(RecordHeader))
					return FALSE;
				if ( !GetShpInfo(shpIn))
					return FALSE;
				 if (shpIn.ishpType != POLYGON )//類型不匹配
                 {  
                      delete pPolygon;
					  continue;
				 }
				 if ( shpIn.iNumParts*sizeof(int) > MAX_BUFFER_SIZE )
                 {
					 //復合多邊型中的多邊形個數大于最大緩沖區長度,忽略該對象

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人精品免费| 欧美精品久久一区二区三区| 日韩美女天天操| 日韩av午夜在线观看| 91精品国产综合久久香蕉的特点| 中文字幕视频一区二区三区久| 亚洲国产成人av好男人在线观看| 91高清视频在线| 精品一二三四区| 91视频在线观看| 亚洲夂夂婷婷色拍ww47| 欧美日韩亚洲综合一区二区三区| 亚洲欧美一区二区三区极速播放| 欧美在线高清视频| 亚洲激情综合网| 91精品国产91久久久久久一区二区 | 成人精品免费看| 久久久国际精品| 色视频欧美一区二区三区| 亚洲一区免费在线观看| 欧美蜜桃一区二区三区| 国产在线精品一区二区三区不卡| 久久久久国产精品麻豆ai换脸| 国产精品中文字幕欧美| 尤物视频一区二区| 777久久久精品| 肉肉av福利一精品导航| 欧洲av在线精品| 国产精品影视天天线| 亚洲二区在线视频| 亚洲欧美在线视频观看| 日韩一级高清毛片| 欧美亚洲国产一区二区三区| 国产精品一区久久久久| 男人操女人的视频在线观看欧美| 国产欧美日韩综合| 国产亚洲欧美日韩在线一区| 91浏览器入口在线观看| 亚洲电影中文字幕在线观看| 精品国产一区a| 欧美日韩国产色站一区二区三区| 国产揄拍国内精品对白| 亚洲人123区| 国产亚洲欧美激情| 欧美一级二级三级乱码| 日韩一区二区三区三四区视频在线观看| 一本久道中文字幕精品亚洲嫩| 国产乱码精品一区二区三区av| 久久激情综合网| 国产成人自拍高清视频在线免费播放| 国产精品中文字幕欧美| 成人国产视频在线观看| 免费日本视频一区| 欧美极品xxx| 国产欧美一区二区三区网站 | 国产日产欧美一区二区三区| 国产欧美日韩另类一区| 亚洲免费在线视频一区 二区| 亚洲欧美日韩系列| 国产欧美日韩精品在线| 国产精品国产自产拍在线| 亚洲欧洲日韩在线| 日日摸夜夜添夜夜添国产精品| 国产真实乱偷精品视频免| 97精品久久久久中文字幕| 日本精品视频一区二区三区| 欧美婷婷六月丁香综合色| 午夜精品久久久久久久蜜桃app| 蜜桃免费网站一区二区三区| 国产精品1区2区| 欧美精品久久久久久久久老牛影院| 欧美成人欧美edvon| 一区二区三区电影在线播| 青青草97国产精品免费观看无弹窗版| 国产精品99久久久久久久vr| 欧美日韩成人综合在线一区二区| 26uuu国产电影一区二区| 午夜久久久久久久久久一区二区| 国产69精品久久777的优势| 欧美精品日韩综合在线| 亚洲欧美区自拍先锋| 在线中文字幕一区二区| 欧美一区日韩一区| 欧美国产一区在线| 国产不卡一区视频| 日韩三区在线观看| 激情综合色播激情啊| 91精品麻豆日日躁夜夜躁| 性做久久久久久免费观看| www.欧美日韩国产在线| 国产精品久久久久影院亚瑟| 国产高清在线观看免费不卡| 国产偷国产偷亚洲高清人白洁| 国产精品99久久久久久有的能看| 久久精品一区二区三区四区| 国产精品一线二线三线精华| 国产清纯在线一区二区www| 粉嫩aⅴ一区二区三区四区| 国产午夜精品福利| 99综合电影在线视频| 一区二区在线观看免费视频播放| 一本在线高清不卡dvd| 亚洲一级片在线观看| 91精品国产综合久久久久久漫画| 裸体歌舞表演一区二区| 国产区在线观看成人精品| 丁香六月综合激情| 亚洲一区二区三区国产| 日韩免费成人网| 白白色 亚洲乱淫| 无码av中文一区二区三区桃花岛| 亚洲午夜久久久| 欧美精品一区二区三区高清aⅴ | 亚洲高清视频在线| 成人黄色在线看| 亚洲摸摸操操av| 国产精品久久久久久久岛一牛影视| 亚洲国产日韩a在线播放| 中文在线资源观看网站视频免费不卡| 色综合色综合色综合| 日韩精品电影在线| 国产精品五月天| 欧美日韩国产美女| 成人午夜在线播放| 婷婷开心久久网| 亚洲小少妇裸体bbw| 中文字幕中文字幕一区| 国产调教视频一区| 久久久久久97三级| 久久综合久久99| 日韩欧美国产一二三区| 制服丝袜国产精品| 欧美电影免费观看高清完整版在线| 欧美不卡视频一区| 粉嫩嫩av羞羞动漫久久久| 麻豆成人综合网| 日本一区二区高清| 亚洲人被黑人高潮完整版| 亚洲一区二区三区四区在线观看| 亚洲蜜桃精久久久久久久| av在线不卡电影| 国产精品伊人色| 国产一区二区在线观看免费| 久久99久久99精品免视看婷婷 | 国产女人水真多18毛片18精品视频 | 99在线视频精品| 国产麻豆视频一区| 国产资源在线一区| 天天综合色天天综合色h| 欧美国产激情一区二区三区蜜月| 欧美不卡在线视频| 欧美va天堂va视频va在线| 欧美视频一区二区三区| 欧美猛男男办公室激情| 欧美日韩一区成人| 欧美久久久久中文字幕| 91网站黄www| 欧美一区二区播放| 日韩一区二区三区四区五区六区 | 97久久久精品综合88久久| 成人黄色软件下载| 一本久道中文字幕精品亚洲嫩| 婷婷六月综合网| 麻豆91精品91久久久的内涵| 久久电影网站中文字幕| 99国产精品久久久| 日本高清无吗v一区| 欧美伊人久久久久久午夜久久久久| 风间由美性色一区二区三区| 久久福利视频一区二区| 床上的激情91.| 日本丶国产丶欧美色综合| 国产一区二区在线观看视频| 91国产免费看| 久久综合色播五月| 一区二区三区在线看| 国产麻豆成人精品| 欧美视频一区在线观看| 亚洲精品在线免费观看视频| 亚洲一级在线观看| 国产一区二区三区免费播放| 99久久久久久| 日韩免费一区二区| 亚洲精品视频在线| 国产精品羞羞答答xxdd| 国产69精品久久久久毛片 | 欧美特级限制片免费在线观看| 久久久国产一区二区三区四区小说 | 欧美一区二区在线观看| 亚洲国产经典视频| 国产盗摄视频一区二区三区| 欧美精品xxxxbbbb| 亚洲免费在线视频一区 二区| 成人动漫一区二区三区| 日韩视频国产视频| 久久国产精品第一页| 精品国产凹凸成av人网站| 日韩国产高清影视| 91麻豆精品国产91久久久久| 全国精品久久少妇|