因为项目需要,我们想从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));
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;
}
只上了大概的代码,后面的功能大学自己拓展吧!