GDAL读取shp文件VS2015+GDAL2.1

来源:互联网 发布:金工网络课程 编辑:程序博客网 时间:2024/06/01 22:22

因为项目需要,我们想从SHP文件中,读取给定的某个区域内的所有建筑物信息。

本来想用QGIS来实现,但是很不巧,我们的一个服务器和我的工作电脑先后驾崩,没有QGIS的环境了。

所以我想用别的办法解决,然后想到了GDAL开源库,前面我已经写了一篇关于GDAL的编译方法了,再在正好派上用场。

一、编译GDAL

编译方法我就不说了,请查看我的博客。

http://blog.csdn.net/octdream/article/details/71106474

二、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));elseprintf("%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;}

只上了大概的代码,后面的功能大学自己拓展吧!