C 底層讀取Shp檔案

2021-06-20 15:41:59 字數 4281 閱讀 1592

featureclass* cgismapdoc::importshapefiledata( file* fpshp, file* fpdbf )  

for( int i = 0 ; i < 5 ; i ++ )  

fread(&filecode , sizeof(int) , 1 , fpshp) ;  

fread(&filelength , sizeof(int) , 1 , fpshp) ;  

filelength = reversebytes(filelength) ;  

fread(&version , sizeof(int) , 1 , fpshp) ;  

fread(&shapetype , sizeof(int) , 1 , fpshp) ;  

double temporiginx , temporiginy ;  

fread( &temporiginx , sizeof(double) , 1 , fpshp ) ;  

fread( &temporiginy , sizeof(double) , 1 , fpshp ) ;  

double xmaxlayer , ymaxlayer ;  

fread( &xmaxlayer , sizeof(double) , 1 , fpshp ) ;  

fread( &ymaxlayer , sizeof(double) , 1 , fpshp ) ;  

double* skip = new

double[4] ;  

fread( skip , sizeof(double) , 4 , fpshp ) ;  

delete skip ;  

skip = 0 ;  

//讀shp檔案頭結束

int uniqueid = this->m_pdatasource->getuniqueid() ;  

featureclass* pshpdataset = 0 ;  

//根據目標型別建立相應的圖層dataset。

switch( shapetype )  

if ( pshpdataset == 0 ) return 0;  

// 讀dbf檔案頭---------begin------------

struct dbfheader  

dbfheader;  

struct dbffielddescriptor  

;  fread(&dbfheader,sizeof(dbfheader),1,fpdbf);  

/*int recordsnum = *((int*)dbfheader.m_nnumrecords);

int headlen = *((short*)dbfheader.m_nheaderbytes);

int everyrecordlen = *((short*)dbfheader.m_nrecordbytes);

if ( recordsnum == 0 ||  headlen == 0 || everyrecordlen == 0 )

return 0 ;

int fieldcount = (headlen - 1 - sizeof(dbfheader))/sizeof(dbffielddescriptor);

dbffielddescriptor *pfields = new dbffielddescriptor[fieldcount];

for ( i = 0; i < fieldcount; i ++ )

fread(&pfields[i],sizeof(dbffielddescriptor),1,fpdbf);

char endbyte;

fread(&endbyte,sizeof(char),1,fpdbf);

if ( endbyte != 0x0d)

*/fields& fields = pshpdataset->getfields();  

dbffielddescriptor field ;  

byte endbyte = ' ';  

char fieldname[12];  

int fielddecimal, fieldlen, everyrecordlen = 0 ;  

while ( !feof(fpdbf) )  

break;  

}  everyrecordlen += fieldlen ;  

}  // 讀dbf檔案頭---------end------------

while( !feof(fpshp) )  

break ;  

//讀取點目標結束

case 3: // '/003'

//讀取線目標開始

//處理單個目標有多條線的問題

pnewgeoline->setpointscount( numparts ) ;  

for( i = 0 ; i < numparts ; i++ )  

points.setpointcount( curpointcount ) ;  

//載入一條線段的座標

for( int iteratorpoint = 0 ; iteratorpoint < curpointcount ; iteratorpoint ++ )  

}  delete startofpart ;  

startofpart = 0 ;  

pfeature->setgeometry(pnewgeoline) ;  

this->loadattributedata(pfeature,fpdbf,everyrecordlen);  

pshpdataset->addrow(pfeature) ;  

}  break ;  

//讀取線目標結束

case 5: // '/005'

//讀取面目標開始

//處理單個目標有多面問題

pnewgeopolygon->setpointscount( numparts ) ;  

for( i = 0 ; i < numparts ; i++ )  

points.setpointcount( curpointcount ) ;  

//載入乙個面(多邊形)的座標

for( int iteratorpoint = 0 ; iteratorpoint < curpointcount ; iteratorpoint ++ )  

}  delete startofpart ;  

startofpart = 0 ;  

pfeature->setgeometry(pnewgeopolygon) ;  

this->loadattributedata(pfeature,fpdbf,everyrecordlen);  

pshpdataset->addrow(pfeature) ;  

}  break ;  

//讀取面目標結束

case 23: // '/027'

//讀取measure形線目標開始

//處理單個目標有多條線的問題

pnewgeoline->setpointscount( numparts ) ;  

for( i = 0 ; i < numparts ; i++ )  

points.setpointcount( curpointcount ) ;  

//載入一條線段的座標

for( int iteratorpoint = 0 ; iteratorpoint < curpointcount ; iteratorpoint ++ )  

}  delete startofpart ;  

startofpart = 0 ;  

double* value = new

double[2 + numpoints] ;  

fread( value , sizeof(double) , 2+numpoints, fpshp) ;  

delete value ;  

value = 0 ;  

pfeature->setgeometry(pnewgeoline) ;  

this->loadattributedata(pfeature,fpdbf,everyrecordlen);  

pshpdataset->addrow(pfeature);  

}  break ;  

//讀取measure形線目標結束

}  }  

return pshpdataset ;  

}  

關於C 解析shp檔案

最近在做專案時,要求可以上傳shp檔案到指定的地圖中,地圖開發使用的arcgisapi,網上找了好多解析shp檔案的js,但都不是太理想,直到群裡的小夥伴提到gdal 這裡需要注意,其中有乙個版本的的dll需要在bin資料夾中找到,連同csharp資料夾下的8個dll同時放到自己編譯專案的bin檔案...

C 載入Shp檔案到MapControl控制項

載入shp檔案到地圖控制項mapcontrol有一般有兩種方式。1 用mapcontrol控制項的addshapefile方法可載入shape格式檔案,呼叫該方法需要傳入兩個引數,分別是檔案路徑和不帶副檔名的檔名,其呼叫方法如下 axmapcontrol1.addshapefile pathname...

shp檔案及附屬

主檔案 shp 用於儲存要素幾何的主檔案,之前分享過該檔案的結構詳解 必需檔案。shx 用於儲存要素幾何索引的索引檔案 必需檔案。dbf 用於儲存要素屬性資訊的 dbase 表,主要記錄的是屬性資訊,可採用excel等開啟,相當於屬性表 必需檔案。幾何與屬性是一對一關係,這種關係基於記錄編號。dba...