1. 程式人生 > >GDAL讀取shp檔案VS2015+GDAL2.1

GDAL讀取shp檔案VS2015+GDAL2.1

因為專案需要,我們想從SHP檔案中,讀取給定的某個區域內的所有建築物資訊。

本來想用QGIS來實現,但是很不巧,我們的一個伺服器和我的工作電腦先後駕崩,沒有QGIS的環境了。

所以我想用別的辦法解決,然後想到了GDAL開源庫,前面我已經寫了一篇關於GDAL的編譯方法了,再在正好派上用場。

一、編譯GDAL

編譯方法我就不說了,請檢視我的部落格。

二、GDAL環境配置

我使用的是VS2015開發環境

1.配置附加包含目錄

右擊專案->屬性->配置屬性->C/C++->常規->附加包含目錄


2.配置附加庫目錄

右擊專案->屬性->配置屬性->連結器->常規->附加

目錄


3.新增附加依賴項

右擊專案->屬性->配置屬性->連結器->輸入->附加依賴項


三、使用GDAL讀取shp檔案資料

在網上找了很多種版本,但是有的編譯通不過,要不就是開啟檔案出錯,後面總結出方法,不多說了直接上程式碼:

#include "ogrsf_frmts.h"
#include <iostream>
#include <list>
using namespace std;

int main()
{
	GDALAllRegister();
	//OGRRegisterAll();

	GDALDataset       *poDS;
	//poDS = (GDALDataset*)GDALOpenEx("E:\\Qt\\maps\\cs_map\\school_point.shp", GDAL_OF_VECTOR, NULL, NULL, NULL);
	poDS = (GDALDataset*)GDALOpenEx("E:\\Qt\\maps\\bj_map\\Building_surface.shp", GDAL_OF_VECTOR, NULL, NULL, NULL);

	if (poDS == NULL)
	{
		printf("Open failed.\n");
		exit(1);
	}
	OGRLayer  *poLayer;
	poLayer = poDS->GetLayerByName("Building_surface");

	OGRFeature *poFeature;
	poLayer->ResetReading();
	while ((poFeature = poLayer->GetNextFeature()) != NULL)
	{
		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)
		{
			OGRwkbGeometryType pGeoType = poGeometry->getGeometryType();
			if (pGeoType == wkbPoint)
			{
				OGRPoint *poPoint = (OGRPoint *)poGeometry;

				printf("%.3f,%.3f\n", poPoint->getX(), poPoint->getY());
			}
			else if (pGeoType == wkbPolygon)
			{
				OGRPolygon *pPolygon = (OGRPolygon*)poGeometry->clone();
				OGRLinearRing * poLR = pPolygon->getExteriorRing();
				//int Num = poLR->getNumPoints()

			}
			else if (pGeoType == wkbMultiPolygon)  //這裡就是帶空洞多邊形判斷
			{
				OGRMultiPolygon *pMulPolygon = (OGRMultiPolygon*)poGeometry;
				OGRPolygon *pPolygon = NULL;
				for (int i = 0; i < pMulPolygon->getNumGeometries(); i++)
				{
					pPolygon = (OGRPolygon*)pMulPolygon->getGeometryRef(i);
				}
			}
			else
			{
				printf("no point geometry\n");
			}
		
		}
		
		OGRFeature::DestroyFeature(poFeature);
	}

	//system("pause");
	getchar();
    return 0;
}

只上了大概的程式碼,後面的功能大學自己拓展吧!