用GDAL/OGR去讀shapefile
阿新 • • 發佈:2019-01-28
一、讀shapefile
1、首先,用Arcgis建立所要讀的shp檔案。開啟ArcCatalog,右鍵NEW->Shapefile,名稱Name:point ,要素型別(Feature Type):Point。點選Edit,選擇投影型別。
2、開啟ArcMap. 單擊工具欄裡的Add data按鈕,開啟剛才建立的point.shp檔案。
3、新增5個點要素,並新增欄位(新增欄位要在非編輯模式下,修改欄位的值要在編輯模式下,記得退出編輯時要儲存),如圖所示:
編輯如下C++/GDAL程式碼:
#include "ogrsf_frmts.h" int main() { OGRRegisterAll(); OGRDataSource *poDS; poDS = OGRSFDriverRegistrar::Open( "G:\\LJF\\point.shp", FALSE );//shape檔案存放的路徑(point.shp即為自己建立的檔案) if( poDS == NULL ) { printf( "Open failed.\n%s" ); exit( 1 ); } OGRLayer *poLayer; poLayer = poDS->GetLayerByName( "point" ); OGRFeature *poFeature; poLayer->ResetReading(); while( (poFeature = poLayer->GetNextFeature()) != NULL )//獲得要素,本例項指的是五個點,所以會迴圈5次 { OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn(); int iField; int i=poFDefn->GetFieldCount(); //獲得欄位的數目,本例項返回5,不包括前兩個欄位(FID,Shape),這兩個欄位在arcgis裡也不能被修改; for( iField = 0; iField < poFDefn->GetFieldCount(); iField++ ) { OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn( iField ); //根據欄位值得型別,選擇對應的輸出 if( poFieldDefn->GetType() == OFTInteger ) printf( "%d,", poFeature->GetFieldAsInteger( iField ) ); else if( poFieldDefn->GetType() == OFTReal ) printf( "%.3f,", poFeature->GetFieldAsDouble(iField) ); else if( poFieldDefn->GetType() == OFTString ) printf( "%s,", poFeature->GetFieldAsString(iField) ); else printf( "%s,", poFeature->GetFieldAsString(iField) ); } OGRGeometry *poGeometry; poGeometry = poFeature->GetGeometryRef(); if( poGeometry != NULL && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint ) { OGRPoint *poPoint = (OGRPoint *) poGeometry; printf( "%.3f,%3.f\n", poPoint->getX(), poPoint->getY() ); } else { printf( "no point geometry\n" ); } OGRFeature::DestroyFeature( poFeature ); } OGRDataSource::DestroyDataSource( poDS ); system("pause"); return 0; }
執行結果如下圖: