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...