1. 程式人生 > >用GDAL/OGR去讀shapefile

用GDAL/OGR去讀shapefile

一、讀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;
}



執行結果如下圖: