GDAL讀取shp檔案VS2015+GDAL2.1
阿新 • • 發佈:2019-02-17
因為專案需要,我們想從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; }
只上了大概的程式碼,後面的功能大學自己拓展吧!